stm32f103c8t6的 FLASH读写   

STM32F103C8TT6     FLASH=64K

少废话,上代码:

#define   PAGE_ADDR     (0x08000000+63*1024+100)		//必须偶数<64K

unsigned char 	IP_V4[7];			//IP地址及端口号IP_V4[0].IP_V4[1].IP_V4[2].IP_V4[3] : IP_V4[4]IP_V4[5]
unsigned char 	T_tiao;				//心跳周期,单位分钟   
unsigned char 	add_data[6]={0x00};	//add_data[5][4][3][2][1][0] 集中器地址




void  STMFLASH_Unlock(void)
	{
		FLASH->KEYR=0x45670123;
		FLASH->KEYR=0xCDEF89AB;	
	}

void   STMFLASH_Lock(void)
	{
		FLASH->CR|=(1<<7);
	}

unsigned char STMFLASH_ReadHalfWord(unsigned int faddr)
	{
		return  *(vu8 *)faddr;		//半字读出,16位=双字节
	}


void  STMFLASH_Read(unsigned int readaddr,unsigned char *pbuffer,unsigned short numtoread)
	{
	unsigned  short i;
	for(i=0;i<numtoread;i++)
		{
		pbuffer[i]=STMFLASH_ReadHalfWord(readaddr);		//半字读出,16位=双字节
		readaddr+=2;	
		}
	}
	
unsigned char STMFLASH_GetStatus(void)
	{
		unsigned int res;
		res=FLASH->SR;
		if(res&(1<<0))		return 1;		//BUSY=1
		return 0;							//BUSY=0
	}
	
unsigned char STMFLASH_WaitDone(unsigned short time)	//等待操作完成, time=等待时间
	{
	unsigned char res;
		u8	t;
		do
		{
			res=STMFLASH_GetStatus();		//查忙位
			if(res==0)  break;
			for(t=255;t>0;t--);
				time--;
		}while(time);	
		if(time==0)  res=0xff;
		return  res;
	}
	
unsigned char STMFLASH_EreasePage(unsigned int PADDR)	//察除页, PADDR=页地址
	{
		unsigned char  res=0;
		while((FLASH->CR&(1<<7))!=0);
		res=STMFLASH_WaitDone(0x5fff);
		if(res==0)						//EEPROM不忙
			{
			FLASH->CR|=1<<1;
			FLASH->AR|=PADDR;				//待擦除的页
			FLASH->CR|=1<<6;				//开始察除操作
			res=STMFLASH_WaitDone(0x5fff);	
			if(res==0)	FLASH->CR&=~(1<<1);	//停止擦除
			}		
		return	res;
	}
	
//faddr=待写入地址    dat=待写入数据16位=双字节
unsigned char STMFLASH_WriteHalfWord(unsigned int faddr,unsigned short dat)
	{
	unsigned char res;
		while((FLASH->CR&(1<<7))!=0);
		res=STMFLASH_WaitDone(0xff);
	if(res==0)
		{
		FLASH->CR|=1<<0;		//PG=1 写FLASH
		*(vu16 *)faddr=dat;	
			res=STMFLASH_WaitDone(0xff);
		if(res==0) FLASH->CR&=~(1<<0);	//	
		}	
	return  res;	
	}
	
	
//半字写入,双字节
void  STMFLASH_Write(unsigned char a,unsigned char b,unsigned char c,unsigned char d,unsigned char e,unsigned char f,unsigned char g,
	unsigned char h,unsigned char j,unsigned char k,unsigned char l)
	{
		unsigned short add[6];
		add[0]=b*256+a;
		add[1]=d*256+c;	//ip
		add[2]=e*256+f;
		add[3]=g*256+h;	//add
		add[4]=j*256+k;
		add[5]=l;		//心跳周期
		__ASM("CPSID  I");   			//关总中断
		STMFLASH_Unlock();
		STMFLASH_EreasePage(PAGE_ADDR);	//察除页, PADDR=页地址
		STMFLASH_WriteHalfWord(PAGE_ADDR+0,add[0]);
		STMFLASH_WriteHalfWord(PAGE_ADDR+2,add[1]);		//半字写入,16位=双字节
		STMFLASH_WriteHalfWord(PAGE_ADDR+4,add[2]);
		STMFLASH_WriteHalfWord(PAGE_ADDR+6,add[3]);
		STMFLASH_WriteHalfWord(PAGE_ADDR+8,add[4]);		//半字写入,16位=双字节
		STMFLASH_WriteHalfWord(PAGE_ADDR+10,add[5]);
		STMFLASH_Lock();
		__ASM("CPSIE  I");   			//开总中断  
	}
	
void  STMFLASH_read_ip_add()
	{
	IP_V4[0]=STMFLASH_ReadHalfWord(PAGE_ADDR+0);
	IP_V4[1]=STMFLASH_ReadHalfWord(PAGE_ADDR+1);		//半字读出,16位=双字节
	IP_V4[2]=STMFLASH_ReadHalfWord(PAGE_ADDR+2);
	IP_V4[3]=STMFLASH_ReadHalfWord(PAGE_ADDR+3);		//ip
	IP_V4[4]=STMFLASH_ReadHalfWord(PAGE_ADDR+5);
	IP_V4[5]=STMFLASH_ReadHalfWord(PAGE_ADDR+4);
	IP_V4[6]=0x00;
		
	add_data[5]=STMFLASH_ReadHalfWord(PAGE_ADDR+7);
	add_data[4]=STMFLASH_ReadHalfWord(PAGE_ADDR+6);		//半字读出,16位=双字节
	add_data[3]=STMFLASH_ReadHalfWord(PAGE_ADDR+9);		//add
	add_data[2]=STMFLASH_ReadHalfWord(PAGE_ADDR+8);		
	add_data[1]=0x00;
	add_data[0]=0x00;
	T_tiao=STMFLASH_ReadHalfWord(PAGE_ADDR+10);		//心跳周期	
	}
	
///////////////////////////////////////////////////	
//设置IP地址	
//设置集中器地址	
//STMFLASH_Write(IP_V4[0],IP_V4[1],IP_V4[2],IP_V4[3],IP_V4[4],IP_V4[5],add_data[5],add_data[4],add_data[3],add_data[2],T_tiao);			

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐