需要用CAN烧写程序.参照官方代码,写好了bootloader和应用程序.用下载程序后,跳入应用程序,不跑程序,好像进入一个无穷循环,怀疑是进入应用程序的hardfault.为此在应用程序中的hardfault服务例程中写了个CAN发送8个1的句子.用bootloader下载程序,切入并跑应用程序,果然CAN分析仪上收到8个1.真的进入了应用程序的hardfault.
但是用bootloader下载好程序后,重启单片机,是能正常跑应用程序的.后来在切入应用程序那句,下了断点,分别分析下载好程序跑到这句和重启单片机跑到这句,看看主要寄存器有什么不同,还是看不到什么不同.
之前用的应用程序时跑UCOS的,把应用程序改成裸写的,这样用bootloader下载程序后,不用重启单片机直接跑应用程序,能够正常跑应用程序,然后怀疑UCOS移植不对,继续折腾....发现UCOS移植没问题.
折腾几下,突然想到,是不是切入应用程序的之后,单片机进入了CAN接收中断,而此时,单片机的中断向量还未重新定义,这样导致虽然还在应用程序,但进入CAN中断后,进入的还是bootloader的的CAN中断,bootloader的CAN接收中断有自己的服务例程,用到一些全局变量,而这些全局变量会影响到应用程序(因为bootloader的ram和应用程序的ram复用的).这样bootloader的会修改应用程序的变量,如果应用程序正在进行一些重要的初始化(特别是应用程序的复位向量跳转后进入的重要初始化),就可能导致BUG.
这样在bootloader调转应用程序前一句,加上关闭总中断,果然,用bootloader下载好程序后,不用重启单片机,也能够正常跑应用程序了.. |