你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

新手,想搞Flash 当eeprom用

[复制链接]
Huang0000 提问时间:2019-8-3 16:48 /
STM32新手,想搞Flash 当eeprom用,调试调到头疼,可以存取数据,但就是值不对
收藏 评论5 发布时间:2019-8-3 16:48

举报

5个回答
radio2radio 回答时间:2019-8-3 17:52:48
下面是我用过的,参考网上的,网上很多。

字符长度len要大于4,且是4的倍数,我是设成整个page,即512 bytes。没有速度要求。

如果要任意数len,就要小心处理。 一般没有必要。


  1. <p>#include "stm32f1xx_hal.h"
  2. #include "flash.h"


  3. #define FLASH_START_ADDRESS       0x0800F000

  4. //FLASH write a String, WORD=4 bytes, len = memory Len in byte, and len >=4        
  5. void vPutDataToFlash(char *data, uint32_t len)
  6. {
  7.   uint32_t i;
  8.   uint32_t address = FLASH_START_ADDRESS;
  9.   uint32_t u32Temp;
  10.   
  11.   HAL_FLASH_Unlock();

  12.   //initial FLASH_EraseInitTypeDef
  13.   FLASH_EraseInitTypeDef f;
  14.   f.TypeErase = FLASH_TYPEERASE_PAGES;
  15.   f.PageAddress = FLASH_START_ADDRESS;
  16.   f.NbPages = 1;
  17.   //set PageError
  18.   uint32_t PageError = 0;
  19.   //erase page
  20.   HAL_FLASHEx_Erase(&f, &PageError);
  21.   if (PageError == 0)
  22.   {
  23.     while (1); //error
  24.   }

  25.   //write to FLASH
  26.   for (i=0; i<(len/4); i++)
  27.   {
  28.     u32Temp = (uint32_t) (data[i*4]<<0) |
  29.               (uint32_t) (data[i*4+1]<<8) |
  30.               (uint32_t) (data[i*4+2]<<16) |
  31.               (uint32_t) (data[i*4+3]<<24);
  32.     HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address+(i*4), u32Temp);
  33.   }

  34.   HAL_FLASH_Lock();
  35. }


  36. void vGetDataFromFlash(char *data, uint32_t len)
  37. {
  38.   uint32_t i;
  39.   uint32_t u32Temp;
  40.   uint32_t address = FLASH_START_ADDRESS;
  41.   
  42.   for (i=0; i<len/4; i++)
  43.   {
  44.     u32Temp = *(__IO uint32_t*)(address+(i*4));
  45.    
  46.     data[i*4] = (uint8_t) (u32Temp>>0);
  47.     data[i*4+1] = (uint8_t) (u32Temp>>8);
  48.     data[i*4+2] = (uint8_t) (u32Temp>>16);
  49.     data[i*4+3] = (uint8_t) (u32Temp>>24);
  50.   }
  51. }
  52. </p>
复制代码


Huang0000 回答时间:2019-8-3 20:52:10
radio2radio 发表于 2019-8-3 17:52
我用过的,参考网上的,网上很多:
字符长度len要大于4,且是4的倍数,如果要任意数,就要小心处理。

太感谢了,我调试看看,我要存的是一个按键状态的计数值0-55
wenyangzeng 回答时间:2019-8-3 21:19:09
ST官方有现成的Flash仿真EEPROM例程可用:

EEPROM_Emulation.rar (9.6 KB, 下载次数: 9)
Huang0000 回答时间:2019-8-3 21:22:15
wenyangzeng 发表于 2019-8-3 21:19
ST官方有现成的Flash仿真EEPROM例程可用:

OK,谢谢,学习学习
ikxlf 回答时间:2019-8-4 13:27:12
你可以参考正点原子提供的例子,这个例子是现成的,而且百分百可以用的

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版