OpenEdv-开源电子网

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

串口实验,为什么不用清中断标志?

[复制链接]

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
发表于 2014-6-19 14:00:05 | 显示全部楼层 |阅读模式
5金钱
1,看了原子哥的串口实验,发现进入中断后没有清中断标志的语句,这是为什么呢?
2,main.c中,while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);这个语句感觉没有必要,无论USART_FLAG_TC是什么状态,程序都会直接跳过,难道这中间还有什么玄妙??


main.c中的死循环:
[mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] while(1) { if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度 printf("\r\n您发送的消息为:\r\n\r\n"); for(t=0;t<len;t++) { USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束 } printf("\r\n\r\n");//插入换行 USART_RX_STA=0; }else { times++; if(times%5000==0) { printf("\r\n战舰STM32开发板 串口实验\r\n"); printf("正点原子@ALIENTEK\r\n\r\n"); } if(times%200==0)printf("请输入数据,以回车键结束\n"); if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行. delay_ms(10); } } [/mw_shl_code]
中断服务函数:
[mw_shl_code=c,true]void USART1_IRQHandler(void) //串口1中断服务程序 { u8 Res; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾) // typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; { Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据 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;//接收数据错误,重新开始接收 } } } } }[/mw_shl_code]

最佳答案

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

1,重新看了一次指南,已经明白。 应该是这句,Res =USART_ReceiveData(USART1);//(USART1->DR);   //读取接收到的数据 代表读取了DR,所以清零了吧?
本人新人,各位多包涵!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-19 14:00:06 | 显示全部楼层
1,重新看了一次指南,已经明白。
应该是这句,Res =USART_ReceiveData(USART1);//(USART1->DR);   //读取接收到的数据
代表读取了DR,所以清零了吧?
本人新人,各位多包涵!
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2014-6-19 14:00:06 | 显示全部楼层
回复【5楼】x1213378204:
---------------------------------
刚才旺旺问了下原子家的技术     读取数据后   硬件自动清除标志位的
学无止境
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2014-6-19 14:00:06 | 显示全部楼层
回复【8楼】x1213378204:
---------------------------------
while();语句中如果括号内为真,就停在这里,等括号内不为真就执行下面的语句。好好看一下C语言的while()语句吧
开往春天的手扶拖拉机
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-19 14:18:55 | 显示全部楼层
2,这个只是读标志,这个语句应该木有什么作用吧,不写没有影响吧?
本人新人,各位多包涵!
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2014-6-19 17:51:01 | 显示全部楼层
刚与楼主发现同样的问题

关注之

楼主要是想通了   还请指点一二
学无止境
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-19 17:58:47 | 显示全部楼层
回复【4楼】jermy_z:
---------------------------------
你的是问题1还是问题2?
本人新人,各位多包涵!
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2014-6-19 18:04:08 | 显示全部楼层
2  是防止缓存区仍然有数据   所以等待发送完毕

你每次都没有数据残留在缓存区

所以  自动跳过
学无止境
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-20 09:05:42 | 显示全部楼层
回复【7楼】jermy_z:
---------------------------------
还是木有明白,无论数据有无残留,都会跳过吧,因为while()后面没有处理语句,所以这个木有等待数据发送完毕的功能吧?
本人新人,各位多包涵!
回复

使用道具 举报

8

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-3-29
在线时间
17 小时
发表于 2014-6-20 19:24:51 | 显示全部楼层
我没有看懂串口中断程序中,if(USART_RX_STA&0x4000)//接收到了0x0d,这句话是如何判断0X0D和0X0A的?因为0x400,和0X0D有什么关系?
回复

使用道具 举报

29

主题

311

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1530
金钱
1530
注册时间
2012-9-4
在线时间
262 小时
发表于 2014-6-21 17:35:41 | 显示全部楼层
回复【9楼】jiming716:
---------------------------------
你其实可以带一些数字进去,自己算一下,你就知道原子哥写这些函数的精妙之处了..........
STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2014-6-21 20:57:13 | 显示全部楼层
回复【9楼】jiming716:
---------------------------------
这句话的前提是串口接收到一个数据了,但是我们不知道发送是否完成,如果串口发送完成的话最后一定是0X0D,0X0A这两个数据。所以判断是否发送完成我们得对每一个接收到的数据判断是否为0X0D,如果是的话就USART_RX_STA|0X4000,表示接收到0X0D。但是只接收到0X0D并不能代表发送完成,因为还没有结束到0X0A。所以一个数据发来后我们要判断是否为0X0A,如果为0X0A则USART_RX_STA|0X8000说明串口接收完成。
开往春天的手扶拖拉机
回复

使用道具 举报

8

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-3-29
在线时间
17 小时
发表于 2014-6-22 11:23:49 | 显示全部楼层
接收到的数据是存在Res中的,而USART_RX_STA中存的是状态,定义的初始值是什么,和USART_RX_STA|0X4000运算后怎么判断的呢?0X0D(0000 1101)  0X0A(0000 1010)
回复

使用道具 举报

38

主题

165

帖子

0

精华

高级会员

Rank: 4

积分
646
金钱
646
注册时间
2014-3-5
在线时间
67 小时
发表于 2014-6-22 13:49:45 | 显示全部楼层
我想知道楼主这个代码是怎么复制成这个格式的!
Hard work!
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-23 10:35:15 | 显示全部楼层
回复【14楼】杂牌电子:
---------------------------------
发帖的时候,点击发送代码那个图标
本人新人,各位多包涵!
回复

使用道具 举报

38

主题

165

帖子

0

精华

高级会员

Rank: 4

积分
646
金钱
646
注册时间
2014-3-5
在线时间
67 小时
发表于 2014-6-24 15:45:56 | 显示全部楼层
回复【15楼】x1213378204:
---------------------------------
谢谢了!
Hard work!
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-7-4
在线时间
0 小时
发表于 2015-9-7 22:19:55 | 显示全部楼层


我也遇到这个问题了,在主函数里面让led每隔300ms取反,中断里面用了两种方法清除中断标志 :
1.USART_ClearITPendingBit(USART1,USART1_IRQn);
2.USART_ClearFlag(USART1,USART_FLAG_RXNE);
但是注释掉以后同样的频率闪烁,然后找到了这个,瞬间明白了什么,2333333333
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-7-4
在线时间
0 小时
发表于 2015-9-7 22:23:24 | 显示全部楼层
回复【17楼】stm_init():
---------------------------------
明白一点,如果不读取SR寄存器里面的值,注释掉:USART_SendData(USART1,Res);并且不使用上面两句清除标志位(两种方法的区别可以看http://zhidao.baidu.com/link?url=yJw4vYaSLrsNMPWzDuIaSJugfAffnBGcfp9jEhy5yvDv-myE4v03qBiBi8vM3eAxplFUzWuooUetPQCnEL9cU_),程序就会一直在中断函数里。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 11:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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