« 上一篇下一篇 »

Bootloader&USB问题记录

一、从bootloader跳转到应用层时产生hardfault

这个问题在上一家公司上班时就遇到过了,虽然问题的表现不太一样,但源头基本是一样的,就是Systick中断引起的。之前的是从boot跳转到应用层时,没有关闭Systick中断,导致在跳转过程中产生了中断,而此时系统还没有正常初始化,导致系统出错。这一次的问题也是因为Systick中断没有关,跳转到应用层后产生了Systick中断,但是这里并非是由于中断导致系统出错,而是因为应用层里面没有定义Systick的中断服务函数,所以在应用层产生了Systick中断后,系统找不到该中断的入口,从而导致没法正常进入,于是就出错了。

解决方法:在boot中如果开启了Systick的中断,则一定要在应用层中同样定义Systick的中断服务函数,以免中断发生后找不到入口。更为妥当的是,如果boot中开启了Systick的中断,那么不管应用层有没有再使用Systick,都必须在跳转之前就将Systick的中断使能给关闭,让其不能再产生中断。

二、从应用层跳转到Bootloader后USB外设无法正常复位

这个问题的现象是,在应用层中初始化并使用了USB功能,在跳转至boot之前,对所有的中断都进行了反初始化,然后跳转到boot后,又会重新对USB外设进行初始化,但是此时USB的初始化不能正常完成,BusHound监测到的信息提示是USB在Reset时出现了错误。至于问题到底是什么原因,则没有找到,估计可能原因一又是Systick中断在作怪,因为在跳转前同样没有关闭Systick中断,但是在调试过程中,并没有发现产生Systick中断,所以这只是个可能原因。二是USB的外设没有正常的回到初始状态,所以导致在boot中重新初始化时不能成功,有同事拿同样的工程调试发现跳转后指向USB设备描述符的存储变量的地址出错了,从这一点来看,也有可能是堆栈或者是内存操作异常引起的。

解决方法:将跳转之前的反初始化操作改成系统复位操作,即操作SCB->AIRCR这个寄存器,对主要的功能模块都进行了复位(包括USB外设),这样在跳转之后再次初始化USB外设,即能够成功


——2019.09.16 23:09   于广州花都