十一、SWM341系列 Userboot应用 10.1、Userboot 中对systick 的应用。 现象: 客户使用SWM34S userboot使用systick初始化,APP跳转不成功 分析及解决:SWM341在userboot程序里面使用systick的话,需要手动关掉systick中断以及关掉systick,因为systick不是外设,是内核功能,无法靠PRST0/1寄存器关掉。
又如: 现象:协助客户其调试 USB 升级 MCU 固件功能,反馈使用测试例程在 BootLoader 跳转 APP 后无法正常执行 APP; 分析&解决:通过在 BootLoader 中仿真调试查看 APP 所在 Flash 区域内的数据变化,并与 APP 工程编译生成的二进制 Bin 对比,结果一致无误,故排除 BootLoader 擦写错误可能性。使用最简单的点灯示例作为 APP 工程测试同样复现上述异常,初步认为 BootLoader 中跳转出现错误,查看客户 BootLoader 代码执行流程,发现如下问题:
现象: 客户使用SWM34SREOTA过程中无法跳转到boot。 分析与解决:经过排查是没有关闭systick导致的。并且建议客户boot和app都用到的外设建议都需要复位,因为不建议外设在程序里重复初始化。 在前面所描述:SWM341 在 UserBoot 程序里面使用 Systick 的话,需要在跳转 APP 前失能 Systick 中断以及关掉 Systick 计数,因为 Systick 是内核外设,无法通过 MCU 内 SYSCON 的 PRSTR 0/1 寄存器关掉。 在跳转 APP 前增加 systick_stop 调用后,异常现象解除,确认原因来自于此。
10.2、UserBoot中初始化外设的应用 现 象: 客户使用SWM34S Userboot跳转到APP前复位外设,GPIO会变成高电平的问题。 分析及解决:跟研发确认,GPIO外设复位后是浮空电平不稳定的,可以再boot跳转时,不复位gpio外设。userboot复位外设是确保有的外设重复初始化,会导致程序运行有问题。
10.3 34Sboot跳转优化等级 现 象:BOOT跳转前关闭了所有中断,但仍然无法正常跳转。客户意识到可能是优化的问题,所以把BOOT和APP优化等级都开成0,但依旧无法跳转。 分析与解决: 在keil中boot程序的优化等级只能开成O1,除了O1以外其他任何优化等级都无法实现跳转,推测为AC6编译器的问题。
10.4、34S跳转BOOT开DMA中断,能成功跳转到APP程序,但APP中的中断部分异常。 现 象:BOOT中使用了DMA,且跳转前关闭了所有中断。在这种情况下可以正常跳转,但跳转后串口中断异常。虽然可以正常触发,但实际回传值永远不对。 解决办法:DMA是内核中断,除了复位以外任何办法都无法关掉DMA内核中断。因此导致跳转后APP程序表面正常,但实际内部状态并没有被复位,导致APP程序出问题,在BOOT程序跳转前加上这句,清空DMA所有寄存器即可正常 DMA->IE = 0;
DMA->IF = 0xF;
DMA->CH[0].CR = 0;
DMA->CH[1].CR = 0;
DMA->CH[2].CR = 0;
DMA->CH[3].CR = 0;
DMA->CH[0].MUX = 0;
DMA->CH[1].MUX = 0;
DMA->CH[2].MUX = 0;
DMA->CH[3].MUX = 0; 但清空后依旧无法保证对应通道的DMA能正常执行,所以BOOT和APP如果都使用了DMA,那一定不能使用同一个通道。
10.5、应用USB方式升级 现象:中有科技(SWM34SRET6)客户使用U盘升级例程时,无法正常升级UI素材。 分析解决:客户使用上位机开发项目,需要U盘升级,但反馈无法正常升级素材,通过U盘模式和JFlash烧录素材均可以正常显示,怀疑U盘boot程序存在问题,通过排查后发现用户素材大小设置错误,应为16MB,而程序中设置仅为1MB,因此素材只升级了1MB,故无法正常显示,改为16后解决。
10.6、BOOT应用过程中外设的复位 现象:目前客户加入USB升级部分时,发现Boot跳转到APP正常,APP 软复位跳转到Boot时没法执行 分析与解决:由于APP 软复位是使用NVIC复位,一旦APP和BOOT有外设重合的部分,外设重复初始化的话可能会导致hardfault。所以建议客户在APP进行看门狗复位或者NVIC复位前,对外设和systick进行单独复位。
10.7、编译等级优化引起的跳转失败现象 现象:技术支持SWM34SVE过程中,客户表示boot跳转有问题,经过仔细研究客户代码,以及客户描述的之前的Boot能驱动AT24C04但不能跳转。现在的boot不能驱动At24C04但是能跳转。 分析与解决:最后分析是boot设置成编译等级O0导致的,SWM34S编译等级需要设置成O1boot才能跳转,SAE的解释是,因为O0优化等级时,pc的值先被压入栈中,在执行ResetHandler()前从栈中弹出然后跳转,但是在此之前栈指针SP已经被修改了,弹出的pc值是错的,所以boot跳转就失败了。这也很好解释了,为什么客户之前的boot可以跳转,因为客户之前是做模拟i2C来访问AT24C04,然而模拟时序用的delay_us,没有使用nop(),导致循环在O1条件下被优化。于是协助客户修改延时后,经过测试功能测试正常,可以正常跳转。 |