目录
[5、结构体 GPIO_InitTypeDef (引脚)定义:](#5、结构体 GPIO_InitTypeDef (引脚)定义:)
[1. 开始产生PWM信号,使能定时器](#1. 开始产生PWM信号,使能定时器)
[5.启动TIM Base生成](#5.启动TIM Base生成)
[6.停止生成TIM Base](#6.停止生成TIM Base)
[4.清除UART IDLE挂起标志](#4.清除UART IDLE挂起标志)
一、常用的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
- 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_Transmit_IT(); 串口中断模式发送 (没用过)
HAL_UART_Receive_IT(); 串口中断模式接收
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模式发送一定数量的数据
将数据通过串口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模数转换器
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 )