STM32学习——串口
USART通用同步异步收发器(Universal Synchronous Asynchronous Receiver Transmitter)是一串行通信设备,可以灵活地与外部设备进行进行**全双工信息交换**
UART(Universal Asynchronous Receiver Transmitter),它是在 USART 的基础上裁剪了同步通信功能,只保留异步通信功能我们平时使用的串口通信都是 UART
1.通信接口背景知识介绍
1.1通信双方的两种通信方式
-
串行通信
- 传输原理:数据按位顺序传输
- 优点:占用引脚资源少
- 缺点:速度相对较慢
-
并行通信
-
传输原理:数据各个位同时传输
-
优点:速度快
-
缺点:占用引脚资源多
-
1.2串行通信的分类
单工:数据只支持在一个方向上传输(看电视)
**半双工:**同一时刻只允许在一个方向传输(对讲机)
全双工:允许同时在两个方向上传输(电话)
1.3常见的串行通信接口
2.USART功能概述
任何 UART 双向通信至少需要 3 个引脚,数据发送引脚 TXD,数据接收引脚 RXD,数
据参考地 GND。串口连接必须共地!!!
这里解释下电平标准,根据使用使用的电平标准不同,可以分为 TTL 和 RS232 标准,因为控制器一般都是 TTL 标准,因此如果需要进行 RS232 通信时,一定要使用 R232转换器进行 TTL 和 RS232 的电平转换
3.STM32串口资源
- 全双工异步通信。
- 分数波特率发生器系统,提供精确的波特率。发送和接收共用的可编程波特率,最高可达4.5Mbits/s
- 可编程的数据字长度(8位或者9位);
- 可配置的停止位(支持1或者2位停止位);
- 可配置的使用DMA多缓冲器通信。
- 单独的发送器和接收器使能位。
- 检测标志:① 接受缓冲器 ②发送缓冲器空 ③传输结束标志
- 多个带标志的中断源。触发中断。
- 其他:校验控制,四个错误检测标志。
4.串口通信过程
5.STM32串口通信使用方法
串口通信需要定义的参数
- 起始位
- 数据位(8位/9位)
- 奇偶校验位
- 停止位
- 波特率设置(收发两端要一致)
6.串口通信相关函数
- 初始化函数 bsp_InitUart
- 第1步: 配置GPIO
- 打开 GPIO 时钟
- 打开 UART 时钟
- 配置 USART Tx 为复用功能
- 配置 USART Rx 为复用功能
- 第2步: 配置串口硬件参数
- 第3步: Usart1 NVIC 配置
- 第4步: 使能串口1
- 第1步: 配置GPIO
- 中断服务函数 USART1_IRQHandler
- 状态清零函数 Uart0_STA_Clr
- 打印输出函数 fput
- 数据发送函数 USART1_Send_Data
7.STM32F1的 USART 库
7.1对应库函数
-
使能 USART 时钟
下面的函数用于使能 USART1 的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USARTx,ENABLE)
下面的函数用于使能 USART2、USART3 UART4、UART5
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UARTx,ENABLE)
-
使能 GPIO APB2 时钟(GPIO 是挂载在 APB2 高速总线上的)
-
用函数 GPIO_Init()配置 GPIO 引脚,主要有以下两种配置方式,分别对应 RXD 和 TXD的引脚
输入:浮空,上拉
复用输出:复用推挽
-
外设复用功能配置外设的复用功能
-
对于其它外设(USART,SPI……)
- 通过结构体 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_xx 配置为具体的 AF 模式(xx 对应的 OD 为开漏,PP 为推挽)
- 调用函数 GPIO_Init()
-
通 过 函 数 USART_Init 配 置 BaudRate , WordLength , StopBits , Parity ,HardwareFlowControl,USART_Mode
-
如果需要使用中断,使用 NVIC_Init 函数进行配置,并通过 USART_ITConfig 使能相应中断。
-
通过函数 USART_Cmd 使能对应串口
-
7.2初始化和配置函数
下面是串口 1 的初始化函数,主要完成串口的设置。
/**/
/*******************************************************************************
* 函数名 :串口初始化函数
* 函数功能 :初始化USRAT1的硬件设备
* 形参 : 无
* 返回值 : 无
*******************************************************************************/
/**/
void bsp_InitUart1(uint32_t baud)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
#if EN_USART1_RX //如果使能了接收
NVIC_InitTypeDef NVIC_InitStructure;
#endif
/*TX=PA9 RX=PA10*/
/*配置GPIO*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE); //打开GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //打开串口时钟
/*配置PA9与PA10两个端口的复用功能*/
//TX发送
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; //PA9
GPIO_InitStructure.GPIO_Speed