stm32f103c8t6的 FLASH读写
·
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);
更多推荐
所有评论(0)