STM32 USART

STM32标准库学习笔记-STM32 USART

通信接口

  • 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统
  • 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发
名称 引脚 双工 时钟 电平 设备
USART TX、RX 全双工 异步 单端 点对点
I2C SCL、SDA 半双工 同步 单端 多设备
SPI SCLK、MOSI、MISO、CS 全双工 同步 单端 多设备
CAN CAN_H、CAN_L 半双工 异步 差分 多设备
USB DP、DM 半双工 异步 差分 点对点

串口

  • 串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信
  • 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力

硬件电路

  • 简单双向串口通信有两根通信线(发送端TX和接收端RX)
  • TX与RX要交叉连接
  • 当只需单向的数据传输时,可以只接一根通信线
  • 当电平标准不一致时,需要加电平转换芯片

电平标准

电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:

  • TTL电平:+3.3V或+5V表示1,0V表示0
  • RS232电平:-3~-15V表示1,+3~+15V表示0
  • RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)

串口参数及时序

  • 波特率:串口通信的速率
  • 起始位:标志一个数据帧的开始,固定为低电平
  • 数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
  • 校验位:用于数据验证,根据数据位计算得来
  • 停止位:用于数据帧间隔,固定为高电平

USART简介

  • USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器
  • USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里
  • 自带波特率发生器,最高达4.5Mbits/s
  • 可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)
  • 可选校验位(无校验/奇校验/偶校验)
  • 支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN

实际外设: STM32F103C8T6 USART资源:USART1、USART2、USART3

更多USART的相关内容:STM32F10xxx参考手册(中文).pdf 页码516/手册25

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//数据接收全局变量
uint8_t Serial_RxData;
uint8_t Serial_RxFlag;

//时钟配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

//GPIO配置
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
    //TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
    //RX

//USART配置
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1, &USART_InitStructure);

//中断配置
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);

//USART使能
USART_Cmd(USART1, ENABLE);

//发送字节
void Serial_SendByte(uint8_t Byte)
{
    USART_SendData(USART1, Byte);
    while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

//返回接收数据
uint8_t Serial_GetRxData(void)
{
    return Serial_RxData;
}

void USART1_IRQHandler(void)
{
    if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
    {
        Serial_RxData = USART_ReceiveData(USART1);
        Serial_RxFlag = 1;
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
}
  • USART_InitTypeDef为USART配置结构体
    • USART_BaudRate为波特率:常用9600、115200等
    • USART_HardwareFlowControl为硬件流控制(一般不用)
    • USART_Mode为模式
    • USART_Parity为奇偶校验
    • USART_StopBits为停止位
    • USART_WordLength为字长
  • USART_ITConfig函数用于配置USART中断
  • USART_SendData函数用于发送数据
  • USART_ReceiveData函数用于读取接收到的数据
  • 获取USART标志位
    • USART_GetFlagStatus标志位
    • USART_GetITStatus中断标志位
USART_HardwareFlowControl 描述
USART_HardwareFlowControl_None ((uint16_t)0x0000) 关闭
USART_HardwareFlowControl_RTS ((uint16_t)0x0100) 发送可接收信号
USART_HardwareFlowControl_CTS ((uint16_t)0x0200) 接收可发送信号
USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300) 开启全部
USART_Mode 描述
USART_Mode_Rx ((uint16_t)0x0004) 发送
USART_Mode_Tx ((uint16_t)0x0008) 接收
USART_Parity 描述
USART_Parity_No ((uint16_t)0x0000) 不校验
USART_Parity_Even ((uint16_t)0x0400) 偶校验
USART_Parity_Odd ((uint16_t)0x0600) 奇校验
USART_StopBits 描述
USART_StopBits_1 ((uint16_t)0x0000) 1位停止位
USART_StopBits_0_5 ((uint16_t)0x1000) 0.5位停止位
USART_StopBits_2 ((uint16_t)0x2000) 2位停止位
USART_StopBits_1_5 ((uint16_t)0x3000) 1.5位停止位
USART_WordLength 描述
USART_WordLength_8b ((uint16_t)0x0000) 8位数据
USART_WordLength_9b ((uint16_t)0x1000) 9位数据
USART_ITs USART_Flags 描述
USART_IT_PE ((uint16_t)0x0028) USART_FLAG_PE ((uint16_t)0x0001) 奇偶检验错
USART_IT_TXE ((uint16_t)0x0727) USART_FLAG_TXE ((uint16_t)0x0080) 发送数据寄存器空
USART_IT_TC ((uint16_t)0x0626) USART_FLAG_TC ((uint16_t)0x0040) 发送完成
USART_IT_RXNE ((uint16_t)0x0525) USART_FLAG_RXNE ((uint16_t)0x0020) 接收数据就绪可读
USART_IT_IDLE ((uint16_t)0x0424) USART_FLAG_IDLE ((uint16_t)0x0010) 检测到空闲线路
USART_IT_LBD ((uint16_t)0x0846) USART_FLAG_LBD ((uint16_t)0x0100) 断开标志
USART_IT_CTS ((uint16_t)0x096A) USART_FLAG_CTS ((uint16_t)0x0200) CTS标志
USART_IT_ERR ((uint16_t)0x0060) 未开启USART_IT_ERR时,只能由USART_GetFlagStatus(USARTx,USART_Flag_ORE) 检测到USART_IT_ORE;在开启USART_IT_ERR后,才能被 USART_GetITStatus(USARTx,USART_IT_ORE) 检测到USART_IT_ORE;
USART_IT_ORE ((uint16_t)0x0360) USART_FLAG_ORE ((uint16_t)0x0008) 检测到数据溢出
USART_IT_NE ((uint16_t)0x0260) USART_FLAG_NE ((uint16_t)0x0004) 噪声标志
USART_IT_FE ((uint16_t)0x0160) USART_FLAG_FE ((uint16_t)0x0002) 帧错误

数据包设计

HEX固定包长

字符可变包长

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计