HAL库函数
学习库函数最好的方法是看手册
# HAL库
# HAL_Delay
HAL 库提供了用于毫秒级延迟的函数:HAL_Delay 函数(使用_weak
修饰符说明该函数是可以用户重定义的)
__weak void HAL_Delay(uint32_t Delay)
函数名 | HAL_Delay |
---|---|
函数作用 | 使系统延迟对应的毫秒级时间 |
返回值 | void |
参数 | Delay,对应的延迟毫秒数,比如延迟 1 秒就为 1000 |
# HAL_GetTick
uwTick
变量中存储的是从STM32的 Systick 初始化以来所经过的时间(ms),uwTick
的存在相当于给整个程序提供了一个绝对的时间基准,访问其值可用如下函数:
函数名 | HAL_GetTick |
---|---|
函数作用 | 返回当前的uwTick 值 |
返回值 | 当前的uwTick 值 |
# GPIO 操作
# HAL_GPIO_WritePin
定义如下:
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
函数名 | HAL_GPIO_WritePin |
---|---|
函数作用 | 使得对应的引脚输出高电平或者低电平 |
返回值 | void |
参数 1:GPIOx | 对应 GPIO 总线,其中 x 可以是 A…I。例如 PH10,则输入 GPIOH |
参数 2:GPIO_Pin | 对应引脚数,可以是 0-15。例如 PH10,则输入 GPIO_PIN_10 |
参数 3:PinState | GPIO_PIN_RESET :输出低电平;GPIO_PIN_SET :输出高电平 |
# HAL_GPIO_TogglePin
定义如下:
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
函数名 | HAL_GPIO_TogglePin |
---|---|
函数作用 | 翻转对应引脚的电平 |
返回值 | void |
参数 1:GPIOx | 对应 GPIO 总线,其中 x 可以是 A…I。例如 PH10,则输入 GPIOH |
参数 2:GPIO_Pin | 对应引脚数。可以是 0-15。例如 PH10,则输入 GPIO_PIN_10 |
# HAL_GPIO_ReadPin
定义如下:
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
函数名 | HAL_GPIO_ReadPin |
---|---|
函数作用 | 返回引脚电平 |
返回值 | GPIO_PinState,如果是高电平则返回GPIO_PIN_SET (对应为1),如果是低电平则返回GPIO_PIN_RESET (对应为0) |
参数 1 | 对应 GPIO 总线,其中 x 可以是 A…I。例如 PH10,则输入 GPIOH |
参数 2 | 对应引脚数。可以是 0-15。例如 PH10,则输入 GPIO_PIN_10 |
# 定时器操作
# HAL_TIM_IRQHandler
void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim)
函数名 | HAL_TIM_IRQHandler |
---|---|
函数作用 | HAL对涉及(定时器)中断的寄存器进行处理 |
返回值 | void |
参数 | *htim 定时器的句柄指针,如定时器1就输入&htim1 ,定时器2就输入&htim2 |
在这个函数对寄存器进行配置之后,程序将会自动调用中断回调函数
_weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
和上面一样,它的参数也是定时器的句柄指针。我们在main.c
中就是需要重新将中断的内容写入这个回调函数,定时器中断更多请内容查看此处
# HAL_TIM_Base_Start
如果不开启中断,仅让定时器以定时功能工作,为了使定时器开始工作,需要调用HAL库提供的函数
HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)
函数名 | HAL_TIM_Base_Start |
---|---|
函数作用 | 使对应的定时器开始工作 |
返回值 | HAL_StatusTypeDef,HAL库定义的几种状态,如果成功使定时器开始工作,则返回HAL_OK |
参数 | *htim 定时器的句柄指针,如定时器1就输入&htim1 ,定时器2就输入&htim2 |
此函数需要在主循环while(1)
之前调用
# HAL_TIM_Base_Start_IT
接上面的函数,如果不仅需要开启定时器,还需要使用定时中断,则需要调用此函数
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
函数名 | HAL_TIM_Base_Start_IT |
---|---|
函数作用 | 使对应的定时器开始工作,并使能其定时中断 |
返回值 | HAL_StatusTypeDef,HAL库定义的几种状态,如果成功使定时器开始工作,则返回HAL_OK |
参数 | *htim 定时器的句柄指针,如定时器1就输入&htim1 ,定时器2就输入&htim2 |
此函数也需要在主循环while(1)
之前调用
# __HAL_TIM_SetCompare
这是在定时器进行 PWM 输出的时候,对储存比较值的寄存器 TIMx_CCRx 赋值的函数
#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \
(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\
((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\
((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\
((__HANDLE__)->Instance->CCR4 = (__COMPARE__)))
2
3
4
5
函数名 | __HAL_TIM_SetCompare |
---|---|
函数作用 | 在程序运行时对储存比较值的寄存器 TIMx_CCRx 赋值,修改比较值 |
参数1 | 输入*htim 定时器的句柄指针即可,如定时器1就输入&htim1 ,定时器2就输入&htim2 |
参数2 | 定时器的频道号,如TIM_CHANNEL_1 , TIM_CHANNEL_2 |
参数3 | 要赋给 TIMx_CCRx 寄存器的值,此值要小于 TIMx_ARR 内的重装载值 |
# __HAL_TIM_PRESCALER
其实它和 __HAL_TIM_SET_PRESCALER
是等效的,因为此句:
#define __HAL_TIM_PRESCALER __HAL_TIM_SET_PRESCALER
但其原始定义为:
#define __HAL_TIM_SET_PRESCALER(__HANDLE__, __PRESC__) ((__HANDLE__)->Instance->PSC = (__PRESC__))
函数名 | __HAL_TIM_PRESCALER |
---|---|
函数作用 | 在程序运行时对储存预分频比的寄存器 TIMx_PSR 赋值,修改预分频比 |
参数1 | 输入*htim 定时器的句柄指针即可,如定时器1就输入&htim1 ,定时器2就输入&htim2 |
参数2 | 要赋给 TIMx_PSR 寄存器的新预分频比值 |
# HAL_TIM_PWM_Start
HAL库提供的PWM初始化函数,为定时器初始化 PWM
函数名 | HAL_TIM_PWM_Start |
---|---|
函数作用 | 使对应定时器的对应通道开始PWM输出 |
返回值 | HAL_StatusTypeDef,HAL库定义的几种状态,如果成功使定时器开始工作,则返回HAL_OK |
参数1 | *htim 定时器的句柄指针,如定时器1就输入&htim1 ,定时器2就输入&htim2 |
参数2 | Channel 定时器PWM输出的通道,比如通道1为TIM_CHANNEL1 |
# ADC 操作
# HAL_ADC_ConfigChannel
HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig)
函数名 | HAL_ADC_ConfigChannel |
---|---|
函数作用 | 设置ADC通道的各个属性值,包括转换通道,序列排序,采样时间等 |
返回值 | HAL_StatusTypeDef,HAL库定义的几种状态,如果成功使ADC开始工作,则返回HAL_OK |
参数1 | TIM_HandleTypeDef * hadc即ADC的句柄指针,如果是adc1就输入&hadc1 ,adc2就输入&hadc2 |
参数2 | ADC_ChannelConfTypeDef* sConfig 即指向ADC设置的结构体指针。我们先对sConfig 结构体进行赋值,然后再将其指针作为参数输入函数 |
这个函数非常关键,直接指明了接下来对 ADC 操作的一些详细参数,包括端口号等,所以在改变 ADC 读取数据的配置时一定要记得改一下此函数的参数,其使用例见这里 (opens new window)
# HAL_ADC_Start
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)
函数名 | HAL_ADC_Start |
---|---|
函数作用 | 开启ADC的采样 |
返回值 | HAL_StatusTypeDef,HAL库定义的几种状态,如果成功使ADC开始工作,则返回HAL_OK |
参数1 | TIM_HandleTypeDef * hadc即ADC的句柄指针,如果是adc1就输入&hadc1 ,adc2就输入&hadc2 |
# HAL_ADC_PollForConversion
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)
函数名 | HAL_ADC_PollForConversion |
---|---|
函数作用 | 等待ADC转换结束 |
返回值 | HAL_StatusTypeDef,HAL库定义的几种状态,如果成功使ADC开始工作,则返回HAL_OK |
参数1 | TIM_HandleTypeDef * hadc即ADC的句柄指针,如果是adc1就输入&hadc1 ,adc2就输入&hadc2 |
参数2 | uint32_t Timeout等待的最大时间 |
# HAL_ADC_GetValue
函数名 | HAL_ADC_GetValue |
---|---|
函数作用 | 获取ADC值 |
返回值 | HAL_StatusTypeDef,HAL库定义的几种状态,如果成功使ADC开始工作,则返回HAL_OK |
参数1 | TIM_HandleTypeDef * hadc即ADC的句柄指针,如果是adc1就输入&hadc1 ,adc2就输入&hadc2 |
# 串口操作
# HAL_UART_Transmit
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
函数名 | HAL_UART_Transmit |
---|---|
函数作用 | 从指定的串口发送一段数据 |
返回值 | HAL_StatusTypeDef,HAL库定义的几种状态,如果成功发送本次数据,则返回HAL_OK |
参数1 | UART_HandleTypeDef *huart 要进行发送的串口的句柄指针,如串口1就输入&huart1 ,串口2就输入&huart2 |
参数2 | uint8_t *pData 要发送的数据的首地址,比如要发送buf[]=”Helloword” 则输入buf ,也可以直接输入要发送的字符串 |
参数3 | uint16_t Size 要发送的数据的大小,即输入的字符串的长度,也可以通过sizeof 关键字获取数据大小 |
参数4 | uint32_t Timeout 发送超时时间,如果发送时间超出该时间则取消本次发送 |
# HAL_UART_Receive_IT
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
函数名 | HAL_UART_Receive_IT |
---|---|
函数作用 | 使能一个串口的接收中断 |
返回值 | HAL_StatusTypeDef,HAL库定义的几种状态,如果成功发送本次数据,则返回HAL_OK |
参数1 | UART_HandleTypeDef *huart 要进行发送的串口的句柄指针,如串口1就输入&huart1 ,串口2就输入&huart2 |
参数2 | uint8_t *pData 要接收本次数据的缓冲变量的地址 |
参数3 | uint16_t Size 要接收的数据的大小,即输入的字符串的长度,只有收够这个长度的数据才会进入中断 |
这个函数需要注意的是,它才触发一次中断后会将中断标志位清除,所以需要重复调用才能持续接收
# __HAL_UART_ENABLE_IT
#define __HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((((__INTERRUPT__) >> 28U) == UART_CR1_REG_INDEX)? ((__HANDLE__)->Instance->CR1 |= ((__INTERRUPT__) & UART_IT_MASK)): \
(((__INTERRUPT__) >> 28U) == UART_CR2_REG_INDEX)? ((__HANDLE__)->Instance->CR2 |= ((__INTERRUPT__) & UART_IT_MASK)): \
((__HANDLE__)->Instance->CR3 |= ((__INTERRUPT__) & UART_IT_MASK)))
2
3
宏名 | __HAL_UART_ENABLE_IT |
---|---|
宏作用 | 使能某个串口中断类型 |
参数1 | __HANDLE__ 要进行使能的串口的句柄指针,如串口1就输入&huart1 |
参数2 | __INTERRUPT__ 要使能的中断类型,UART_IT_RXNE 接收中断,UART_IT_IDLE 空闲中断 |
# __HAL_UART_GET_FLAG
#define __HAL_UART_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR & (__FLAG__)) == (__FLAG__))
宏名 | __HAL_UART_GET_FLAG |
---|---|
宏作用 | 测试某个串口的某个 FLAG 位的状态 |
返回值 | FLAG 的两种状态:SET 与 RESET |
参数1 | __HANDLE__ 要进行测试的串口的句柄指针,如串口1就输入&huart1 |
参数2 | __FLAG__ 是要测试的 FLAG 名称,空闲中断位是UART_FLAG_IDLE ,基本为这个格式 |
# __HAL_UART_CLEAR_IDLEFLAG
宏名 | __HAL_UART_GET_FLAG |
---|---|
宏作用 | 清除IDLE 的中断标志位的宏定义 |
参数1 | __HANDLE__ 要删除标志位的串口的句柄指针,如串口1就输入&huart1 |
# 中断返回函数
# HAL_TIM_PeriodElapsedCallback
这是定时器中断的回调函数,其原始定义为:
__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
我们需要在main.c
或其他我们自己的位置重新定义其内容
函数名 | HAL_TIM_PeriodElapsedCallback |
---|---|
函数作用 | 定义定时器中断的中断执行内容 |
返回值 | void |
参数1 | 发生定时器中断的定时器句柄指针,是由系统在调用时自动填写的;如 &htim1 , &htim2 等 |
# HAL_GPIO_EXIT_Callback
这是 GPIO 外部中断的回调函数,其原始定义为:
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
我们需要在main.c
或其他我们自己的位置重新定义其内容
函数名 | HAL_GPIO_EXIT_Ballback |
---|---|
函数作用 | 定义 GPIO 外部中断的中断执行内容 |
返回值 | void |
参数1 | 发生外部中断的引脚(组)号,是由系统在调用时自动填写的;如 PA0, PB1 等 |
# HAL_UART_RxCpltCallback
这是 UART 接收中断的回调函数,其原始定义为:
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
函数名 | HAL_UART_RxCpltCallback |
---|---|
函数作用 | 定义 UART 接收中断的内容 |
返回值 | void |
参数1 | 发生接收中断的串口句柄指针,是由系统在调用时自动填写的;如 &huart1 等 |