?
SWM181xB的Flash总大小为120K,其中前96K用于APP,后24K用于UserBoot,芯片上电先执行UserBoot,然后跳转到APP。
SWM181xC的Flash总大小为248K,UserBoot在96K起始的24K处,若程序大小超过96K,则需要在Keil中做如下设置:
?
B0接低时,上电后芯片直接执行APP。
B0接高时,上电后芯片检查地址0x18020处内容:
若内容不是0x0B11FFAC,则执行ISP代码,可通过串口烧录APP。
若内容是0x0B11FFAC,则跳转到UserBoot。
startup_SWM181.s中需要如下设置,确保程序的0x20、0x24、0x28三个地址处有正确取值:
DCD 0x0B11FFAC
DCD 0x6000
DCD SRAM_SWITCH
UserBoot和APP中的0x6000分别指定了UserBoot和APP的大小为24k,若它们的大小不是24k,可修改对应值缩短代码拷贝时长;设定值必须是0x1000的整数倍,且大于等于实际程序大小。如果对上电时间没有苛刻要求,建议不要修改。
UserBoot的连接使用分散加载文件控制。
可使用SWMProg、SYNWIT_ISP等可将代码下载到指定位置的软件下载。
APP——可使用Keil下载
下载时不要选全擦,否则会把之前下载的UserBoot擦掉。
使用其他工具给SWM181xC下载时需要注意:若程序大于96K需要避免下载工具将0x18000-0x1E000的UserBoot覆写掉。
可以将APP和UserBoot的bin文件合并成一个然后再用批量工具烧录。
检查0x18020地址处内容并跳转到UserBoot的工作其实是由ISP代码完成的,旧版ISP代码没有此功能,因此需要给带有旧版ISP代码的芯片升级ISP。
UserBoot程序中,跳转到APP之前,需要执行以下清理操作:
(1)关闭UserBoot中开启的外设中断;
(2)关闭UserBoot中使用过的外设(给外设的控制寄存器恢复默认值);
比如如果UserBoot中使用了Timer中断,在跳转到APP之前没有关闭Timer的话,那么进入APP之后这个Timer还会触发中断,而APP中没有给这个Timer写ISR的话,就会执行默认ISR,是个死循环。
注意事项:
下载UserBoot后,ISP程序无法再执行,若App中关闭了SWD,则芯片无法再通过JLink和ISP串口更新程序,只能通过UserBoot更新或擦除App。
?