zhouq 发表于 2025-9-11 10:20:18

IAP_08_对擦除地址的疑问

我在使用STC8H1K17,想要使用iap升级app,看了下“使用STC的IAP系列单片机开发自己的ISP程序”、官方例程,和数据手册,对例程中的擦除地址操作有疑问:




0000H~0FFFH不是用户isp的代码区吗?为什么例程中的擦除Flash操作,地址是从0开始,那岂不是isp自己擦除自己?我认为擦除操作,应该加上4K的地址偏移,从0x1000开始擦除,擦除app部分,不知道是我哪里理解有误。

国芯人工智能 发表于 2025-9-11 10:23:00

您提出的疑问非常关键,涉及到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程序中加入判断逻辑,根据不同的升级目标选择擦除地址范围。例如:

c
// 假设定义如下地址范围
define BOOTLOADERSTART 0x0000
define BOOTLOADEREND   0x0FFF
define APPSTART      0x1000
define APPEND          0xFFFF

// 擦除函数原型
void FlashErase(uint16t startAddr, uint16t endAddr);

// 根据升级目标选择擦除区域
if (upgradeTarget == UPGRADEAPP) {
    FlashErase(APPSTART, APPEND);
} else if (upgradeTarget == UPGRADEBOOTLOADER) {
    FlashErase(BOOTLOADERSTART, BOOTLOADEREND);
} else if (upgradeTarget == UPGRADEFULL) {
    FlashErase(BOOTLOADERSTART, APPEND);
}

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

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

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

ercircle 发表于 2025-9-11 10:46:59

IAP操作函数的0地址是EEPROM空间的0地址,不是绝对地址0.


zhouq 发表于 2025-9-11 10:56:34

ercircle 发表于 2025-9-11 10:46
IAP操作函数的0地址是EEPROM空间的0地址,不是绝对地址0.

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

ercircle 发表于 2025-9-11 11:07:02

zhouq 发表于 2025-9-11 10:56
这段话我也看到了,但是看不明白,意思是所有iap的操作,地址都是偏移的0x1000吗? ...

IAP操作不考虑偏移,只需考虑EEPROM空间大小,起始始终是0,终点就是设置的EEPROM大小。

_奶咖君_ 发表于 2025-9-11 15:06:08

STC的EEPROM操作,不太一样。。设置了EEPROM的大小之后这部分区域是放到Flash的最后一部分的。假如设置了1K的大小,那么EEPROM的物理地址范围是16K-17K,,IAP操作时使用的范围还是 0-1K

DebugLab 发表于 2025-9-11 15:34:30

设置为60K(例程是60K,8H1K17是13K),前4K即被保护,无法通过IAP操作,只能使用官方下载方式擦除并下载,用户ISP可以存在这里保护起来
页: [1]
查看完整版本: IAP_08_对擦除地址的疑问