前言:这个OTA升级项目卡了萌新一个多月,经过无数个熬夜加班和大佬们的耐心指点,现终于有了一点眉目,故创作此文,希望对同样卡在OTA上的小伙伴有一点帮助。
先介绍一下我所使用的MCU和环境吧,芯片型号是RH850 - R7F701581,和前文所用的1587相差无几,环境是新版本IAR 2.10.1
程序分为Bootloader和APP两部分,分别放置在0地址上和8000地址上,正常启动程序由BootLoader跳转到APP,并在APP中正常运行,当上位机通过UART给MCU发送升级指令时,APP程序进入升级部分,赋值SHMEM表示从APP跳转过来,跳转到0地址时检测SHMEM值开始升级,升级完成后重新跳转回APP并正常运行。
这个流程并不复杂,但在实操中却碰到了层层阻碍,使项目进展非常不顺。最开始在我完成BootLoader和APP程序的upgrade模块时,用上位机发送握手信号MCU不能正常回复,现象感觉像重置复位向量失败,让跳转变成了8000->8000,通过示波器和逻辑分析仪发现板子在不停重启(由于程序分为两部分调试中无法使用仿真器调试,只能通过波形判断),然后我发现可能是FCL库不匹配,去瑞萨官网下载了最新的FCL库,保留了工程的fcl.c和fcl.h文件进行移植,完成后程序就开始变得匪夷所思了,出现各种奇怪现象。
第一个出现的问题是APP跳转进入BootLoader升级不能成功跳过去,还是8000跳8000现象,这个问题也是从头到尾一直困扰着我的问题,软件重置复位向量地址失败,保留了上电跳转8000的值,引起出现8000跳转8000现象,后面我舍弃了软件原有的跳转程序,重新写了新的替代,问题才有所改观。
第二个碰到的问题是跳转过去无法成功保存SHMEM值,不能进入升级分支;这个问题其实到目前为止我也没有搞清楚问题到底在什么地方,SHEMEM值正常进入升级会写入RAM中,测试过擦写flash功能全部正常,后面我把SHMEM值保存在FLASH中,发现居然成功写入但还是无法正常保存,后面发现原来是icf文件配置有问题,SHMEM概率写入,修改后icf文件添加SHMEM定义,工程之间跳转SHMEM才可以成功保存。
第三个碰到的问题是成功跳转进入BootLoader升级程序后Usart不通(Usart测试无异常),不能正常回复上位机发送的握手信号,后面我舍弃了程序Usart的库函数的层层包装调用,直接用最直接的写寄存器方式才可以正常回复。
第四个碰到的问题是跳转成功并SHMEM值成功保存了进入升级,但PowerShell上升级完后却提示Read Usart error!把memory读出来发现并没有成功写进去,有时候又是正常的,概率性出现这个问题,后面通过反复检测FCL库,发现还是FCL库的问题,先把cstartup.s文件添加进工程,然后我把整个fcl库针对1581片子进行修改,做了适用的FCL库才成功解决了此问题。
突破层层阻碍问题反复出现,最终现在upgrade成功完成。FCL库才成功解决了此问题。