1. 单片机FLASH的基本操作
为了用单片机的Flash存储数据或者实现IAP功能,通常离不开Flash的读写操作,对于读操作来说,是相当的简单,想怎么读怎么读,但写Flash之前,需要多一步擦除操作,这也不是难事,大部分芯片都给我们提供了库函数及例程,拿过来使用就行,但在写FLASH时通常会遇到一个问题,我们继续往下看。
2. Flash写操作函数的封装
对于写操作函数,其原型通常是uint8_t Flash_Write(uint32_t Address,const uint8_t *pData,uint32_t Len),其中Address表示要写入的地址,pData指向要写入的数据,Len表示要写入的数据长度(以字节为单位),返回值表示写入结果。我们看一下原函数:
在STM32F10X系列芯片上可以完美执行,但是在MM32单片机上时,你会发现频繁进入HardFault中断,一旦进入硬件错误中断,你的脑子里就会翁翁的响,似乎感觉完蛋了。
不过,这不是在做项目,所以我没有慌,我在HardFault中断里打上了断点,在进入该中断后查看了堆栈的调用情况,发现在调用该函数时出现了问题,经过我的观察,pData指向的地址是一个奇数,顿时明白了原因,于是,为了通用性,我把函数做了优化。请看:
经过这样的优化后,再也没进入HardFault中断,如果你在项目开发的过程中遇到同样的问题,又搜索到了我的文章,那么恭喜你,问题终结了。
3. M0内核单片机的IAP问题
在Coretext-M3内核中,给我们提供了中断向量表偏移量寄存器SCB_VTOR,你可以把中断向量表放在Flash的任意位置,然后将位置偏移值给到SCB_VTOR寄存器就行,但在M0内核芯片中就不行了,M0内核的单片机没有该寄存器,通常的做法是把中断向量表拷到RAM中执行,一般做法如下(重点需要的是main函数中的前3行,同时要修改魔术棒IARM地址分配):
|