目录
一、常用的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_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
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_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模式发送一定数量的数据
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模数转换器
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协议