泡坛好久了,没发过主题,来一发.
RT,memcpy不知道这里用的多不多.刚看到有帖子说FLASH模拟EEPROM,然后说原子的程序怎么怎么,我就翻了一下,没发现有什么不好.
只是个人喜欢把接口标准化,如果像memcpy那样,只需要提供目标地址,源地址,拷贝长度,不需要管地址是否在代码区,不需要管地址是否对齐,不需要管长度是否符合什么规格,那就最好了.
昨晚写的,今天凌晨调通.下午差点连人带电脑变肉夹馍了,晚上来贴代码孝敬各路大神.
RT,这个代码可以直接指定任意FLASH地址填写,比如我定义了个const int8 pExample[5]={1,2,3,4,5},我不用管这个a是否对其到页地址首位,不担心擦写会不会把前后的数据刷掉,直接
STM32F10x_IAP(pExample, 源数据指针, 长度)
就完成FLASH写入,不必专门制定位置作为EEPROM的模拟区域.随便找个常量写就是了.
当然,如果自己给的长度超了,那肯定会覆盖后面的数据.
如果这个代码加载到RAM,甚至可以实现刷写整个FLASH区,比如我的测试代码如下,开机自捅2刀,再执行下面的代码.芯片是C8T6,128kB FLASH.
//目标代码长度约40kB
//IAP代码需要分散加载到RAM,否则自己擦除了自己的代码区后就没有代码执行了.
int main(void)
{
STM32F10x_IAP((int8*)0x08010000, (int8*)0x08000000, 0x10000);//把目标代码从FLASH前面搬到后面,搬运长度64kB.
STM32F10x_IAP((int8*)0x08000000, (int8*)0x08010000, 0x10000);//把目标代码从FLASH后面搬回来.
...其他用户代码
}
这个测试的意图很明显.
谨此感谢各路神不杀之恩...
--编辑:增加煽动点的标题字眼.
|