USART也叫通用同步/异步串行接收/发送器。USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。和UART(通用异步收发器)一样也是一种通用串行接口。而UART仅支持异步通信方式。
stm32 串口工作方式:
阻塞方式
简单理解就是在while(1)中一直等待,只要没有数据来,就会一直等待,特别浪费CPU资源。
(回环测试)
配置过程:我们选择的是USART,这里我们选择异步通信就可以了。
Asynchronous 异步通信
Synchronous 同步通信
配置波特率、数据宽度、校验位、停止位,数据的方向。
我们看一下生成的代码:
串口配置初始化:
GPIO初始化 A9 A10 初始GPIO时钟、UART时钟 A9(TX)为复用推挽输出
常用串口的接口函数:
阻塞模式的接收函数:HAL_UART_Receive()函数
参数1 串口的句柄
参数2 一个数组
参数3 数组长度
参数4 接收数据等待时间
阻塞模式的发送函数:HAL_UART_Transmit()函数,参数与接收函数一样。
具体操作:
在主函数中 ,定义一个接收数组
在while(1)中
下载代码,看实现结果:
串口中断方式实现
回环测试+串口控制LED的亮灭
配置过程:与阻塞方式不同的就是使能中断。
生成代码:串口中断配置,这里与阻塞方式对比,不难发现,这里使能了中断优先级、中断向量
生成的串口中断触发函数
进入HAL_UART_IRQHandler函数 在这里调用了UART_Receive_IT函数
这个函数里面对数据数组进行处理,并且调用HAL_UART_RxCpltCallback函数
非阻塞串口发送数据函数 HAL_UART_Transmit_IT()
阻塞串口接收数据函数,HAL_UART_Receive_IT()确切的说是使能了串口中断接收函数,因为这个函数调用了UART_Start_Receive_IT函数。
进入UART_Start_Receive_IT函数,这里面对接收的数据,数据的大小进行操作,并且使能了串口接收中断。所以HAL_UART_Receive_IT也就使能了串口接收中断。
具体实现如下:
使能串口接收
回环测试和LED操作在回调函数操作:
Strncmp函数
用来比较指定长度两个字符串的大小
头 文 件:#include <string.h>
返 回 值:(与strncmp相同)str1 = str2 则返回0,
str1 > str2 则返回大于0的值,
str1 < str2 则返回小于0的值
实现结果:
空闲中断+串口DMA
配置过程:相关时钟配置,不论述了,使能DMA,串口DMA通道是固定的。等下面复习到DMA,在为大家说明一下。这里面对DMA的模式进行选择,选择正常模式,数据运输方向外设到寄存器、寄存器到外设。选择数据宽度为1个字节。
生成代码如下:
dma.c文件 使能DMA时钟、使能DMA通道、DMA中断
uart.c文件 HAL_UART_MspInit函数 对GPIOA时钟使能、串口时钟使能、配置GPIO
对DMA 进行相关配置 包括通道、数据运输方向、传输周期、数据宽度等相关操作。这里面调用了
__HAL_LINKDMA()函数
__HAL_LINKDMA()函数,(确切的说是宏),可以理解为将UART与DMA连接起来。
进行使用空闲中断+DMA
首先在UART.c 文件的MX_USART1_UART_Init函数中进行操作
系统一上电,执行startup文件,然后执行main.c,在这面main.c文件中会调用MX_USART1_UART_Init函数,所以在进行串口的初始化后,要使能空闲中断、串口DMA中断。
Uart.h 变量的声明
在UART.c文件中
HAL_UART_Receive_DMA()函数和HAL_UART_Receive_IT函数用法差不多。
__HAL_UART_ENABLE_IT这个宏的操作,这个宏在串口发送数据的函数中调用过,对特殊中断进行使能
参数1 句柄
参数2 特殊中断
然后,在触发函数中操作
因为我们是使用串口的空闲中断,将数据通过DMA传输给SRAM的,所以我们要在串口的触发函数进行操作。
主函数发送数据
实现结果: