中级会员
 
- 积分
- 362
- 金钱
- 362
- 注册时间
- 2016-11-17
- 在线时间
- 47 小时
|
本帖最后由 daxing198612 于 2016-11-22 10:10 编辑
尝试了无数种方法,包括取消printf中文输出,减小接收字符数,在中断里加入
if (USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)//ÅD¶Ïμ½òç3öÖD¶Ï£¡
{
USART_ReceiveData(USART2);//清除ORE标志位
USART_ClearFlag(USART2, USART_FLAG_ORE);
}等等,串口接收数分钟还是会导致死机!
后来才发现
关键代码在关于USART串口接收中断的优先级设置里。
例如:MY_NVIC_Init(3, 3, USART2_IRQn, NVIC_PriorityGroup_2);
改成MY_NVIC_Init(0, 0, USART2_IRQn, NVIC_PriorityGroup_0);后串口连续接收数万次30字节数据再发送150字节数据再无异常,也不会死机了。
这种包含抢占优先级的分组方式,可能导致长时间串口进入接收中断的时候堆栈溢出,进入hardfault_handler无限死循环,只能重新启动。
关于优先级的影响原因只是猜测,哪位老兄可知真正原因!
|
|