关于STM32的flash读写数据和HardFault_Handler的问题

今天调试程序的时候需要把掉电前的数据存储到flash中之后等待下次初始化的时候把数据读进来。

刚刚开始的时候去找了一些stm32的flash的操作,真的是废话连篇的真正能用到的没几句话,这里我把自己调试好的flash读写数据的子函数跟大家分享一下。

void FLASH_WriteByte(u32 addr ,u16 flashdata1)
{
 FLASH_Status FLASHstatus = FLASH_COMPLETE;
 FLASH_Unlock();//解锁
 FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR |  FLASH_FLAG_WRPRTERR);
 FLASHstatus=FLASH_ErasePage(addr);//擦除整页
 FLASHstatus=FLASH_ProgramHalfWord(addr, flashdata1);//写入数据
 FLASH_Lock();//锁定
}

这个子函数就是将数据flashdata1写到地址addr中去。数据的长度是可变的。

当需要读入数据的时候可以直接访问地址,如:rdata=*(u16 *)0x08014000;   //读flash中默认数据

0x08014000是存储的地址。

这样大家应该很清楚了吧。flash读写数据还是比较简单的,这里希望能帮到大家。

但是在写入数据的时候,又遇到了另一个问题,就是程序运行的时候进入到这个HardFault_Handler函数中死循环了,不知道大家有没有遇到过这个问题,后来我查了一些资料,发现可能是存储器的分配有问题。然后把地址改到更大的地方,又试了试,发现已经可以了。建议大家这样试一试。

下面是我找的关于

防止误擦除有用程序代码的方法

方法一:首先要计算程序代码有多少,把FLASH存取地址设置在程序代码以外的地方,这样就不会破坏用户程序。原则上从0x0800 0000 + 0x1000 以后的FLASH空间都可以作为存储使用。如果代码量占了 0x3000, 那么存储在 0x0800 0000+ 0x4000 以后的空间就不会破坏程序了。

方法二:先在程序中定义一个const 类型的常量数组,并指定其存储位置(方便找到写入、读取位置),这样编译器就会分配你指定的空间将常量数组存入FLASH中。当你做擦除。读写操作时,只要在这个常量数组所在的地址范围就好。

  const uint8_t table[10] __at(0x08010000) = {0x55} ;
  MDK3.03A开始就支持关键字 __at() 。
  需要加#include

方法三:在程序中定义一个const 类型的常量数组,无需指定其存储位置。只要定义一个32位的变量存储这个数组的FLASH区地址就行。

  uint32_t address;//STM32的地址是32位的
  const uint8_t imageBuffer[1024] = {0,1,2,3,4,5,6,7};
  address = (uint32_t) imageBuffer;

方法四:利用写保护的方式(没研究明白)

永不止步步 发表于11-11 14:37 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67417个|学分:363791个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号