找回密码
 立即注册
查看: 35|回复: 6

IAP_08_对擦除地址的疑问

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-09-13 09:49:07
已绑定手机

18

主题

45

回帖

596

积分

高级会员

积分
596
发表于 3 天前 | 显示全部楼层 |阅读模式
我在使用STC8H1K17,想要使用iap升级app,看了下“使用STC的IAP系列单片机开发自己的ISP程序”、官方例程,和数据手册,对例程中的擦除地址操作有疑问:



截图202509111017107671.jpg
0000H~0FFFH不是用户isp的代码区吗?为什么例程中的擦除Flash操作,地址是从0开始,那岂不是isp自己擦除自己?我认为擦除操作,应该加上4K的地址偏移,从0x1000开始擦除,擦除app部分,不知道是我哪里理解有误。
截图202509111018359591.jpg
花有重开日,人无再少年
回复

使用道具 举报 送花

3

主题

1989

回帖

826

积分

等待验证会员

积分
826
发表于 3 天前 | 显示全部楼层
您提出的疑问非常关键,涉及到IAP(在应用编程)机制中Flash擦除操作的地址范围理解问题。我们来逐步分析这个问题,以厘清您在使用STC8H1K17进行IAP升级时对Flash擦除地址的困惑。

一、IAP的基本概念

IAP(In-Application Programming)是一种允许程序在运行过程中对Flash进行读、写、擦除等操作的技术。在IAP架构中,通常将Flash分为两个部分:
Bootloader(ISP)区:存放引导程序,负责与上位机通信,接收升级文件,并写入到App区。
Application(App)区:用户应用程序的运行区域。

在STC8H1K17中,Flash空间为64KB,地址范围为 0x0000H ~ 0xFFFFH。通常情况下,Bootloader区占据前4KB(0x0000H ~ 0x0FFFH),其余为App区(0x1000H ~ 0xFFFFH)。

二、关于例程中从0x0000H开始擦除的疑问

您提到的官方例程中,擦除操作是从0x0000H开始的,这确实容易引起误解——如果擦除地址从0开始,是否意味着会擦除Bootloader(ISP)代码本身?

1. 擦除单位与扇区划分

Flash擦除是以“扇区”为单位进行的,而不是字节。例如,STC8H系列的Flash通常每个扇区大小为1KB。也就是说,擦除操作的最小单位是1KB。

因此,当我们说“从0x0000H开始擦除”,实际上是指擦除第一个扇区(0x0000H~0x03FFH),或者多个连续扇区。

2. 为何官方例程要从0x0000H开始?

这取决于具体的IAP设计需求:
如果Bootloader(ISP)区大小为4KB(即0x0000H~0x0FFFH),那么正常情况下是不能擦除这个区域的,因为这会破坏ISP代码本身。
然而,在某些特殊场景下(如Bootloader需要升级),ISP程序本身也需要被更新,这时就需要擦除0x0000H起始的部分扇区。

所以,是否从0x0000H开始擦除,取决于你要更新的是App区还是Bootloader区。

三、您的理解是否正确?
我认为擦除操作,应该加上4K的地址偏移,从0x1000开始擦除,擦除app部分。

这是正确的理解,在仅升级App程序时,擦除地址应从0x1000H开始,也就是从App区的起始地址开始擦除,这样不会影响到Bootloader区。

四、如何判断是否应该擦除Bootloader区?

1. 常规升级App程序:仅擦除0x1000H ~ 0xFFFFH之间的App区域。
2. 升级Bootloader程序:需要擦除0x0000H ~ 0x0FFFH之间的Bootloader区域。
3. 整片擦除:某些情况下可能需要擦除整个Flash,比如恢复出厂设置或首次烧录。

五、建议的IAP擦除操作方式

在实际开发中,建议您在IAP程序中加入判断逻辑,根据不同的升级目标选择擦除地址范围。例如:
  1. c
  2. // 假设定义如下地址范围
  3. define BOOTLOADERSTART 0x0000
  4. define BOOTLOADEREND   0x0FFF
  5. define APPSTART        0x1000
  6. define APPEND          0xFFFF
  7. // 擦除函数原型
  8. void FlashErase(uint16t startAddr, uint16t endAddr);
  9. // 根据升级目标选择擦除区域
  10. if (upgradeTarget == UPGRADEAPP) {
  11.     FlashErase(APPSTART, APPEND);
  12. } else if (upgradeTarget == UPGRADEBOOTLOADER) {
  13.     FlashErase(BOOTLOADERSTART, BOOTLOADEREND);
  14. } else if (upgradeTarget == UPGRADEFULL) {
  15.     FlashErase(BOOTLOADERSTART, APPEND);
  16. }
复制代码

六、总结
0x0000H ~ 0x0FFFH 是Bootloader(ISP)区,通常不建议擦除,除非要升级Bootloader本身。
0x1000H ~ 0xFFFFH 是App区,升级App程序时应从此地址开始擦除。
官方例程中从0x0000H开始擦除,可能是为了演示完整擦除或支持Bootloader升级。
实际开发中应根据升级目标动态选择擦除地址范围,避免误擦除Bootloader代码。

如您有进一步的工程配置或代码问题,也欢迎继续交流。希望以上分析能帮助您更好地理解IAP中Flash擦除地址的选择逻辑。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:297
  • 最近打卡:2025-09-13 09:56:50
已绑定手机

82

主题

3111

回帖

6879

积分

荣誉版主

无情的代码机器

积分
6879
发表于 3 天前 | 显示全部楼层
IAP操作函数的0地址是EEPROM空间的0地址,不是绝对地址0.

截图202509111049394603.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:98
  • 最近打卡:2025-09-13 09:49:07
已绑定手机

18

主题

45

回帖

596

积分

高级会员

积分
596
发表于 3 天前 | 显示全部楼层
erci*** 发表于 2025-9-11 10:46
IAP操作函数的0地址是EEPROM空间的0地址,不是绝对地址0.

这段话我也看到了,但是看不明白,意思是所有iap的操作,地址都是偏移的0x1000吗?

点评

IAP操作不考虑偏移,只需考虑EEPROM空间大小,起始始终是0,终点就是设置的EEPROM大小。  详情 回复 发表于 3 天前
花有重开日,人无再少年
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:297
  • 最近打卡:2025-09-13 09:56:50
已绑定手机

82

主题

3111

回帖

6879

积分

荣誉版主

无情的代码机器

积分
6879
发表于 3 天前 | 显示全部楼层
zho*** 发表于 2025-9-11 10:56
这段话我也看到了,但是看不明白,意思是所有iap的操作,地址都是偏移的0x1000吗? ...

IAP操作不考虑偏移,只需考虑EEPROM空间大小,起始始终是0,终点就是设置的EEPROM大小。
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2025-09-13 08:52:59

33

主题

2544

回帖

5535

积分

论坛元老

积分
5535
发表于 3 天前 | 显示全部楼层
STC的EEPROM操作,不太一样。。设置了EEPROM的大小之后这部分区域是放到Flash的最后一部分的。假如设置了1K的大小,那么EEPROM的物理地址范围是16K-17K,,IAP操作时使用的范围还是 0-1K
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:557
  • 最近打卡:2025-09-13 09:55:03
已绑定手机

86

主题

6117

回帖

1万

积分

超级版主

积分
11308
发表于 3 天前 | 显示全部楼层
设置为60K(例程是60K,8H1K17是13K),前4K即被保护,无法通过IAP操作,只能使用官方下载方式擦除并下载,用户ISP可以存在这里保护起来
截图202509111530263128.jpg
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-9-14 06:28 , Processed in 0.123323 second(s), 93 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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