HAL库的常用库函数(根据学习而更新)

发布时间:2023年12月25日

目录

一、常用的GPIO相关HAL库函数

1、GPIO的初始化

2、配置GPIO引脚输出电平

3、切换指定引脚的电平,电平的翻转

4、读取指定GPIO引脚的电平

?5、结构体 GPIO_InitTypeDef (引脚)定义:

6、高低电平的表示

7、延时函数(提供了最小延时ms级别)

二、EXTI模式的中断

?1、中断产生回调函数

三、定时器Timer

?1、更新中断回调函数

2、在中断模式下启动TIM定时器

3.PWM

1. 开始产生PWM信号,使能定时器

2.修改比较值,修改占空比

4.计时器

1.启用TIM外设(使能定时器计数)

2.在运行时设置TIM计数器寄存器值

3.在运行时获取TIM计数器寄存器值

4.禁用TIM外设

5.启动TIM Base生成

6.停止生成TIM Base

四、串口发送/接收函数

1.以阻塞模式发送一定数量的数据

2.以阻塞模式接收一定数量的数据

3.以中断的方式接收和发送?

五、独立看门狗IWDG

1.刷新IWDG(俗称喂狗)

六、窗口看门狗WWDG

1.刷新WWDG(俗称喂狗)

七、DMA数据搬运

1、内存到内存搬运

1.启动DMA传输

2.获取DMA通道挂起标志

2、内存到外设搬运

1.以DMA模式发送一定数量的数据

3、外设到内存搬运

1.启用指定的UART中断。

2.在DMA模式下接收一定量的数据

3.检查是否设置了指定的UART标志

4.清除UART IDLE挂起标志

5.停止DMA传输

6.返回当前DMA通道传输中剩余数据单元的数量

八、ADC模数转换器

1.开启ADC,开启常规组转换(启动ADC单次转换)

2.等待常规组转换完成(等待ADC转换完成)

3.读取ADC转换数据

?九、IIC

1.以阻塞方式将一定数量的数据写入特定的内存地址

十、SPI


一、常用的GPIO相关HAL库函数

1、GPIO的初始化

void HAL_GPIO_Init ( GPIO_TypeDef * GPIOx , GPIO_InitTypeDef * GPIO_Init );

2、配置GPIO引脚输出电平

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

3、切换指定引脚的电平,电平的翻转

void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

4、读取指定GPIO引脚的电平

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

?5、结构体 GPIO_InitTypeDef (引脚)定义:

typedef struct
{
uint32_t Pin ;//指定要配置的GPIO引脚
uint32_t Mode ;//选择所选引脚的工作模式
uint32_t Pull ;//指定所选引脚的上拉或下拉激活
uint32_t Speed ;//指定所选引脚的速度
} GPIO_InitTypeDef ;//把结构体命名为 GPIO_InitTypeDef

6、高低电平的表示

typedef enum
{
? GPIO_PIN_RESET = 0u,//低电平
? GPIO_PIN_SET//高电平
} GPIO_PinState;

7、延时函数(提供了最小延时ms级别)

?__weak void HAL_Delay(uint32_t Delay)

注意:在中断服务函数里调用HAL_Delay函数,如果直接调用就会造成系统卡死。

原因:程序在执行的时候默认把滴答定时器的中断优先级设置为最低,其他中断源很容易把他打断导致卡死

解决:在main函数里使用以下函数提高滴答定时器的中断优先级(提升至0)

HAL_NVIC_SetPriority ( SysTick_IRQn , 0 , 0 );//设置中断的优先级

二、EXTI模式的中断

定义:
EXTI? 可分为两大部分功能,一个是产生中断,另一个是产生事件,这两个功能从硬件上就有所不同。
产生中断线路目的是把输入信号输入到?NVIC(中断控制器,处理中断的),进一步会运行中断服务函数,实现功能,这样是软件级的。而 产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传输,属于硬件级的。
中断触发类型:
typedef enum
{
EXTI_Trigger_Rising = 0x08 , // 上升沿
EXTI_Trigger_Falling = 0x0C , // 下降沿
EXTI_Trigger_Rising_Falling = 0x10 // 上升沿和下降沿都触发
} EXTITrigger_TypeDef ;

?1、中断产生回调函数

(简而言之就是发生中断就会调用这个函数,需要我们重写)

__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

传递过来的是发生中断的GPIO口

三、定时器Timer

STM32之定时器

  • PSC:预分频器的值
  • ARR:自动重装载值
  • Tclk:时钟频率
  • Tout:设定的时间
  • 1Mhz=1000000hz(次/秒)
  • 周期(s)=频率(hz)的倒数

?1、更新中断回调函数

(就是当定时器溢出时需要重载产生的中断,需要我们重写)

void HAL_TIM_PeriodElapsedCallback ( TIM_HandleTypeDef * htim )

2、在中断模式下启动TIM定时器

HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)

参数一:定时器句柄

3.PWM

STM32之定时器--PWM控制SG90舵机

1. 开始产生PWM信号,使能定时器

HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)

参数1:定时器句柄

参数2:产生PWM的信号通道

2.修改比较值,修改占空比

__HAL_TIM_SetCompare(__HANDLE__, __CHANNEL__, __COMPARE__);

参数1:定时器句柄

参数2:产生PWM的信号通道

参数3:需要设定的比较值

4.计时器

1.启用TIM外设(使能定时器计数)

__HAL_TIM_ENABLE(__HANDLE__)?

参数1:定时器句柄

2.在运行时设置TIM计数器寄存器值

修改计数器的值

__HAL_TIM_SetCounter(__HANDLE__, __COUNTER__)

参数1:定时器句柄

参数2:指定计数器寄存器的新值

3.在运行时获取TIM计数器寄存器值

__HAL_TIM_GetCounter(__HANDLE__)

参数1:定时器句柄

4.禁用TIM外设

关闭定时器

__HAL_TIM_DISABLE(__HANDLE__)

参数1:定时器句柄

5.启动TIM Base生成

启动定时器计时

?HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)

参数1:定时器句柄

6.停止生成TIM Base

停止定时器计时

HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim)

参数1:定时器句柄

四、串口发送/接收函数

1.以阻塞模式发送一定数量的数据

串口发送数据,使用超时管理机制
HAL_UART_Transmit(UART_HandleTypeDef *huart,
????????????????????????????????????const uint8_t *pData,
????????????????????????????????????uint16_t Size,
????????????????????????????????????uint32_t Timeout)
参数1: UART_HandleTypeDef 结构体类型指针变量--串口句柄
参数2:指向要发送的数据地址
参数3:要发送的数据大小,以字节为单位
形参 4 :设置的超时时间,以 ms 单位

2.以阻塞模式接收一定数量的数据

串口接收数据,使用超时管理机制

HAL_UART_Receive(UART_HandleTypeDef *huart,

????????????????????????????????????uint8_t *pData,

????????????????????????????????????uint16_t Size,

????????????????????????????????????uint32_t Timeout)

参数1: UART_HandleTypeDef 结构体类型指针变量--串口句柄
参数2:指向要接收的数据地址
参数3:要接收的数据大小,以字节为单位
形参 4 :设置的超时时间,以 ms 单位

3.以中断的方式接收和发送?

HAL_UART_Transmit_IT(); 串口中断模式发送? (没用过)
HAL_UART_Receive_IT(); 串口中断模式接收
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
作用:以中断的方式接收指定字节的数据
形参 1 UART_HandleTypeDef 结构体类型指针变量
形参 2 是指向接收数据缓冲区
形参 3 是要接收的数据大小,以字节为单位
此函数执行完后将清除中断,需要再次调用以重新开启中断。

stm32串口中断--接收字符串

中断回调函数需要重写

往串口发送数据时可以将printf重映射,然后使用printf来发送数据,printf的使用方法和之前一样

五、独立看门狗IWDG

HTM32看门狗

1.刷新IWDG(俗称喂狗)

HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)

参数一:指向IWDG_HandleTypeDef结构的指针(独立看门狗的句柄)

返回值:HAL状态结构定义

六、窗口看门狗WWDG

1.刷新WWDG(俗称喂狗)

HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg)

参数一:指向WWDG_HandleTypeDef结构体的指针(窗口看门狗的句柄)

返回值:HAL状态结构定义

七、DMA数据搬运

STM32搬运工之DMA

1、内存到内存搬运

1.启动DMA传输

HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma,

????????????????????????????????????????????????????????????????uint32_t SrcAddress,

????????????????????????????????????????????????????????????????uint32_t DstAddress,

????????????????????????????????????????????????????????????????uint32_t DataLength)

参数一:DMA通道的句柄

参数二:源内存缓冲区地址

参数三:目标内存缓冲区地址

参数四:要从源传输到目的的数据长度,注意:需要乘以sizeof(uint32_t)

返回值:HAL状态结构定义(OKbusyERRORTIMEOUT

2.获取DMA通道挂起标志

#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__)? ?

参数一: HANDLE DMA 通道句柄
参数二: FLAG ,数据传输标志。 DMA_FLAG_TCx 表示数据传输完成标志
返回值: FLAG 的值( SET/RESET )SET表示正在传输,RESET表示空闲

2、内存到外设搬运

1.以DMA模式发送一定数量的数据
将数据通过串口DMA发送

HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart,

????????????????????????????????????????????????????????????????????????????????const uint8_t *pData,

????????????????????????????????????????????????????????????????????????????????uint16_t Size)

参数一: 串口句柄
参数二: 待发送数据首地址
参数三: 待发送数据长度
返回值: HAL_StatusTypeDef HAL 状态( OK busy ERROR TIMEOUT

3、外设到内存搬运

1.启用指定的UART中断。

#define __HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__)

参数一: HANDLE ,串口句柄
参数二: INTERRUPT ,需要使能的中断
返回值:无
2.在DMA模式下接收一定量的数据

HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart,

???????????????????????????????????????????????????????????????????????????????uint8_t *pData,

???????????????????????????????????????????????????????????????????????????????uint16_t Size)

参数一: 串口句柄
参数二: 接收缓存首地址(指向接收缓冲区的指针)
参数三: 接收缓存长度
返回值: HAL 状态( OK busy ERROR TIMEOUT
3.检查是否设置了指定的UART标志
判断IDLE标志位是否被置位,检测串口是否空闲

#define __HAL_UART_GET_FLAG(__HANDLE__, __FLAG__)

参数一: HANDLE ,串口句柄
参数二: FLAG ,需要查看的 FLAG
这里用UART_FLAG_IDLE: Idle Line detection flag(空闲线路检测标志)
返回值: FLAG 的值
4.清除UART IDLE挂起标志

#define __HAL_UART_CLEAR_IDLEFLAG(__HANDLE__)?

参数一: HANDLE ,串口句柄
返回值:无
5.停止DMA传输

HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart)

参数一: UART_HandleTypeDef *huart ,串口句柄
返回值: HAL_StatusTypeDef HAL 状态( OK busy ERROR TIMEOUT
6.返回当前DMA通道传输中剩余数据单元的数量

可用来计算数据的长度

#define __HAL_DMA_GET_COUNTER(__HANDLE__)?

参数一: HANDLE ,串口句柄
返回值:未传输数据大小

八、ADC模数转换器

STM32之模数转换器ADC

1.开启ADC,开启常规组转换(启动ADC单次转换)

HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)

参数一:ADC句柄

返回值:HAL状态(OKbusyERRORTIMEOUT

2.等待常规组转换完成(等待ADC转换完成)

HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc,

????????????????????????????????????????????????????????????????????????????????????uint32_t Timeout)

参数一:ADC句柄

参数二:超时值,单位为毫秒

返回值:HAL状态(OKbusyERRORTIMEOUT

3.读取ADC转换数据

uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)

参数一:ADC句柄

返回值:ADC组定期转换数据

?九、IIC

STM32之IIC协议

1.以阻塞方式将一定数量的数据写入特定的内存地址

HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c,

????????????????????????????????????????????????????????????????????????uint16_t DevAddress,

????????????????????????????????????????????????????????????????????????uint16_t MemAddress,

????????????????????????????????????????????????????????????????????????uint16_t MemAddSize,

????????????????????????????????????????????????????????????????????????uint8_t *pData,

????????????????????????????????????????????????????????????????????????uint16_t Size,

????????????????????????????????????????????????????????????????????????uint32_t Timeout)

参数一: I2C 设备句柄
参数二: 目标器件的地址,七位地址必须左对齐
参数三: 目标器件的目标寄存器地址
参数四: 目标器件内部寄存器地址数据长度
参数五: 待写的数据首地址
参数六: 待写的数据长度
参数七: 超时时间
返回值: HAL 状态( OK busy ERROR TIMEOUT

十、SPI

STM32之SPI协议

文章来源:https://blog.csdn.net/weixin_58198422/article/details/134391358
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。