OpenEdv-开源电子网

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

STM32 串口通信学习笔记

[复制链接]

6

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-11-17
在线时间
9 小时
发表于 2014-5-16 16:15:32 | 显示全部楼层 |阅读模式

Stm32串口通信学习笔记

一,串口通信的配置过程(库函数)

1.定义与串口相关的初始化结构体

    GPIO_InitTypeDef  GPIO_InitStructure;//

      USART_InitTypeDef  USART_InitStructure;

      NVIC_InitTypeDef  NVIC_InitStructure;

通用IO口,串行接口.嵌套向量中断控制寄存器(NVIC)

2.配置与串口通信相关的时钟

   GPIO,USART,AFIO(复用端口)时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);

3.分别配置GPIO,USART,NVIC的结构体参数, 并根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

  

    //USART1_RX    PA.10

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOA, &GPIO_InitStructure); 

 

   //Usart1 NVIC 配置

 

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;

      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;      //

 

      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;               //IRQ通道使能

       NVIC_Init(&NVIC_InitStructure);     //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1

 

   //USART 初始化设置

  

      USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;

      USART_InitStructure.USART_WordLength=USART_WordLength_8b;

      USART_InitStructure.USART_StopBits = USART_StopBits_1;

      USART_InitStructure.USART_Parity = USART_Parity_No;

      USART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None;

      USART_InitStructure.USART_Mode =USART_Mode_Rx| USART_Mode_Tx;

 

USART_Init(USART1, &USART_InitStructure);

4开启中断,使能串口

   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断

  

   USART_Cmd(USART1, ENABLE);          //使能串口

5.写相应的,中断服务函数

注意:PC机向STM32发送数据时,要考虑到两点:

1.  PC机什么时候,发送数据结束

2.  stm32允许结束数据的大小

   当PC机发送完数据后,stm32如何知道?我们假设PC机发送数据已回车键结束,那么PC的最后一个字符一定是/n(0x0a);所以我们可以通过检测每一个字节的数据是否为0x0a,若是则接受完成.若不是则继续接受.STM32接受数据时,如何知道接受寄存器已满,我们假设接受寄存器的容量为64bit,并且我们可以设计一个标志,当有一个数据存储的接受寄存器是,标志加1,那么当标志为0x40,表示STM32接受寄存器已满,不允许继续接受,此时接收结束.


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

6

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-11-17
在线时间
9 小时
 楼主| 发表于 2014-5-16 20:58:51 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
请问为什么把(USART_Rx_State&0x80)==0为什么改成USART_Rx_State!=0x80就不行啊???求解??
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-16 21:18:59 | 显示全部楼层
回复【3楼】loyforever:
---------------------------------
因为USART_Rx_State不可能等于0X80
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

6

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-11-17
在线时间
9 小时
 楼主| 发表于 2014-5-17 18:26:46 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
为什么啊??难道0x80不是以8位的方式储存
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-17 20:23:59 | 显示全部楼层
回复【6楼】loyforever:
---------------------------------
为什么:USART_Rx_State会等于0X80??
为什么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-11-17
在线时间
9 小时
 楼主| 发表于 2014-5-17 22:45:16 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
STM32接受到了0x0d表示接受完成,此时USART_Rx_State=0x80;那么判断USART_Rx_State!=0x80就表示没有接受完成,这样不是可以吗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-18 00:10:12 | 显示全部楼层
 回复【8楼】 loyforever :
---------------------------------
你仿真看看吧。。。
你还是没理解精髓。。。
这个USART_Rx_State,就算接收完成了也不可能是0X80这个值。。。
因为这个USART_Rx_State,不只是第七位有值!!!
你再看看我们对 [mw_shl_code=c,true]USART_RX_STA的解释。好好看看其他位的意义。。。[/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code]
[mw_shl_code=c,true]//串口1中断服务程序 //注意,读取USARTx->SR能避免莫名其妙的错误 u8 USART_RX_BUF[64]; //接收缓冲,最大64个字节. //接收状态 //bit7,接收完成标志 //bit6,接收到0x0d //bit5~0,接收到的有效字节数目 u8 USART_RX_STA=0; //接收状态标记 [/mw_shl_code]


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

使用道具 举报

17

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2014-10-7
在线时间
0 小时
发表于 2014-10-15 15:55:59 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
问一下原子哥,0x80是怎么来的?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-15 23:31:09 | 显示全部楼层
回复【10楼】ddong610:
---------------------------------
自己定义的协议。
//接收状态
//bit7,接收完成标志
//bit6,接收到0x0d
//bit5~0,接收到的有效字节数目
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2014-10-22
在线时间
0 小时
发表于 2014-10-28 13:54:12 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
为什么可以这样定义呢?计算机是怎么识别这个定义啊?新人
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-28 23:33:20 | 显示全部楼层
回复【12楼】14haonan:
---------------------------------
自己规定自己去实现的。

比如你家里在哪里挖个茅坑,是你可以决定的。
然后你就去茅坑上厕所,也是你可以决定的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2014-12-1
在线时间
12 小时
发表于 2014-12-1 11:56:08 | 显示全部楼层
回复【12楼】14haonan:
---------------------------------
 在 USART1_IRQHandler(void)这个程序中定义的
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2014-12-1
在线时间
12 小时
发表于 2014-12-1 11:58:35 | 显示全部楼层
回复【12楼】14haonan:
---------------------------------
if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x80; //接收完成了(如果接收到0x0a,则将USART_RX_STA第七位置1,以便查询,实现了寄存器功能) 
}else //还没收到0X0D
{
if(res==0x0d)USART_RX_STA|=0x40;//(如果接收到0x0d,则将USART_RX_STA第六位置1,以便查询,实现了寄存器功能)
else
{
USART_RX_BUF[USART_RX_STA&0X3F]=res;//(将接收到的数据放到数组中,方括号中是从USART_RX_STA中读取到的数据个数,作为数组的序号)
USART_RX_STA++;//(实现了寄存器的统计数据个数的功能)
if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 12:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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