1.问题描述
这是在调试串口升级功能时遇到的问题,是用的STM32CubeMX生成的代码,BootLoader参考的正点原子的例程。在BootLoader中仅初始化了串口DMA功能,用串口来接收升级程序。前期一切正常,能够正常响应串口中断,文件检查,消息发送等等。跳转指令也能正常执行,跳转后程序卡死调试模式下暂停后发现卡在DMA中断里面。
2.调试过程
1.刚开始的时候我以为是程序烧写不正确。但是后面手动下载了两段可以拼接的程序进去,仿真开始的时候还是按照逻辑等待固定时间后调试的指示箭头指到了开始的位置上去,说明BootLoader正常。继续单步执行发现依旧可以执行,直到程序运行到串口初始化后程序开始卡死,但是依旧卡死在DMA的中断里面。
2.尝试交换DMA初始化和串口初始化的顺序。即在完成串口初始化以及串口和DMA连接后才使能DMA的时钟和中断,结果依旧卡死。
3.尝试在BootLoader结束时把总中断关闭,按原方式进行调试,发现依旧会进入DMA的中断里面,猜测在F4中DMA的响应不受总中断的影响,独立存在于单片机系统之外。结合在之前使用ADC-DMA功能时,由于外接了100M的电阻导致在100M电阻上产生了一些压降,而不使用DMA功能时压降消失。说明在单片机内部,DMA不仅仅只是软件上的连接,更是在物理上进行了硬件上的直接联系。
4.尝试在BootLoader中程序的结尾将串口和DMA断开连接,并将总中断关闭。程序一直进DMA中断的现象消失。说明问题得到了解决。后在主程序中补充上开始总中断的指令。问题彻底解决。
3.总结
DMA在使用完毕进行跳转之前,尤其是在涉及中断向量表偏移的程序中,需要将其在所使用的部分程序中先断开后再在后续的使用中开启。