stm32篇--内置flash

stm32自带内置flash,我对内置flash研究不多,曾试过隔2k内还是一块,不明原因。
stm32的FLASH分为主存储块和信息块。主存储块用于保存具体的程序代码和用户数据,信息块用于负责由stm32出厂是放置2KB的启动程序(Bootloader)和512B的用户配置信息区。
主存储块是以页为单位划分的,一页大小为1KB。范围为从地址0x08000000开始的128KB内。
对Flash 的写入操作要 “先擦除后写入”的原则;
stm32的内置flash 编程操作都是以页为单位写入的,而写入的操作必须要以16位半字宽度数据位单位,允许跨页写,写入非16位数据时将导致stm32内部总线错误。
进行内置flash读写时,必须要打开内部Rc振荡器。
下面是我用到的网络上的一个例子,改一下就可以用了:
#define FLASH_ADR 0x08008000  //要写入数据的地址

union union_temp16
{
    unsigned int un_temp16;
    unsigned char  un_temp8[2];  // example 16: 0x0102  8:[0]2 [1]1
}my_unTemp16;

configStruct myConf =
{
 "cmnet",
 "\0",
 "\0",
 "201.2.2.2",
 "9002",
 {
  "test123","\0","\0"
 }
};


/******************************************************
flash 字符串写入
每次存入两个字节
*******************************************************/
void FlashWriteStr( u32 flash_add, u16 len, u8* data )
{
 //char cp[12];
 //u8 s = 0;
 u16 byteN = 0;
 FLASH_Unlock();
 FLASH_ErasePage(flash_add);
 //sprintf( cp, "len:%d", len);
 //USART1_Puts(cp);
 while( len )
 {
  
  my_unTemp16.un_temp8[0] = *(data+byteN);
  my_unTemp16.un_temp8[1] = *(data+byteN+1);  
  FLASH_ProgramHalfWord( flash_add+byteN , my_unTemp16.un_temp16 );

  //sprintf( cp, "bye:%d\r\n", s);
  //USART1_Puts(cp);
  if( 1==len )
  {
   //如果数据长度是奇数,为1的时候跳出
   break;               
  }
  else
  {
   byteN += 2;
   len -= 2;
  } 
 }
 FLASH_Lock();
}

/******************************************************
flash 字符串读出到指定data中 
地址与写入data地址同 读出的保存类型也必须一致
*******************************************************/
void FlashReadStr( u32 flash_add, u16 len, u8* data )
{
 u16 byteN = 0;
 while( len )
 {
  my_unTemp16.un_temp16 = *(vu16*)(flash_add+byteN);
  if( 1==len )
  {
   *(data+byteN) = my_unTemp16.un_temp8[0];
   break;     
  }
  else
  {  
   *(data+byteN) = my_unTemp16.un_temp8[0];
   *(data+byteN+1) = my_unTemp16.un_temp8[1];
   byteN += 2;
   len -= 2;
  }
 }
}

void FlashInit(void)
{
 u32 tmp=*(vu32*)(FLASH_ADR);
 if(tmp==0xffffffff)
 {
  FlashWriteStr(FLASH_ADR, sizeof(myConf), (u8*)&myConf);
 }
 else
 {
  FlashReadStr(FLASH_ADR, sizeof(myConf), (u8*)&myConf); 
 }
}

你可能感兴趣的:(单片机编程)