Bootstrap

stm32 HAL库 UART 笔记

 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的,所以我们要在串口的触发函数进行操作。

主函数发送数据

实现结果:

        ​​​​​​​        

;