硬汉嵌入式论坛

 找回密码
 立即注册
查看: 982|回复: 6
收起左侧

[技术讨论] STM32F103写Flash值和实际值不符

[复制链接]

34

主题

206

回帖

308

积分

高级会员

积分
308
发表于 2024-12-19 11:06:23 | 显示全部楼层 |阅读模式
本帖最后由 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();
}


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-12-19 13:09:52 | 显示全部楼层
最后两个字节,为什么这里是-8

WriteFlash((Application_1_Addr + Application_Size - 8), (uint8_t *)&update_flag, 2);
回复

使用道具 举报

34

主题

206

回帖

308

积分

高级会员

积分
308
 楼主| 发表于 2024-12-19 13:31:56 | 显示全部楼层
eric2013 发表于 2024-12-19 13:09
最后两个字节,为什么这里是-8

WriteFlash((Application_1_Addr + Application_Size - 8), (uint8_t *)& ...

写错了 最早是-2最后2个字节,后来为了对齐我改成-8了
回复

使用道具 举报

3

主题

10

回帖

19

积分

新手上路

积分
19
发表于 2024-12-19 13:53:21 | 显示全部楼层
没有遇到过写入和实际不一样,不过为什么要用最后几个字节作为标志呢,反正写的时候都要擦除扇区吧,直接用扇区开始地址也可以撒,要不试试加个写入成功判定,读取不到0xAABB就多写几次就有点治标不治本
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-12-20 09:03:31 | 显示全部楼层
LinY 发表于 2024-12-19 13:31
写错了 最早是-2最后2个字节,后来为了对齐我改成-8了

那有可能是函数实现有点问题,写之前,确定这个位置是0xFFFF吧
回复

使用道具 举报

2

主题

8

回帖

14

积分

新手上路

积分
14
发表于 2024-12-20 09:09:18 | 显示全部楼层
没见过这么写flash的,正经人都是从页或扇区的起始地址写入,你这是倒着写
回复

使用道具 举报

25

主题

232

回帖

307

积分

高级会员

积分
307
QQ
发表于 2024-12-20 13:37:36 | 显示全部楼层
你这个 (Application_1_Addr + Application_Size - 8), 算对齐吗?
8 个字节,2 个字,感觉有点奇怪。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 06:05 , Processed in 0.041711 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表