目录
?5、结构体 GPIO_InitTypeDef (引脚)定义:
void HAL_GPIO_Init ( GPIO_TypeDef * GPIOx , GPIO_InitTypeDef * GPIO_Init );
void HAL_GPIO_WritePin ( GPIO_TypeDef * GPIOx , uint16_t GPIO_Pin , GPIO_PinStatePinState );
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
typedef struct{uint32_t Pin ;//指定要配置的GPIO引脚uint32_t Mode ;//选择所选引脚的工作模式uint32_t Pull ;//指定所选引脚的上拉或下拉激活uint32_t Speed ;//指定所选引脚的速度} GPIO_InitTypeDef ;//把结构体命名为 GPIO_InitTypeDef
typedef enum
{
? GPIO_PIN_RESET = 0u,//低电平
? GPIO_PIN_SET//高电平
} GPIO_PinState;
?__weak void HAL_Delay(uint32_t Delay)
注意:在中断服务函数里调用HAL_Delay函数,如果直接调用就会造成系统卡死。
原因:程序在执行的时候默认把滴答定时器的中断优先级设置为最低,其他中断源很容易把他打断导致卡死
解决:在main函数里使用以下函数提高滴答定时器的中断优先级(提升至0)
HAL_NVIC_SetPriority ( SysTick_IRQn , 0 , 0 );//设置中断的优先级
定义:EXTI? 可分为两大部分功能,一个是产生中断,另一个是产生事件,这两个功能从硬件上就有所不同。产生中断线路目的是把输入信号输入到?NVIC(中断控制器,处理中断的),进一步会运行中断服务函数,实现功能,这样是软件级的。而 产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传输,属于硬件级的。中断触发类型:typedef enum{EXTI_Trigger_Rising = 0x08 , // 上升沿EXTI_Trigger_Falling = 0x0C , // 下降沿EXTI_Trigger_Rising_Falling = 0x10 // 上升沿和下降沿都触发} EXTITrigger_TypeDef ;
(简而言之就是发生中断就会调用这个函数,需要我们重写)
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
传递过来的是发生中断的GPIO口
(就是当定时器溢出时需要重载产生的中断,需要我们重写)
void HAL_TIM_PeriodElapsedCallback ( TIM_HandleTypeDef * htim )
HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
参数一:定时器句柄
HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
参数1:定时器句柄
参数2:产生PWM的信号通道
__HAL_TIM_SetCompare(__HANDLE__, __CHANNEL__, __COMPARE__);
参数1:定时器句柄
参数2:产生PWM的信号通道
参数3:需要设定的比较值
__HAL_TIM_ENABLE(__HANDLE__)?
参数1:定时器句柄
修改计数器的值
__HAL_TIM_SetCounter(__HANDLE__, __COUNTER__)
参数1:定时器句柄
参数2:指定计数器寄存器的新值
__HAL_TIM_GetCounter(__HANDLE__)
参数1:定时器句柄
关闭定时器
__HAL_TIM_DISABLE(__HANDLE__)
参数1:定时器句柄
启动定时器计时
?HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)
参数1:定时器句柄
停止定时器计时
HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim)
参数1:定时器句柄
HAL_UART_Transmit(UART_HandleTypeDef *huart,????????????????????????????????????const uint8_t *pData,????????????????????????????????????uint16_t Size,????????????????????????????????????uint32_t Timeout)参数1: UART_HandleTypeDef 结构体类型指针变量--串口句柄参数2:指向要发送的数据地址参数3:要发送的数据大小,以字节为单位形参 4 :设置的超时时间,以 ms 单位
HAL_UART_Receive(UART_HandleTypeDef *huart,
????????????????????????????????????uint8_t *pData,
????????????????????????????????????uint16_t Size,
????????????????????????????????????uint32_t Timeout)
参数1: UART_HandleTypeDef 结构体类型指针变量--串口句柄参数2:指向要接收的数据地址参数3:要接收的数据大小,以字节为单位形参 4 :设置的超时时间,以 ms 单位
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)作用:以中断的方式接收指定字节的数据形参 1 是 UART_HandleTypeDef 结构体类型指针变量形参 2 是指向接收数据缓冲区形参 3 是要接收的数据大小,以字节为单位此函数执行完后将清除中断,需要再次调用以重新开启中断。
中断回调函数需要重写
往串口发送数据时可以将printf重映射,然后使用printf来发送数据,printf的使用方法和之前一样
HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
参数一:指向IWDG_HandleTypeDef结构的指针(独立看门狗的句柄)
返回值:HAL状态结构定义
HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg)
参数一:指向WWDG_HandleTypeDef结构体的指针(窗口看门狗的句柄)
返回值:HAL状态结构定义
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)
#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__)? ?
参数一: HANDLE , DMA 通道句柄参数二: FLAG ,数据传输标志。 DMA_FLAG_TCx 表示数据传输完成标志返回值: FLAG 的值( SET/RESET )SET表示正在传输,RESET表示空闲
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart,
????????????????????????????????????????????????????????????????????????????????const uint8_t *pData,
????????????????????????????????????????????????????????????????????????????????uint16_t Size)
参数一: 串口句柄参数二: 待发送数据首地址参数三: 待发送数据长度返回值: HAL_StatusTypeDef , HAL 状态( OK , busy , ERROR , TIMEOUT )
#define __HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__)
参数一: HANDLE ,串口句柄参数二: INTERRUPT ,需要使能的中断返回值:无
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart,
???????????????????????????????????????????????????????????????????????????????uint8_t *pData,
???????????????????????????????????????????????????????????????????????????????uint16_t Size)
参数一: 串口句柄参数二: 接收缓存首地址(指向接收缓冲区的指针)参数三: 接收缓存长度返回值: HAL 状态( OK , busy , ERROR , TIMEOUT )
#define __HAL_UART_GET_FLAG(__HANDLE__, __FLAG__)
参数一: HANDLE ,串口句柄参数二: FLAG ,需要查看的 FLAG这里用UART_FLAG_IDLE: Idle Line detection flag(空闲线路检测标志)返回值: FLAG 的值
#define __HAL_UART_CLEAR_IDLEFLAG(__HANDLE__)?
参数一: HANDLE ,串口句柄返回值:无
HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart)
参数一: UART_HandleTypeDef *huart ,串口句柄返回值: HAL_StatusTypeDef , HAL 状态( OK , busy , ERROR , TIMEOUT )
可用来计算数据的长度
#define __HAL_DMA_GET_COUNTER(__HANDLE__)?
参数一: HANDLE ,串口句柄返回值:未传输数据大小
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)
参数一:ADC句柄
返回值:HAL状态(OK,busy,ERROR,TIMEOUT)
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc,
????????????????????????????????????????????????????????????????????????????????????uint32_t Timeout)
参数一:ADC句柄
参数二:超时值,单位为毫秒
返回值:HAL状态(OK,busy,ERROR,TIMEOUT)
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)
参数一:ADC句柄
返回值:ADC组定期转换数据
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 )