近期原本好好的产品,突然上电不久MCU就卡住。调试发现跳到default_handler错误,也就是B错误
根据网上获取的信息,有2个原因
1、没有相关中断
2、没清除标志
我看了下,串口2的中断函数USART2_IRQHandler已经有了,并且清除中断标志也有,不明白为什么还会出现错误
后面我试过把其他串口初始化注释掉,还是不行,最后把串口2 deiinit,就没问题了,于是还是定位串口2异常
后面经过2个小时的分析对比,看到下面这句话,这里是使能了DMA的中断
然后对比网上的DMA教程,发现我用了DMA接收,然后只弄了串口2的中断函数,没有弄DMA的中断处理函数。
于是加入了下面这个中断处理,然后就正常了,断点测试,确实会跳转到下面的这个中断中
void DMA1_Channel6_IRQHandler(void)
{
if(DMA_GetFlagStatus(DMA1_FLAG_TC6)==SET)
{
DMA_ClearFlag(DMA1_FLAG_TC6);//清中断标志,否则会一直中断
}
}
之所以困扰我2个小时,是因为我一直都写少了这个DMA中断处理,但是用了2个星期都是没问题,仅在今天才开始出现问题。一直对比SVN排查最近的修改,找其他问题。
所以移植和复制代码真的要小心谨慎,不然少点东西,就要排查很久。