USART中断函数加入delay函数延时,无法再次进入中断是什么问题

2019-07-20 06:28发布

本帖最后由 lcclcc 于 2018-8-24 21:39 编辑

     各位高手,我今天看串口的视频自己写了个串口程序。  程序的目的是用电脑通过串口发送数据到STM32F4单片机,单片机串口接收到数据之后产生中断,中断服务函数里面让LED灯状态翻转、蜂鸣器响10ms然后关掉。可是我发现delay_ms(10);这个语句会使程序不能正常工作,具体现象是电脑发送数据时,LED灯闪了一下就灭了,蜂鸣器一直响,然后在电脑端再怎么点击发送数据,开发板上的LED和蜂鸣器的状态都不会有任何改变。我把delay_ms(10);这句注释掉,就不会有这种情况发生(只是蜂鸣器没有了声音)。我通过ST Link调试器查看USART_SR寄存器也没看出注释和不注释的时候USART_SR寄存器有什么区别。我现在把工程源码传上来,祈求各位大侠给点意见

中断服务函数:

//ÖжϷþÎñº¯Êý,
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1,USART_IT_RXNE))
  {
    LED0 = !LED0;
   LED1 = !LED1;
   LED2 = !LED2;
   USART1->SR &= 0xFFFFFFDF;
}
  // BEEP = 0;
  // delay_ms(10);
// BEEP = 1;

}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
正点原子
1楼-- · 2019-07-20 10:03
用了os就不能在中断服务函数里面调用delay!!!!
lcclcc
2楼-- · 2019-07-20 11:40
 精彩回答 2  元偷偷看……
lcclcc
3楼-- · 2019-07-20 17:21
 精彩回答 2  元偷偷看……
ufbycd
4楼-- · 2019-07-20 22:15
delay_ms 就是通过定时中断来计时,不应在中断服务程序调用,如果定时中断的优先级小于当前的,delay_ms就是死循环。再者,在中断中延时是非常不建议的,应该尽量保证中断服务程序短小,
edmund1234
5楼-- · 2019-07-21 02:55
我一贯反对用Delay, 它百害而只有一利。

lcclcc
6楼-- · 2019-07-21 03:32
 精彩回答 2  元偷偷看……

一周热门 更多>