[MM32软件] MM32F002使用内部flash存储数据怎么操作?

[复制链接]
 楼主| GGbb123 发表于 2023-6-16 10:43 | 显示全部楼层 |阅读模式
本帖最后由 GGbb123 于 2023-6-16 10:51 编辑

#技术资源# #21ic问答# 62267648bca1ec6bc0.png 93298648bca3faecad.png
// 从EEPROM中读取上一组写入的数据的函数s32 EEPROM_Read(u8* ptr, u16 len);
// 将数据写入EEPROM中的函数
s32 EEPROM_Write(u8* ptr, u16 len);



我是直接用MM32F002的例程,为什么使用这两行代码存储set_wendu这个全局变量存储不了。


试过改EEPROM_Write,EEPROM_Read这两个函数的在代码行中的先后顺序,FLASH的保存地址操作但还是不行。


总的代码量在25KB,MM32F002flash空间为32KB。
  1. #include "hal_conf.h"
  2. #include <string.h>
  3. #include "flash.h"


  4. #define M8(adr)  (*((vu8  *) (adr)))
  5. #define M16(adr) (*((vu16 *) (adr)))


  6. #define BASED_FLASH_SECTOR_ADDRESS    (0x08000000+30*1024+4)

  7. // 擦除指定FLASH页的函数
  8. static void FLASH_SIM_EraseEE(u32 pageAddress)
  9. {
  10.     FLASH_Unlock();
  11.     FLASH_ErasePage(pageAddress);
  12.     FLASH_Lock();
  13. }

  14. // 在指定地址处编程缓冲区的函数
  15. static void FLASH_SIM_ProgramEE(u16* buf, u32 addr, u16 len)
  16. {
  17.     u16 i;
  18.     FLASH_Unlock();
  19.     for ( i = 0; i < len / 2; i++) {
  20.         FLASH_ProgramHalfWord(addr, *buf);
  21.         addr += 2;
  22.         buf++;
  23.     }
  24.     FLASH_Lock();
  25. }

  26. static u8 FLASH_SIM_FindEmpty(u32 ptr, u16 len)
  27. {
  28.     u16 i, readdata;
  29.     u8  ret = 1;
  30.     for (i = 0; i < (len / 2); i++) {
  31.         readdata = M16(ptr + i * 2);
  32.         if ( readdata != 0xffff) {
  33.             ret = 0;
  34.             break;
  35.         }
  36.     }
  37.     return ret;
  38. }

  39. // 确定指定地址上可写入数据的区域的函数
  40. u32 FLASH_SIM_WriteLocate(u32 pageAddress, u16 len)
  41. {
  42.     u16 i;
  43.     u32 ptr = pageAddress;
  44.     if( (pageAddress % 2 ) != 0) {
  45.         while(1);
  46.     }
  47.     if((0x800 % len) != 0)
  48.         while(1);

  49.     for (i = 0; i < (0x0800 / len); i++) {
  50.         ptr = (pageAddress + i * len);
  51.         if (FLASH_SIM_FindEmpty(ptr, len) == 1) {
  52.             break;
  53.         }
  54.     }
  55.     if(i == (0x0800 / len))
  56.         ptr = 0;
  57.     return ptr;
  58. }

  59. // 在指定地址处写入缓冲区的函数
  60. static void FLASH_SIM_WriteEE(u16* buf, u32 pageAddress, u16 len)
  61. {
  62.     u32 ptr = FLASH_SIM_WriteLocate(pageAddress, len);
  63.     if (ptr == 0) {
  64.         FLASH_SIM_EraseEE(pageAddress + 0x000);
  65.         FLASH_SIM_EraseEE(pageAddress + 0x400);
  66.         FLASH_SIM_ProgramEE(buf, pageAddress, len);
  67.     }
  68.     else {
  69.         if (ptr == (pageAddress + 0x0400 - len)) {
  70.             FLASH_SIM_EraseEE(pageAddress + 0x400);
  71.             FLASH_SIM_ProgramEE(buf, (u32)ptr, len);
  72.         }
  73.         else if (ptr == (pageAddress + 0x0800 - len)) {
  74.             FLASH_SIM_EraseEE(pageAddress + 0x000);
  75.             FLASH_SIM_ProgramEE(buf, (u32)ptr, len);
  76.         }
  77.         else {
  78.             FLASH_SIM_ProgramEE(buf, (u32)ptr, len);
  79.         }
  80.     }
  81. }

  82. // 初始化EEPROM的函数
  83. void FLASH_SIM_EEPROM_Init(void)
  84. {
  85.     FLASH_SIM_EraseEE((u32)(BASED_FLASH_SECTOR_ADDRESS) + 0x0000);
  86.     FLASH_SIM_EraseEE((u32)(BASED_FLASH_SECTOR_ADDRESS) + 0x0400);
  87. }

  88. // 从EEPROM中读取上一组写入的数据的函数
  89. s32 EEPROM_Read(u8* ptr, u16 len)
  90. {
  91.     u32 pAddr;
  92.     pAddr = FLASH_SIM_WriteLocate((u32)BASED_FLASH_SECTOR_ADDRESS, len);

  93.     if (pAddr == 0) {
  94.         return  -1;
  95.     }
  96.     else if (pAddr == BASED_FLASH_SECTOR_ADDRESS) {
  97.         pAddr = (BASED_FLASH_SECTOR_ADDRESS + 0x0800 - len);
  98.     }
  99.     else {
  100.         pAddr -= len;
  101.     }
  102.     memcpy(ptr, (s8*)pAddr, len);

  103.     return len;
  104. }

  105. // 将数据写入EEPROM中的函数
  106. s32 EEPROM_Write(u8* ptr, u16 len)
  107. {

  108.     FLASH_SIM_WriteEE((u16*)ptr, (u32)(BASED_FLASH_SECTOR_ADDRESS), len);
  109.     return len;
  110. }






您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝
快速回复 返回顶部 返回列表