关于什么是IAP的升级,就不必多言了,B站上正点原子的视频有详细的讲解,还有例程,但是是STM32的.MM32F0020的IAP升级的资料,网上到处都没找到,应该是我孤陋寡闻了,不知道有没有其它的渠道.搞这个MM32F0020的远程升级,对我来说还是有点难搞的(搞这个之前都不知道IAP是什么东西)(我是给调光器添加升级的功能,用的是涂鸦的模块),不过问题都解决了,还是有点成就感的.下面我就分享一下遇到的问题和解决办法.(找不到资料,我就斗胆自己当资料了).
遇到的第一个问题就是SCB->VTOR这个东西识别不到,本来我是想百分百模仿原子哥的,但是在APP代码的第一条就出现问题了,像这样:
点到SCB的定义:
找不到这个VTOR,虽然都是HAL库,但是这个和STM32那个HAL库发现很多都不一样,这是STM32的的,可以找到那个VTOR
然后就参考了一下其他大佬的文章MM32F0144 Cortex-M0内核IAP远程升级_mm32 iap-CSDN博客,按照这个方法就成功了.原因网上找到是:Cortex-M0内核的向量表偏移寄存器(VTOR)仅在Cortex-M3/M4/M7等高级内核中存在。Cortex-M0的向量表固定位于Flash的起始地址(0x0000 0000),无法通过软件动态修改。
遇到的第二个问题是,APP升级前,bootload和APP可以互相跳转且正常运行,可APP升级后,bootload跳转到APP,APP运行直接卡死的问题.这个问题挺折磨的,网上找了很多资料,还问了AI,有的说滴答定时器没有关闭,有的说APP和bootload的RAM冲突了,有的说要用汇编跳转什么什么的,反正都试过了,没用.然后就不得不拿出尘封多年的STLINK调试器.然后又去恶补了一下调试方法(很久没用过调试操作了,都忘了),结果就是卡死在APP的gpio定义里面,然后就问AI,听AI的加了这些语句:
结果还是卡死,这次是卡死在RCC->AHBRSTR=0,然后就被我看出不对劲了,这句代码所在的地址对应的汇编居然在死循环(这里就不发图了,找图得在公司复刻一下情况,嫌麻烦),然后我就把APP升级后代码那个地址的数据看了一下,发现bootload把APP升级代码中的0x0D,烧录成了0x00,其它正常烧录.我还以为是flash擦除和烧录出了问题,结果发现是可以烧录0x0D的,~经过摸索了之后~,发现了这个:
没错,写库函数的那个大帅哥,在UART接受函数里面,把接收到的0x0D手动变成的0x00.把这一个处理注释了,就解决了..
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/ywq2845078925/article/details/148800346
|
|