本帖最后由 LinY 于 2024-12-19 13:32 编辑
逻辑:
Flash分为bootloader+app1+app2
要更新时,app2成功写入后,将app1的最后2个字节改成0xAABB,然后重启
重启判断app1的最后第8个字节如果是0xAABB,就将app2拷贝到app1,并启动app1
现在是修改app1最后第8个字节写0xAABB的时候有时候不知道为什么会和实际写入值不一致,有时候又是正常的。
也打过断点,写之前是0xFFFF,写之后有时候会变成0xA1B1这样的
[C] 纯文本查看 复制代码
// 写Flash的部分代码
// 标志下次重启要从app2进行升级
uint16_t Startup_Update = 0xAABB;
uint16_t update_flag = Startup_Update;
WriteFlash((Application_1_Addr + Application_Size - 8), (uint8_t *)&update_flag, 2);
[C] 纯文本查看 复制代码
/** @bieaf 写若干个数据
* @param addr 写入的地址
* @param buff 写入数据的起始地址
* @param word_size 长度
* @return none 返回值
*/
void WriteFlash(uint32_t addr, uint8_t * buff, int buf_len)
{
int i = 0;
//清除标志位,经测试 必要!!!
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_BSY | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR | FLASH_FLAG_EOP | FLASH_FLAG_OPTVERR);
/* 解锁FLASH */
HAL_FLASH_Unlock();
/* 对FLASH烧写 */
for(i= 0; i < buf_len; i += 2)
{
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, addr + i, *(uint16_t*)(buff + i));
}
/* 上锁FLASH */
HAL_FLASH_Lock();
}
|