STC8系列单片机IAP更新方法
内容目录
单片机芯片
芯片:STC8A8K64S4A12
关于此芯片的重要说明:
2022-2-24到2022-3-21期间生产的此型号 程序空间为63K, EEPROM 固定为1K, EEPROM大小无法修改 其它时间生产的此型号的程序空间和EEPROM参数都是正确的 即: 程序空间为63.5K, EEPROM默认为0.5K, EEPROM大小可修改
简介
最近所使用的单片机全都是基于STC8系列单片机实现,由于项目需要,需要实现在线远程更新功能。
因此,我所使用的单片机是STC8A8K64S4A12。
注意:只有eeprom写的是IAP的型号才支持。
首先,stc8单片机不同于stm32系列,它运行时是实时读取flash中的代码的,而stm32是运行前先将flash中的程序搬到ram中然后运行的。因此,stc8的烧录要比stm32系列困难的多,用来更新代码的代码必须与被更新的代码放在不同位置。
由于stc8系列的单片机,运行code肯定是在eeprom的最前端,因此我们需要一开始准备一段,用来将eeprom别的位置代码搬移到运行位置的工具代码,我选择使用汇编语言写。 然后就只需要将通过串口或是通过网络获取到的代码,写道eeprom的另一个位置即可了。
比如,先将通过网络获取到的代码下载到eeprom的0x3000位置,然后调用位于0xf800位置的工具代码将0x3000位置的内容搬移到0x0000位置即可。
我写的汇编代码定义了代码地址在0xf800位置,然后通过R7、R6、R5、R4四个变量分别传了需要更新的代码位置以及大小。
调用方法如下:
|
|
但是在执行这个代码之前,需要保证0xf800这个地址已经是工具代码了,可以用如下代码实现。
|
|
IapRead、IapErase与IapProgram的具体实现,直接看官方文档即可。
至于数组iapprogram怎么来的,可以参考本文最后面的汇编代码。
最后需要注意的是,ISP下载程序时,eeprom必须选择64k
下面分享下我写的stc8的iap更新工具代码(汇编):
|
|
Author 软件开发大郭
LastMod 2022-05-26