- USART
1、USART概念
USART:(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步串行接收/发送器
USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备
处理器与外部设备通信的两种方式:
并行通信(八车道)
-传输原理:数据各个位同时传输。
-优点:速度快
-缺点:占用引脚资源多
串行通信(单车道)
-传输原理:数据按位顺序传输。
-优点:占用引脚资源少
-缺点:速度相对较慢
串行通信按传送方向分:
a.单工:
数据传输只支持数据在一个方向上传输(收音机、遥控器)
b.半双工:
允许数据在两个方向上传输,但是,在某一时刻,只允许数
据在一个方向上传输,它实际上是一种切换方向的单工通信;(对讲机)
c.全双工:
允许数据同时在两个方向上传输,因此,全双工通信是两个
单工通信方式的结合,它要求发送设备和接收设备都有独立
的接收和发送能力。(电话机)
2、STM32串口
USART习惯叫为串口,串口为全双工通信
串口信号线分析
TXD 发送数据 Transmit(tx) Data 简写形式 (TX T TD)
RXD 接受数据 Receive(rx) Data 简写形式 (RX R RD)
连接方式
MCU MCU
TXD-------------------------------------->RXD
RXD<-------------------------------------TXD
STM32串口异步通信定义的参数传送格式:
起始位
数据位(8位或者9位)
奇偶校验位(第9位)
停止位(1,1.5,2位)
波特率设置
- 起始位:发送器是通过发送起始位而开始一个字符的传送。起始位使数据线处于“space”状态
- 数据位:起始位之后就传送数据位。在数据位中,低位在前(左),高位在后(右)。由于字符编码方式的不同,数据位可以是5、6、7、8、9位。
- 奇偶校验位:用于对字符传送作正确性检查,因
此奇偶校验位是可选择的,共有3种可能,即奇校验、偶校验和无校验,由用户根据需要选定。
- 停止位:停止位在最后,用以标志一个字符传送的结束,它对应于mark状态。停止位可能是1、1.5或2位,在实际应用中根据需要确定
- 串行通信的传送速率:在串行通信中,数据是按位进行传送的,因此传送速率用每秒钟传送格式位的数目来表示,称之为波特率(band rate)。每秒传送一个格式位就是1波特。
bps:每秒传输多少比特位数据
9600bps:每秒传输9600位数据,波特率参考值
注意:两个MCU之间进行通信,数据帧格式及波特率必须是相同的。
3、USART1配置流程
串口1配置流程所需要的库函数:stm32f4xx_usart.c
- 理解电路原理图
PA9 ---- USART1_TX(发送端)
PA10 ---- USART1_RX(接收端)
2、 串口时钟使能,GPIO 时钟使能。
3、设置引脚复用器映射:调用 GPIO_PinAFConfig 函数。
4、GPIO 初始化设置:要设置模式为复用功能。
5、串口参数初始化:设置波特率,字长,奇偶校验等参数。
6、开启中断并且初始化 NVIC,使能中断(如果需要开启串口中断才需要这个步骤)。
7、配置为接收中断(表示有数据过来,CPU要中断进行接收)
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
- 使能串口。
USART_Cmd(USART1, ENABLE);
9、编写中断处理函数:函数名格式为 USARTx_IRQHandler(x 对应串口号)。
接收数据
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
发送数据函数
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
- 串口使用方法
- 安装串口驱动:ch341ser.exe(路径:D:\GZ2162文件\GZ2162期\14-STM32\006\资料\stc-isp-15xx-v6.88J\USB to UART Driver\CH340_CH341)
- 软件使用
查看设备管理的COM口
6、函数说明
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
函数功能:USART初始化
返回值:无
USART_TypeDef* USARTx:哪个串口
USART_InitTypeDef* USART_InitStruct:串口结构体
typedef struct
{
uint32_t USART_BaudRate; //波特率
uint16_t USART_WordLength; //字长
uint16_t USART_StopBits; //停止位
uint16_t USART_Parity; //奇偶校验位
uint16_t USART_Mode; //模式
uint16_t USART_HardwareFlowControl; //硬件控制流
} USART_InitTypeDef;
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)
函数说明:UASRT中断配置
返回值:无
USART_TypeDef* USARTx:哪个串口
uint16_t USART_IT:选择中断类型
FunctionalState NewState:是否使能
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState)
函数说明:UASRT使能
返回值:无
USART_TypeDef* USARTx:哪个串口
FunctionalState NewState:是否使能
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
函数说明:USART接收数据
返回值:接收的数据
USART_TypeDef* USARTx:哪个串口
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
函数说明:USART发送数据函数
返回值:无
USART_TypeDef* USARTx:哪个串口
uint16_t Data:发送的数据
- 自定义数据协议
自定义数据协议指的是在某类产品当中,定义数据包,通过传输不同的数据包,响应不同的硬件,在不同的公司自定义的数据协议包是不一样。
1.格式
简化版
帧头 - 长度 - 数据 xx xx - 校验 - 帧尾
复杂版
帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾
举例:
HCL11:表示亮LED0灯;HCL10:表示灭LED0灯;
H C L 1 1 :
帧头 命令 硬件类型 第几个灯 灯状态 帧尾
三、技术应用
1、收银机通过串口与下位机进行通信
- 共享单车、汽车定位器、公交车等
在共享单车、汽车定位器、公交车等相关的电子产品中会GPS模块,GPS模块通过串口方式与MCU进行连接,GPS通过串口将定位的数据发达给MCU,MCU做出运算,并通过GPRS发送的服务器
#include "usart.h"
/*****************************************
引脚说明
PA9 ---- USART1_TX(发送端)
PA10 ---- USART1_RX(接收端)
******************************************/
void Usart1_Init(int MyBaudRate)
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//串口时钟使能,GPIO 时钟使能。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//使能GPIOA时钟:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
//GPIOA9复用映射到USART1 引脚选定复用的功能
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
//GPIOA10复用映射到USART1 引脚选定复用的功能
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
//GPIO 初始化设置:要设置模式为复用功能。
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10; //引脚9 10
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; //复用模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽式
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //50MHZ
GPIO_Init(GPIOA,&GPIO_InitStruct);
USART_InitStruct.USART_BaudRate = MyBaudRate; //波特率
USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx; //全双工模式
USART_InitStruct.USART_Parity = USART_Parity_No; //无奇偶校验位
USART_InitStruct.USART_WordLength = USART_WordLength_8b; //数据位
USART_InitStruct.USART_StopBits = USART_StopBits_1; //停止位
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件控制流
//串口参数初始化:设置波特率,字长,奇偶校验等参数。
USART_Init(USART1, &USART_InitStruct);
//开启中断并且初始化 NVIC,
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn; //中断通道,中断通道在stm32f4xx.h文件当中查找
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2; //响应优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //使能通道
//3、启定时器中断,配置NVIC。
NVIC_Init(&NVIC_InitStruct);
//配置为接收中断(表示有数据过来,CPU要中断进行接收)
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//使能串口。
USART_Cmd(USART1, ENABLE);
}
#ifndef __USART_H
#define __USART_H
#include "stm32f4xx.h"
void Usart1_Init(int MyBaudRate);
#endif
#include "stm32f4xx.h"
#include "led.h"
#include "key.h"
#include "exti.h"
#include "delay.h"
#include "tim.h"
#include "pwm.h"
#include "usart.h"
void USART1_IRQHandler(void)
{
u8 data;
//判断接收标志位是否为1
if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
//清空接受标志位
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
//接受数据
data = USART_ReceiveData(USART1);
//把数据通过串口1发送出去
USART_SendData(USART1, data);
}
}
int main(void)
{
int key_count = 0;
//设置NVIC分组(一个工程只能设置一个分组)
//第二分组;抢占优先组取值范围:0~3 响应先组取值范围:0~3
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Led_Init();
Delay_Init();
Usart1_Init(115200);
while(1)
{
delay_s(1);
}
}