STM32 HAL库的常用库函数整理

一、常用的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搬运工之DMA1、内存到内存搬运
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模式发送一定数量的数据
将数据通过串口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状态(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
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_TIM_ReadCapturedValue() ; 获取捕获通道计数器的函数
HAL_TIM_IC_Start();开启输入捕获通道
HAL_TIM_IC_Stop();关闭输入捕获通道
HAL_TIM_IC_Start_IT();开启输入捕获通道与中断
HAL_TIM_IC_Stop_IT();关闭输入捕获通道与中断
__HAL_TIM_SET_COUNTER(HANDLE, COUNTER)设置计数器CNT的值,(HANDLE:时钟,COUNTER:设置的值)
TIM_RESET_CAPTUREPOLARITY(HANDLE, CHANNEL);清除通道极性
TIM_SET_CAPTUREPOLARITY(HANDLE, CHANNEL, POLARITY);设置通道极性
__HAL_TIM_SET_CAPTUREPOLARITY(HANDLE, CHANNEL, POLARITY);清除通道极性,并设置通道极性
HAL_TIM_PeriodElapsedCallback() ;定时器中断回调函数
HAL_TIM_IC_CaptureCallback();捕获中断回调函数

                        
 


原文链接:https://blog.csdn.net/weixin_58198422/article/details/134391358

  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值