0%

STM32 HAL库函数

前言

最近正在学习 STM32 HAL库,因此顺便记录下一些常用的函数供后续复习速查使用。

GPIO

GPIO所有相关函数如下:

1
2
3
4
5
6
7
8
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

GPIO初始化

HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)

CubeMx 会帮我们完成该部分,我们也可以手动配置:

1
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
1
2
3
4
5
6
7
typedef struct
{
uint32_t Pin; /* 选择引脚 */
uint32_t Mode; /* 设置引脚模式 */
uint32_t Pull; /* 引脚是否上拉或下拉 */
uint32_t Speed; /* 设置引脚速度 */
} GPIO_InitTypeDef;

GPIO复位

HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)

作用:复位某个引脚,示例:

1
HAL_GPIO_Init(GPIOC, GPIO_PIN_4);

读引脚

HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

作用:读引脚电平状态,返回1或0。参数前文已出现过,不赘述

写引脚

HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

作用:写引脚电平状态,可写0或1,示例:

1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1,0);

翻转引脚电平状态

HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

作用:翻转引脚电平状态,参数前文已出现过,不赘述

锁引脚

HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

作用:锁住引脚电平,参数前文已出现过,不赘述

中断服务函数

HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)

作用:判断是几号线中断,清除中断标识位,然后调用中断回调函数 HAL_GPIO_EXTI_Callback()

中断回调函数

HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

作用:中断服务函数,CubeMX中在gpio.c生成的该函数是 weak 版本的,这意味着我们可以在main.c中定义一个函数名相同的函数覆盖。


UART / USART

  • UART(通用异步收发器)仅支持异步通信。这意味着数据传输时,发送方和接收方并不共享时钟信号。它们通过设定一致的波特率来保持通信的同步性。虽然这种方式简化了通信线路,但波特率的偏差可能导致数据传输错误。

  • USART(通用同步/异步收发器)支持异步通信和同步通信。与UART的异步模式相同,USART也可以不使用时钟信号传输数据。它还支持同步模式,此时,发送端和接收端通过共享同一时钟信号来实现数据同步。同步通信能够大幅提高传输速度,并减少波特率差异带来的错误。

UART结构体定义

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
typedef struct __UART_HandleTypeDef
{
USART_TypeDef *Instance; /* UART 寄存器地址 */
UART_InitTypeDef Init; /* UART 通信参数*/
UART_AdvFeatureInitTypeDef AdvancedInit; /* UART 高级功能初始化参数 */
uint8_t *pTxBuffPtr; /*指向 UART Tx传输缓冲区的指针 */
uint16_t TxXferSize; /* UART Tx传输大小 */
__IO uint16_t TxXferCount; /* UART Tx传输计数器 */
uint8_t *pRxBuffPtr; /*指向 UART Rx 传输缓冲区的指针 */
uint16_t RxXferSize; /* UART Rx传输大小 */
__IO uint16_t RxXferCount; /* UART Rx传输计数器 */
uint16_t Mask; /* UART Rx RDR register mask */
uint32_t FifoMode; /* Specifies if the FIFO mode is being used. This parameter can be a value of @ref UARTEx_FIFO_mode. */
uint16_t NbRxDataToProcess; /* Number of data to process during RX ISR execution */
uint16_t NbTxDataToProcess; /* Number of data to process during TX ISR execution */
__IO HAL_UART_RxTypeTypeDef ReceptionType; /* Type of ongoing reception */
void (*RxISR)(struct __UART_HandleTypeDef *huart); /* Function pointer on Rx IRQ handler */
void (*TxISR)(struct __UART_HandleTypeDef *huart); /* Function pointer on Tx IRQ handler */
DMA_HandleTypeDef *hdmatx; /* UART Tx DMA句柄参数 */
DMA_HandleTypeDef *hdmarx; /* UART Rx DMA句柄参数 */
HAL_LockTypeDef Lock; /* 锁定对象(项目) */
__IO HAL_UART_StateTypeDef gState; /* 与全局句柄管理相关的UART状态信息,也与Tx操作相关。这个参数可以是@ref HAL_UART_StateTypeDef */
__IO HAL_UART_StateTypeDef RxState; /* 与Rx操作相关的UART状态信息。这参数可以是@ref HAL_UART_StateTypeDef的值 */
__IO uint32_t ErrorCode; /* UART Error code */
} UART_HandleTypeDef;

串口收发函数

1
2
3
4
5
6
HAL_UART_Transmit();     //串口发送数据,使用超时管理机制 
HAL_UART_Receive(); //串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT(); //串口中断模式发送
HAL_UART_Receive_IT(); //串口中断模式接收
HAL_UART_Transmit_DMA(); //串口DMA模式发送
HAL_UART_Transmit_DMA(); //串口DMA模式接收

串口发送数据

HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

功能:串口发送指定长度的数据。如果超时没发送完成,则返回超时标志(HAL_TIMEOUT)。

参数:

  • UART_HandleTypeDef *huart:串口别名huart
  • uint8_t *pData:发送的数据
  • uint16_t Size:发送的字节数
  • uint32_t Timeout:最大发送时间

示例:

1
2
 /* 串口发送三个字节数据,最大传输时间0xffff */
HAL_UART_Transmit(&huart1, (uint8_t *)ZZX, 3, 0xffff);

串口接收数据用法一致,不再赘述

中断接收数据

HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

功能:串口中断接收,以中断方式接收指定长度数据。

参数:

  • UART_HandleTypeDef *huart:串口别名huart
  • uint8_t *pData:接收到的数据的存放地址
  • Size:接收的字节数

中断发送数据用法一致,不再赘述

串口中断函数

1
2
3
4
5
6
7
8
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);  //串口发送中断回调函数
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); //串口接收中断回调函数
HAL_UART_IRQHandler(UART_HandleTypeDef *huart); //串口中断处理函数

HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); //串口发送一半中断回调函数(用的较少)
HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数(用的较少)

HAL_UART_ErrorCallback();//串口接收错误函数

函数形参都是 UART 别名,只介绍主要用到的函数功能:

  • 串口接收中断回调函数(HAL_UART_RxCpltCallback):串口中断接收完成之后,会进入该函数,该函数为空函数,用户需自行修改
  • 串口中断处理函数(HAL_UART_IRQHandler):判断是发送中断还是接收中断,然后进行数据的发送和接收,在中断服务函数中使用。如果接收数据,则会进行接收中断处理函数;如果发送数据,则会进行发送中断处理函数

串口查询函数

HAL_UART_GetState()

判断UART的接收是否结束,或者发送数据是否忙碌