华芯微特开发论坛

 找回密码
 立即注册
搜索
热搜: SWM341 资料
查看: 218|回复: 0

SWM341系列应用(Userboot应用)

[复制链接]

32

主题

76

帖子

9万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
90429
发表于 2024-1-2 16:12:33 | 显示全部楼层 |阅读模式
十一SWM341系列 Userboot应用
10.1Userboot 中对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都用到的外设建议都需要复位,因为不建议外设在程序里重复初始化。
图片239.png
在前面所描述:SWM341 在 UserBoot 程序里面使用 Systick 的话,需要在跳转 APP 前失能 Systick 中断以及关掉 Systick 计数,因为 Systick 是内核外设,无法通过 MCU 内 SYSCON 的 PRSTR 0/1 寄存器关掉。
在跳转 APP 前增加 systick_stop 调用后,异常现象解除,确认原因来自于此。
图片240.png

10.2UserBoot中初始化外设的应用   
      : 客户使用SWM34S Userboot跳转到APP前复位外设,GPIO会变成高电平的问题。
分析及解决:跟研发确认,GPIO外设复位后是浮空电平不稳定的,可以再boot跳转时,不复位gpio外设。userboot复位外设是确保有的外设重复初始化,会导致程序运行有问题。

10.3 34Sboot跳转优化等级       
     象:BOOT跳转前关闭了所有中断,但仍然无法正常跳转。客户意识到可能是优化的问题,所以把BOOTAPP优化等级都开成0,但依旧无法跳转。
分析与解决:
图片241.png
keilboot程序的优化等级只能开成O1,除了O1以外其他任何优化等级都无法实现跳转,推测为AC6编译器的问题。

10.4、34S跳转BOOTDMA中断,能成功跳转到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烧录素材均可以正常显示,怀疑Uboot程序存在问题,通过排查后发现用户素材大小设置错误,应为16MB,而程序中设置仅为1MB,因此素材只升级了1MB,故无法正常显示,改为16后解决。
图片242.png

10.6BOOT应用过程中外设的复位      
象:目前客户加入USB升级部分时,发现Boot跳转到APP正常,APP 软复位跳转到Boot时没法执行
分析与解决:由于APP 软复位是使用NVIC复位,一旦APPBOOT有外设重合的部分,外设重复初始化的话可能会导致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条件下被优化。于是协助客户修改延时后,经过测试功能测试正常,可以正常跳转。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|华芯微特开发论坛

GMT+8, 2024-5-20 18:18 , Processed in 0.033727 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表