8、串口(下)
4 USART配置
4.1 USART/UART异步通信配置
1、配置串口工作参数:HAL_UART_Init()
2、串口底层初始化:HAL_UART_MspInit()
3、开启串口异步接收中断:HAL_UART_Receive_IT()
4、设置优先级,使能中断:HAL_NVIC_SetPriority()、HAL_NVIC_EnableIRQ()
5、编写中断服务函数:USARTx_IRQHandler()、USARTx_IRQHandler()
6、串口数据发送:HAL_UART_Transmit()
4.2 相关函数
1、配置串口工作参数函数HAL_UART_Init(),其函数原型为:
HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
其返回值为枚举类型,可能值有
HAL_OK:配置成功
HAL_ERROR:配置失败
HAL_TIMEOUT:配置超时
HAL_BUSY:串口正忙
内部参数UART_HandleTypeDef为嵌套结构体,其内部关键结构体成员为 USART_TypeDef *Instance和UART_InitTypeDef Init,分别用于配置外设基址和通信参数。
对于外设基址,可选值有USART1~3、UART4、5。
而对于通信参数,其内部关键成员和可选值如下所示:
成员名称 | 类型 | 功能 | 可选值 |
BaudRate | uint32_t | 设定串口通信速率 | 任意在硬件范围内的数值,常为115200 |
WordLength | uint32_t | 设定数据位长度 | UART_WORDLEGTH_8B:8位 UART_WORDLENGTH_9B :9位 |
StopBits | uint32_t | 设定停止位长度 | UART_STOPBITS_1:1位 UART_STOPBITS_0_5:0.5位 UART_STOPBITS_1_5:1.5位 UART_STOPBITS_2:2位 |
Parity | uint32_t | 设置校验模式 | UART_PARITY_NONE:无校验 UART_PARITY_EVEN:偶校验 UART_PARITY_ODD:奇校验 |
Mode | uint32_t | 设置收发模式 | UART_MODE_TX:仅发送 UART_MODE_RX:仅接收 UART_MODE_TX_RX:同时接收发送 |
HwFlowCtl | uint32_t | 设置硬件流控 | UART_HWCONTROL_NONE:不用硬件流控 UART_HWCONTROL_RTS:使能RTS流控 UART_HWCONTROL_CTS:使能CTS流控 UART_HWCONTROL_RTS_CTS:使能RTS和CTS流控 |
2、串口底层初始化函数HAL_UART_MspInit(),该函数被弱定义,允许用户重定义,该函数在HAL_UART_Init()中已调用,无需单独调用。
3、串口异步接收中断开启函数HAL_UART_Receive_IT(),函数原型为
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
其中pData用以存放收到的数据,Size表示期待接收的字节数。
4、配套回调函数HAL_UART_RxCpltCallback(),函数原型为
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
由于HAL_UART_Receive_IT()是一次性的,若要持续不断接收数据,需要在回调函数中再次调用接收中断函数。
5、串口数据发送函数HAL_UART_Transmit(),函数原型为
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
其中pData表示要发送的数据,Size表示发送数据的字节数,Timeout表示设置的超时时间(以毫秒为单位)。
该函数以阻塞方式发送数据,当数据过大时会占用大量CPU资源。
6、中断模式串口数据发送函数HAL_UART_Transmit_IT(),函数原型为
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
7、DMA模式串口数据发送函数HAL_UART_Transmit_DMA(),其函数原型为
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
在使用该模式前需要提前分配DMA通道且数据缓冲区必须保持有效
5 IO引脚复用
5.1 通用和复用
通用:IO端口的输入或输出由GPIO外设控制
复用:IO端口的输入或输出由其他外设(USART、DMA、ADC)等控制
5.2 复用配置步骤
1、使能GPIO端口时钟
2、使能对应复用功能的外设时钟
3、配置GPIO的引脚模式(输出:一般配置为复用推挽,输入:一般配置为浮空输入或上/下拉的输入,开漏总线:配置为复用开漏输出)
5.3 重映射
同一时间一个IO引脚只能使用一种复用功能,否则会发生复用功能冲突问题,当发生冲突时,需要使用重映射,将冲突功能转移到其他引脚。重映射需要通过AFIO的配置实现。
重映射的步骤如下:
一、使能AFIO时钟
二、调用重映射宏。命名格式为__HAL_AFIO_REMAP_PPP_MMM,其中PPP为外设名称,MMM为重映射模式,分为:1、完全重映射:ENABLE;2、部分重映射:PARTIAL;3、禁用:DISABLE
三、后续配置。重映射后需对新的备用引脚进行GPIO初始化,配置为复用功能模式。

浙公网安备 33010602011771号