当前位置:   article > 正文

stm32 片上flash用作EEPROM(掉电保存)(绝对可用)_flash 代替eeprom

flash 代替eeprom

 一、源码:

  1. #if !defined  (_FLASH_H)
  2. #define _FLASH_H
  3. #define FLASH_ADR 0x08010000  //要写入数据的地址
  4. #define u8 INT8U
  5. #define u16 INT16U
  6. #define u32 INT32U
  7. union union_temp16
  8. {
  9.     unsigned int un_temp16;
  10.     unsigned char  un_temp8[2];  // example 16: 0x0102  8:[0]2 [1]1
  11. }my_unTemp16;
  12. typedef struct 
  13. {
  14.  u8 apn[20];
  15.  u8 useName[20];
  16.  u8 password[20];
  17.  u8 serverIP[16];
  18.  u8 port[6];
  19.  u8 useCall[3][15];
  20. }configStruct;
  21. configStruct myConf =
  22. {
  23.  "cmnet",
  24.  "\0",
  25.  "\0",
  26.  "201.2.2.2",
  27.  "9002",
  28.  {
  29.   "test123","\0","\0"
  30.  }
  31. };
  32. /******************************************************
  33. flash 字符串写入
  34. 每次存入两个字节
  35. *******************************************************/
  36. void FlashWriteStr( u32 flash_add, u16 len, u16* data )
  37. {
  38.  //char cp[12];
  39.  //u8 s = 0;
  40.  u16 byteN = 0;
  41.  FLASH_Unlock();
  42.  FLASH_ErasePage(flash_add);
  43.  //sprintf( cp, "len:%d", len);
  44.  //USART1_Puts(cp);
  45.  while( len )
  46.  {
  47.   
  48.   my_unTemp16.un_temp8[0] = *(data+byteN);
  49.   my_unTemp16.un_temp8[1] = *(data+byteN+1);  
  50.   FLASH_ProgramHalfWord( flash_add+byteN , my_unTemp16.un_temp16 );
  51.   //sprintf( cp, "bye:%d\r\n", s);
  52.   //USART1_Puts(cp);
  53.   if( 1==len )
  54.   {
  55.    //如果数据长度是奇数,为1的时候跳出
  56.    break;               
  57.   }
  58.   else
  59.   {
  60.    byteN += 2;
  61.    len -= 2;
  62.   } 
  63.  }
  64.  FLASH_Lock();
  65. }
  66. /******************************************************
  67. flash 字符串读出到指定data中 
  68. 地址与写入data地址同 读出的保存类型也必须一致
  69. *******************************************************/
  70. void FlashReadStr( u32 flash_add, u16 len, u16* data )
  71. {
  72.  u16 byteN = 0;
  73.  while( len )
  74.  {
  75.   my_unTemp16.un_temp16 = *(vu16*)(flash_add+byteN);
  76.   if( 1==len )
  77.   {
  78.    *(data+byteN) = my_unTemp16.un_temp8[0];
  79.    break;     
  80.   }
  81.   else
  82.   {  
  83.    *(data+byteN) = my_unTemp16.un_temp8[0];
  84.    *(data+byteN+1) = my_unTemp16.un_temp8[1];
  85.    byteN += 2;
  86.    len -= 2;
  87.   }
  88.  }
  89. }
  90. #endif

二、调用方法:

  1. INT16U data[2]={0x3234,0x3533};
  2.   
  3. FlashWriteStr(FLASH_ADR,2,&data[0]);//写入两个16位数据
  4. FlashReadStr(FLASH_ADR,2,&data[0]);//读取两个16位数据

爱极客官方论坛,期待与你一起改变世界!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/64016?site
推荐阅读
相关标签
  

闽ICP备14008679号