找回密码
 立即注册
查看: 47|回复: 4

关于写自己的升级程序时碰到的一个问题!~

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:29
  • 最近打卡:2026-04-27 09:59:53

13

主题

79

回帖

367

积分

中级会员

积分
367
发表于 2026-4-22 17:11:29 | 显示全部楼层 |阅读模式
首先,官方的示例代码中使用的DFU保存在xdata中,如果升级程序到一半出错,下次启动就要按P33来启动到bootloader中了,但并不是所有产品都适合做按铵

那么在bootloader中,把状态写进EEPROM无疑是最佳的办法了。。。

也就是说单片机通电,启动到bootloader中,先读取EEPROM特定位置,状态字节为0xff,那么就启动到正常的程序中执行、

正常程序检测到上位机发来升级命令,先修改EEPROM特定位置,状态字节改为1,然后切换到bootloader中,等待上位机发送升级内容,

升级完成后,修改状态字节为0xff,重启,升级成功!即使升级到一半中断了,由于状态字节为1,下次启动还是会进入bootloader中,接着升级就好了。。。


但是问题就是,在bootloader 与 普通程序中,如何写addr的地址,才能保证两块程序都能定位到同一个扇区的相同位置的EEPROM呢???

回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:671
  • 最近打卡:2026-04-30 08:59:31
已绑定手机

52

主题

2608

回帖

9093

积分

论坛元老

积分
9093
发表于 2026-4-22 18:58:59 | 显示全部楼层
在bootloader 与 普通程序中,操作EEPROM的地址是相同的,可设置地址在程序空间后面。
例如普通程序空间60K,前面50K存放程序,最后10K作为EEPROM存储数据。
那么EEPROM起始地址为:1024*50 = 0xC800

点评

问题就是两套程序的EEPROM是对不上的。我使用的STC32G144K246,搞了2天了,一头雾水  发表于 2026-4-23 08:43
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:671
  • 最近打卡:2026-04-30 08:59:31
已绑定手机

52

主题

2608

回帖

9093

积分

论坛元老

积分
9093
发表于 2026-4-23 09:52:32 | 显示全部楼层
STC32G144K246与AI8051U有专门的用户系统区,用法跟其它芯片不一样。

STC32G144K246用户系统区从EEPROM空间前面划分(Flash 超过64K的芯片EEPROM空间从前往后划分)。
例如EEPROM大小设置12K,用户系统区设置8K(地址0000H~1FFFH),那么实际的EEPROM空间是12K后面的4K(地址1FFFH~2FFFH)大小。
截图202604231008086648.jpg

AI8051U用户系统区从EEPROM空间后面划分(Flash 64K以内的芯片EEPROM空间从后往前划分)。
例如EEPROM大小设置12K,用户系统区设置8K(地址1000H~2FFFH),那么实际的EEPROM空间是12K前面的4K(地址0000H~0FFFH)大小。

截图202604231010211147.jpg

点评

我的6.96T的下载界面,设置用户系统区大小为12K,EEPROM为2K,没有提示EEPROM非得要大于用户系统区大小  发表于 2026-4-23 14:14
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-5-1 10:31 , Processed in 0.115191 second(s), 57 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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