硬件:STM32F103C8T6,外部中断4链接MPU6050模块的INT引脚,每5ms触发一次中断;串口2连接上位机,接收PC下发的控制指令。 需求:要求串口2的接收中断优先级高于外部中断4的优先级 代码: 1)STM32CubeMX中设置NVIC Group = 3 即 3 bits for pre-emption priority 1 bits for subpriority 2)串口2中断设置:
3) 外部中断4设置:
1) 单独使能外部中断4,外部中断4工作正常 2) 单独使能串口2中断,串口2接收中断工作正常。PC连续下发多条指令都能正常接收并回显。 3) 同时使能外部中断4,串口2中断,发现:外部中断4仍能正常工作。但串口2接收中断仅能接收并回显开始的几个字符数据(长度随机)。后续再发送到串口2的字符均没进入接收中断,更没回显了。 4)出现3)中的状况后,再次disable掉外部中断4,仅保留串口中断,其它不变。此时串口中断又工作正常了。 5) 使能外部中断4。同时尝试设置UART3的抢占优先级低于UART2的抢占优先级,或不使能UART3的中断,现象都与3)中的相同。 按前面的代码设置,串口2的抢占优先级是1,是高于外部中断4的抢占优先级3的。外部中断4应该不会影响串口2的中断。 但观察的现象实际相反,请大家帮忙看看哪里弄错了。 |
举例,比如说进入串口中断2后立即关闭外部中断4,串口中断2运行结束后再打开外部中断4
类似这样的处理来解决。
谢谢回复。是一种思路,我试试看。
不过我希望的是外部中断一直进行。当通过串口下发数据时,能自动中断外部中断。
如果正常 问题出在优先级上
如果还是不正常 那就是引脚配置有问题 查一下
个人认为第二种可能性大一些 也可以仿真查一下问题
问题原因在于USART2接收中断不断触发,USART3发送会被新的USART2接收中断打断,huart3句柄内部的buffer内容被修改,导致丢失数据。huart3是全局变量,HAL_UART_Transmit不可重入
将UART2接收中断回调函数改为如下内容,把接收到的字节直接放到buffer中,然后在main()函数中回显。故障现象同上。感觉问题不在你说的这里。通过本次试验,更证实在同时使能外部4,UART2中断的时候,UART2并没有进入接收中断。
将UART2接收回调函数改为如下内容。中断接收到的字节直接放到buffer中。在main()函数中进行回显。故障现象与上面的相同,并未发生改变。
这个试验跟进一步观察到并证实,在同时使能外部中断4,UART2中断的时候,并未进入UART2的接收中断。
测试了,情况如下:
软件上同时使能外部中断4、UART2中断。硬件上断开INT引脚,即外部中断4实际上无触发信号输入,未实际产生中断。此时UART2能正常进入中断,可正常接收。
总结这几种情况:在同时使能外部中断4、UART2中断。设置UART2抢占中断优先级高于外部中断4优先级。低优先级的外部中断4工作正常,高优先级的UART2反倒不正常???
与你讲的第一种情况相同,问题还是出在中断上。
你检查一下 是不是抢占优先级和响应优先级设置反了 现在实际设置的是响应优先级??
最好把响应优先级也设置不一样的 串口2设置高优先级