HAL库的常用库函数(根据学习而更新)
目录
?5、结构体 GPIO_InitTypeDef (引脚)定义:
一、常用的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_PinStatePinState );
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
- 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
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_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)作用:以中断的方式接收指定字节的数据形参 1 是 UART_HandleTypeDef 结构体类型指针变量形参 2 是指向接收数据缓冲区形参 3 是要接收的数据大小,以字节为单位此函数执行完后将清除中断,需要再次调用以重新开启中断。
中断回调函数需要重写
往串口发送数据时可以将printf重映射,然后使用printf来发送数据,printf的使用方法和之前一样
五、独立看门狗IWDG
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数据搬运
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状态结构定义(OK,busy,ERROR,TIMEOUT)
2.获取DMA通道挂起标志
#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__)? ?
参数一: HANDLE , DMA 通道句柄参数二: FLAG ,数据传输标志。 DMA_FLAG_TCx 表示数据传输完成标志返回值: FLAG 的值( SET/RESET )SET表示正在传输,RESET表示空闲
2、内存到外设搬运
1.以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标志
#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模数转换器
1.开启ADC,开启常规组转换(启动ADC单次转换)
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)
参数一:ADC句柄
返回值:HAL状态(OK,busy,ERROR,TIMEOUT)
2.等待常规组转换完成(等待ADC转换完成)
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc,
????????????????????????????????????????????????????????????????????????????????????uint32_t Timeout)
参数一:ADC句柄
参数二:超时值,单位为毫秒
返回值:HAL状态(OK,busy,ERROR,TIMEOUT)
3.读取ADC转换数据
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)
参数一:ADC句柄
返回值:ADC组定期转换数据
?九、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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!