使用ST官方固件做IAP主要要注意的问题是块操作,和64K以上地址访问;
1、使能块操作在RAM中运行,打开宏定义“#define RAM_EXECUTION (1) ”;同时这里需要注意的是块操作数据源也必须在RAM中,如果不是,则先拷贝到RAM中再执行;
2、在库的FLASH操作函数中有如下代码:
*((PointerAttr uint8_t*) (uint16_t)startaddress + Count) = ((uint8_t)(Buffer[Count]));
这里(uint16_t)这个强制转换存在问题,因为如果地址值超过了64K,则16位无法表示;做如下修改:
*((PointerAttr uint8_t*) (uint32_t)startaddress + Count) = ((uint8_t)(Buffer[Count]));
我做IAP遇到就是这两个问题,记录下来,希望能对大家有所帮助。 |