今天调试程序的时候需要把掉电前的数据存储到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;
方法四:利用写保护的方式(没研究明白)