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

来源:本站
导读:目前正在解读《关于STM32的flash读写数据和HardFault_Handler的问题》的相关信息,《关于STM32的flash读写数据和HardFault_Handler的问题》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《关于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;

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

提醒:《关于STM32的flash读写数据和HardFault_Handler的问题》最后刷新时间 2024-03-14 01:09:41,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《关于STM32的flash读写数据和HardFault_Handler的问题》该内容的真实性请自行鉴别。