OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5755|回复: 7

串口中断服务函数USART1_IRQHandler(void)第一句话为什么不是关中断?

[复制链接]

33

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2017-1-2
在线时间
31 小时
发表于 2017-1-2 20:33:25 | 显示全部楼层 |阅读模式
1金钱
正点原子的串口中断服务函数如下
void USART1_IRQHandler(void)                        //串口1中断服务程序
        {
        u8 Res;
#if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntEnter();   
#endif
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
                {
                Res =USART_ReceiveData(USART1);        //读取接收到的数据
               
                if((USART_RX_STA&0x8000)==0)//接收未完成
                        {
                        if(USART_RX_STA&0x4000)//接收到了0x0d
                                {
                                if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
                                else USART_RX_STA|=0x8000;        //接收完成了
                                }
                        else //还没收到0X0D
                                {       
                                if(Res==0x0d)USART_RX_STA|=0x4000;
                                else
                                        {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收          
                                        }                 
                                }
                        }                    
     }
#if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntExit();                                                                                           
#endif
}

第一句话为什么不是关闭中断,这里面好像没有关中断这句话。如果来了一次中断,中断程序里的程序还没运行完,又来了一次中断那不就乱了吗?????为什么第一句不是关中断,最后一句关中断

最佳答案

查看完整内容[请看2#楼]

关中断这是掩耳盗铃,你尽量简化中断服务函数,确保下一次中断来领时,该服务函数早就执行完了。就行了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-1-2 20:33:26 | 显示全部楼层
关中断这是掩耳盗铃,你尽量简化中断服务函数,确保下一次中断来领时,该服务函数早就执行完了。就行了。
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-1-3 08:01:35 | 显示全部楼层
如果关闭了中断,那中断报务程序嵌套哪里来.
回复

使用道具 举报

4

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-5-10
在线时间
21 小时
发表于 2017-1-12 17:49:18 | 显示全部楼层
我还是觉得简单的处理关中断比较好.可能外设来的数据源源不断取之不绝,就想要饮这一瓢,关了中断好好喝完再开也无妨嘛
回复

使用道具 举报

33

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2017-1-2
在线时间
31 小时
 楼主| 发表于 2017-1-17 13:14:48 | 显示全部楼层
正点原子 发表于 2017-1-2 20:33
关中断这是掩耳盗铃,你尽量简化中断服务函数,确保下一次中断来领时,该服务函数早就执行完了。就行了。

《STM32中文参考手册》IIC的时钟SCL和数据SDA两个口的GPIO模式都是 开漏复用输出。
而给的历程里用的SDA是上下拉输入和推挽输出,SCL也是推挽输出。为什么???
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2012-12-16
在线时间
5 小时
发表于 2017-5-7 11:20:29 | 显示全部楼层
正点原子 发表于 2017-1-2 20:33
关中断这是掩耳盗铃,你尽量简化中断服务函数,确保下一次中断来领时,该服务函数早就执行完了。就行了。

你好,关中断这个问题我也有些搞不清楚,以前51单片机的中断处理过程好像是进入isr,首先关中断,具体中断程序处理,开中断,中断返回,我看了咱们开发板的例程,处理过程基本是进入中断服务函数后,GETITSTATUS,中断处理,最后清中断标志,中断返回,请问该如何理解这种处理的差异,或者说stm32为何没有首先关中断,是为了中断嵌套或其他吗,
回复

使用道具 举报

1

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2017-4-8
在线时间
13 小时
发表于 2017-5-7 20:26:56 | 显示全部楼层
maverics 发表于 2017-5-7 11:20
你好,关中断这个问题我也有些搞不清楚,以前51单片机的中断处理过程好像是进入isr,首先关中断,具体中 ...

首先,STM32的处理速度比51高得多,不需要关中断再去执行中断函数同时也是为了中断的嵌套。GETITSTATUS是为了确保该中断的确被触发。清中断标志之后才能继续正常执行程序,否则硬件会卡死在中断等待清除标志。
回复

使用道具 举报

16

主题

75

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2018-4-16
在线时间
77 小时
发表于 2018-6-19 13:36:44 | 显示全部楼层
firing00 发表于 2017-1-17 13:14
《STM32中文参考手册》IIC的时钟SCL和数据SDA两个口的GPIO模式都是 开漏复用输出。
而给的历程里用的SDA ...

开漏输出是准双向的 GPIO 口,开漏输出需要外部电路支持,需要外部接上拉电阻。如果没有上拉电阻,只能通过MCU 把推挽输出和上拉输入频繁切换才能使用。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 05:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表