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

目录

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

1、GPIO的初始化

2、配置GPIO引脚输出电平

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

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

[5、结构体 GPIO_InitTypeDef (引脚)定义:](#5、结构体 GPIO_InitTypeDef (引脚)定义:)

6、高低电平的表示

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

二、EXTI模式的中断

1、中断产生回调函数

三、定时器Timer

1、更新中断回调函数

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

3.PWM

[1. 开始产生PWM信号,使能定时器](#1. 开始产生PWM信号,使能定时器)

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

4.计时器

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

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

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

4.禁用TIM外设

[5.启动TIM Base生成](#5.启动TIM Base生成)

[6.停止生成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挂起标志](#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状态结构定义(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 状态( OK , busy , ERROR , TIMEOUT )

十、SPI

STM32之SPI协议

相关推荐
日晨难再3 分钟前
嵌入式:STM32的启动(Startup)文件解析
stm32·单片机·嵌入式硬件
yufengxinpian26 分钟前
集成了高性能ARM Cortex-M0+处理器的一款SimpleLink 2.4 GHz无线模块-RF-BM-2340B1
单片机·嵌入式硬件·音视频·智能硬件
__基本操作__1 小时前
历遍单片机下的IIC设备[ESP--0]
单片机·嵌入式硬件
网易独家音乐人Mike Zhou8 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
PegasusYu10 小时前
STM32CUBEIDE FreeRTOS操作教程(九):eventgroup事件标志组
stm32·教程·rtos·stm32cubeide·free-rtos·eventgroup·时间标志组
lantiandianzi15 小时前
基于单片机的多功能跑步机控制系统
单片机·嵌入式硬件
文弱书生65615 小时前
输出比较简介
stm32
哔哥哔特商务网15 小时前
高集成的MCU方案已成电机应用趋势?
单片机·嵌入式硬件
跟着杰哥学嵌入式15 小时前
单片机进阶硬件部分_day2_项目实践
单片机·嵌入式硬件
东芝、铠侠总代1361006839317 小时前
浅谈TLP184小型平面光耦
单片机·嵌入式硬件·物联网·平面