前言
最近正在学习 STM32 HAL库,因此顺便记录下一些常用的函数供后续复习速查使用。
GPIO
GPIO所有相关函数如下: 1
2
3
4
5
6
7
8void 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 | typedef struct |
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 | typedef struct __UART_HandleTypeDef |
串口收发函数
1 | HAL_UART_Transmit(); //串口发送数据,使用超时管理机制 |
串口发送数据
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 | HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); //串口发送中断回调函数 |
函数形参都是 UART 别名,只介绍主要用到的函数功能:
- 串口接收中断回调函数(HAL_UART_RxCpltCallback):串口中断接收完成之后,会进入该函数,该函数为空函数,用户需自行修改
- 串口中断处理函数(HAL_UART_IRQHandler):判断是发送中断还是接收中断,然后进行数据的发送和接收,在中断服务函数中使用。如果接收数据,则会进行接收中断处理函数;如果发送数据,则会进行发送中断处理函数
串口查询函数
HAL_UART_GetState()
判断UART的接收是否结束,或者发送数据是否忙碌