新手记录STM32 IAP移植过程中遇到的坑

由于前期是基于STM32Cube生产的code上改的,里面用的库都是HAL的。为了偷懒,在AN4735中找到一个基于HAL库的IAP例程,如下:


打开一看发现是通过USART升级的,但是本人用的是USB的VCP,也就是虚拟串口,虽说是串口,但还是有些不一样。

坑1:USB VCP通信

将USART收发程序改为USB收发程序后,发现Ymodem协议一直不通,没办法只能往里面看,先看了Ymodem协议,链接如下:http://pauillac.inria.fr/~doligez/zmodem/ymodem.txt    

本人使用的SecureCRT 6.5,收到数据包的时候,数据总是不完整。前后搞了两天,因为例程中说用的是超级终端,网上有人说这两者的Ymodem有一点点不通,我不太懂,所以就怀疑SecureCRT发的到底对不对。然后用两台PC,用两根串口对发,发现SecureCRT发的是对的,数据包很好。找了很久发现是,接收的buf太小了,不是UserRxBuffer,不知道这个设置有什么用。


坑2:CRC

CRC校验一直没有计算出对的值,发现初始化的时候设置问题,从历程中复制过去就好了;


坑3:Ymodem协议


例程中Ymodem在结束时的协议与说明Ymodem里的不同,这样SecureCRT会报错,但其实已经更新ok了。

最后面加了几句进去就好了:



坑4:Jump to App

设置好app的起始地址后:


程序并不能运行,结果发现还需要重新设置终端向量表,所以说我是菜鸟,不懂呀:




加好后,app build不通过,报错,百度了一下,需要设置ROM。



终于可以烧两个程序了,然后上电正常启动,跑到app后发现,ADC采样完全不对了。

所以到

坑5:ADC采样

之前为了以防万一,在IAP里初始化了ADC等一些没用的外设,把ADC_init注释掉后,ADC采样可以了。


坑6:发现app无法debug了,现在还没找到原因


坑7:IAP ,APP相互跳转

已经做好,IAP到APP的跳转了,接下去做APP到IAP的跳转,直接在USB通信中内置了一段cmd,用来控制APP软启动:


这样就能跑到IAP了。


坑8:

我的IAP程序进入Ymodem传输需要连接串口通信后8s之内在键盘上输入字符“w”。但是SecureCRT 6.5版本不能传输binary,所以就只能用串口小助手。需要在8s之内,切换两个上位软件,同时按下w,不太好用。所以就在热重启后,在flash中写了一个flag,当到IAP的时候,IAP读取这个flag,将程序直接进入Ymodem传输模式。


以上还有不懂的是,PC指针跳转后,很容易程序跑死,而且还不能debug,感觉跟外设或者时钟的使用有关,两个工程在跳转前是否要将外设关掉?但是关掉也会跑死,不知道为何?






你可能感兴趣的:(嵌入式开发)