OpenEdv-开源电子网

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

stm32的suart的初始化问题

[复制链接]

31

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2010-12-14
在线时间
5 小时
发表于 2011-1-18 21:47:54 | 显示全部楼层 |阅读模式
在STM32给的例程的串口例程中 USART_RX_STA是内部的寄存器?还是定义的变量?
怎么利用 len=USART_RX_STA&0x3f;//得到此次接收到的数据长度(len是定义的变量)
在串口中断程序中void USART1_IRQHandler(void)
{
 u8 res;    
 if(USART1->SR&(1<<5))//接收到数据
 { 
  res=USART1->DR;
  if((USART_RX_STA&0x80)==0)//接收未完成     
  {
   if(USART_RX_STA&0x40)//接收到了0x0d
   {
    if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
    else USART_RX_STA|=0x80; //接收完成了
   }else //还没收到0X0D
   { 
    if(res==0x0d)USART_RX_STA|=0x40;
    else
    {
     USART_RX_BUF[USART_RX_STA&0X3F]=res;
     USART_RX_STA++;
     if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收  
    }  
   }
  }                  
 }             
}
因为不知道 USART_RX_STA是什么 所以这段程序读不懂?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-1-18 23:09:42 | 显示全部楼层
回复【楼主位】shilang0304:
-------------------------------
USART_RX_STA是我自己定义的一个全局变量,不是内部的寄存器。该变量用于记录串口接收的相关状态。
这个变量的各位描述如下:
//bit7,接收完成标志
//bit6,接收到0x0d
//bit5~0,接收到的有效字节数目

之所以定义这个变量,是为了让我们的串口接收方便,大家也可以定义3个变量,一个用于存放接收完的标志;一个用于存放是否收到0X0D;一个用于存放有效字节数目;但是这样会占用3个字节,有点浪费。所以我把它们放到一个u8型的变量里面,一来节约内存,而来方便管理。

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

31

主题

116

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2010-12-14
在线时间
5 小时
 楼主| 发表于 2011-1-19 13:44:38 | 显示全部楼层
回复【2楼】正点原子:
-------------------------------
if((USART_RX_STA&0x80)==0)//接收未完成?
if(USART_RX_STA&0x40)//接收到了0x0d  为什么要接受0X0d?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-1-19 14:03:29 | 显示全部楼层
回复【3楼】shilang0304:
-------------------------------
因为回车键的内码就是2个字节 0X0A+0X0D. 我是以回车键做结束的,所以收到0X0D才算接收完成.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2012-3-18
在线时间
0 小时
发表于 2012-3-21 08:36:58 | 显示全部楼层
回复【楼主位】shilang0304:
在STM32给的例程的串口例程中 USART_RX_STA是内部的寄存器?还是定义的变量?
怎么利用 len=USART_RX_STA&0x3f;//得到此次接收到的数据长度(len是定义的变量)
在串口中断程序中void USART1_IRQHandler(void)
{
 u8 res;     
 if(USART1->SR&(1<<5))//接收到数据
 {  
  res=USART1->DR; 
  if((USART_RX_STA&0x80)==0)//接收未完成     
  {
   if(USART_RX_STA&0x40)//接收到了0x0d
   {
    if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
    else USART_RX_STA|=0x80; //接收完成了 
   }else //还没收到0X0D
   { 
    if(res==0x0d)USART_RX_STA|=0x40;
    else
    {
     USART_RX_BUF[USA
......
---------------------------------
为什么可以由这个USART_RX_STA&0x3f而得到长度。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-21 08:45:04 | 显示全部楼层
回复【5楼】觋-拂晓:
---------------------------------
因为就是这么设计的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2011-2-24
在线时间
0 小时
发表于 2012-3-24 15:48:21 | 显示全部楼层
USART_RX_STA是自己定义的协议,pc要根据这个协议来主动发,这边负责按协议实现收的代码
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2011-2-24
在线时间
0 小时
发表于 2012-3-24 16:01:27 | 显示全部楼层
这里USART_RX_STA协议是:一串字符不能超过64个,以回车结束,回车为0d0a,od表结束,回车的0a放弃。所谓协议就是标志,2^6就是64,因此不能大于63
回复 支持 反对

使用道具 举报

22

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2012-3-18
在线时间
0 小时
发表于 2012-4-2 20:52:43 | 显示全部楼层
回复【8楼】dada21:
---------------------------------
u16 mantissa;   这句是定义的尾数部分   是什么意思啊   不就可以理解为小数部分吗    新手请教
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2012-12-6
在线时间
0 小时
发表于 2013-3-7 16:32:17 | 显示全部楼层
我也是刚接触stm32,最近在看出口实验(我用的是战舰版),我是这样理解“为什么可以由这个USART_RX_STA&0x3f而得到长度”这句话的:
一、USART_RX_STA:在usart.c文件中USART_RX_STA&0x80就规定USART_RX_STA的第7位为接收完成标志位(因为if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始 else USART_RX_STA|=0x80; //接收完成了)  同理ART_RX_STA的第6位表示接收到oxod。
二、关于“USART_RX_STA&0x3f”
     因为在main.c中在while语句中USART_RX_STA的第7位,已经是1,此时,USART_RX_STA的第5到0bit为接收到的数据长度(因为else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;)执行len=USART_RX_STA&0x3f后就计算出了,接收到数据的程度,

三、举例子
   USART_RX_STA=11 001,执行len=USART_RX_STA&0x3f后len=1.也就是说接收到一个数据。


这是我最近看代码的理解,如果有错误请高人指点,如果侥幸被我说对了,希望能够帮到刚刚接触到串口通讯初学者
万里长征第一步
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-7 17:58:23 | 显示全部楼层
回复【10楼】YBBXK100:
---------------------------------
理解正确。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2013-11-27
在线时间
0 小时
发表于 2014-3-16 20:08:19 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
原子哥,我对这个还是有点不理解。对于9楼举的那个例子,USART_RX_STA不是应该是8位的吗?9楼的前面省略了?应该是00011001?但是进入照9楼所说,while内USART_RX_STA最高位不是应该是1吗?00011001&00111111=00011001?不等于1啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-16 23:53:43 | 显示全部楼层
回复【12楼】上善若水19900927:
---------------------------------
电话我。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2013-11-27
在线时间
0 小时
发表于 2014-3-17 15:19:49 | 显示全部楼层
这个问题我也纠结了很久,最后想明白了。注意:USART_RX_STA的0~13位存放的是数据的个数,而不是数据。例如我现在接受了100个数据,那么在USART_RX_STA的0~13位存放的是100的二进制 00  0000  0110  0100 ,然后执行USART_RX_STA&0X3FFF,得出的结果为0110  0100 转换为十进制即为100,这就是接受到的数据个数。
回复 支持 反对

使用道具 举报

5

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2014-8-29
在线时间
11 小时
发表于 2014-10-4 17:42:51 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
天啊。。我找这段话好了好久!
有深圳的大牛带我飞吗?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 18:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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