这篇文章总结常用的HAL库函数的简单使用方法,如果有其他用到的函数会补充。对HAL库的一些理论说明只做关键性说明。
延时函数Delay
void HAL_Delay(uint32_t Delay);
GPIO
/* HAL_GPIO_WritePin: GPIO引脚电平设置 */
/* GPIO_PIN_SET:高电平 */
/* GPIO_PIN_RESET:低电平 */
HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
/* HAL_GPIO_TogglePin: GPIO电平翻转 */
HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
/* HAL_GPIO_ReadPin: 获取GPIO引脚状态 */
HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
/* HAL_GPIO_Init: 初始化GPIO */
HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
/* HAL_GPIO_LockPin: GPIO电平状态锁定 */
HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
应用实例:
/* 设置引脚电平------(实验:让LED灯闪烁) */
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);//设置PA7引脚为高电平
HAL_Delay(1000);//延时1000ms
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);//设置PA7引脚为低电平
HAL_Delay(1000);//延时1000ms
/* 翻转电平 */
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_7);//翻转GPIO引脚电平
HAL_Delay(1000);//延时1000ms
/* 读取电平 */
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_7)==GPIO_PIN_RESET){//判断PA7引脚是否为低电平
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET);//设置PA8引脚为高电平
}else{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET);//设置PA8引脚为低电平
}
TIM
/* 定时器初始化 */
HAL_TIM_Base_Init(TIM_HandleTypeDef *htim);
/* 启动定时器 */
/* 定时器选择范围:&htim1~&htim8等 */
HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);
/* 停止定时器 */
HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim);
/* 中断模式下启动定时器 */
HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
/* 中断模式下停止定时器 */
HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim);
/* DMA模式下启动定时器 */
HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length);
HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim);
应用实例:
HAL_TIM_Base_Start_IT(&htim2);//开启定时器2中断
HAL_TIM_Base_Stop_IT(&htim2);//关闭定时器2中断
USART
/* 串口发送 函数参数:(要发送的数据,数据大小,超时时间) */
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
/* 串口接收 函数参数:(要保存接收数据的指针/数组,接收数据大小,超时时间) */
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
/* 中断模式发送 函数参数:(要发送的指针或数组,要发送的数据量) */
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
/* 中断模式接收 函数参数:(要保存接收数据的指针或数组,要接收的数据量) */
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
/* 发送回调函数 */
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
/* 接收回调函数 */
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
应用实例:
unsigned char str[]={"hello world"};//需要发送的数据
HAL_UART_Transmit(&huart1,str,sizeof(str),100);//串口发送数据
/* 中断模式下发送数据 */
unsigned char str[]={"hello world"};//需要发送的数据
HAL_UART_Transmit_IT(&huart1,str,sizeof(str),100);//串口发送数据
unsigned char str[1];//接收数据存放位置
HAL_UART_Receive_IT(&huart1,str,1);//串口接收数据
//串口发送完毕回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
if(huart->Instance==USART1){//判断是否是串口1产生的中断
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);//翻转PB5电平
}
}
//串口接收完毕回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if(huart->Instance==USART1){//判断是否为串口1产生中断
if(str[0]==0x80){//判断接收的数据是否为0x80
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);//翻转PB5电平
}
}
}
ADC
/* ADC开启转换 */
HAL_ADC_Start(ADC_HandleTypeDef* hadc);
/* ADC关闭转换 */
HAL_ADC_Stop(ADC_HandleTypeDef* hadc);
/* 带中断的ADC转换开启 */
HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);
/* 带中断的ADC转换停止 */
HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);
/* 获取ADC转换值 */
HAL_ADC_GetValue(ADC_HandleTypeDef* hadc);
ADC单通道应用举例:
HAL_ADC_Start(&hadc1);//开始ADC转换
if(HAL_OK==HAL_ADC_PollForConversion(&hadc1,10)){//判断是否转换成功
ADC_value=HAL_ADC_GetValue(&hadc1);//获取ADC转换值
printf("当前采集值为:%d\r\n",ADC_value);//串口输出值
}
HAL_ADC_Start_IT(&hadc1);//开始ADC转换
//ADC的中断回调函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){
if(hadc->Instance==ADC1){//判断是否为ADC1产生的中断
ADC_value=HAL_ADC_GetValue(&hadc1);//获取ADC转换值
printf("当前值:%d\r\n",ADC_value);//串口输出值
}
}
IIC
"初始化"
HAL_StatusTypeDef
HAL_I2C_Init(I2C_HandleTypeDef *hi2c)
"取消初始化"
HAL_StatusTypeDef
HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c)
/**
* @brief 主模式发送
* @param hi2c :hi2c(x)
* @param :目标设备地址
* @param 要发宋的数据
* @param 发送的长度
* @param Timeout Timeout duration
* @retval HAL status
*/
HAL_StatusTypeDef
HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
/**
* @brief 主模式-阻塞模式下-接收
* @param hi2c :hi2c(x)
* @param :目标设备地址
* @param 要接收的数据
* @param 接收的长度
* @param Timeout Timeout duration
* @retval HAL status
*/
HAL_StatusTypeDef
HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
/**
* @brief 从模式下发送
* @param hi2c :hi2c(x)
* @param 要发送的数据
* @param 接收的长度
* @param Timeout Timeout duration
* @retval HAL status
*/
HAL_StatusTypeDef
HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
"从机接收"
HAL_StatusTypeDef
HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)
"中断模式主机发送 /句柄、设备地址、需要发送的数据、长度"
HAL_StatusTypeDef
HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
"中断模式主机接收 /句柄、设备地址、存放接收的空间、长度"
HAL_StatusTypeDef
HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
"中断模式从机发送 /句柄、需要发送的数据、长度"
HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
"中断模式从机接收 /句柄、存放接收的空间、长度"
HAL_StatusTypeDef
HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
"DMA模式主机发送 /句柄、设备地址、需要发送的数据、长度"
HAL_StatusTypeDef
HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
"DMA模式主机接收 /句柄、设备地址、存放接收的空间、长度"
HAL_StatusTypeDef
HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)
"DMA模式从机发送 /句柄、需要发送的数据、长度"
HAL_StatusTypeDef
HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
"DMA模式从机接收 /句柄、存放接收的空间、长度"
HAL_StatusTypeDef
HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
"阻塞模式写入设备特定的寄存器"
"param:句柄、设备地址、设备寄存器地址、寄存器大小,要发送到数据、发送数据的大小、超时时间"
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)
"阻塞模式读取设备特定的寄存器"
"param:句柄、设备地址、设备寄存器地址、寄存器大小,存放数据地址、大小、超时时间"
HAL_StatusTypeDef
HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
"IT模式写入设备特定的寄存器"
"param:句柄、设备地址、设备寄存器地址、寄存器大小,要发送到数据、发送数据的大小"
HAL_StatusTypeDef
HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
"阻塞模式读取设备特定的寄存器"
"param:句柄、设备地址、设备寄存器地址、寄存器大小,要发送到数据、发送数据的大小"
HAL_StatusTypeDef
HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
"DMA模式写入设备特定的寄存器"
"param:句柄、设备地址、设备寄存器地址、寄存器大小,要发送到数据、发送数据的大小"
HAL_StatusTypeDef
HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
"DMA模式读取设备特定的寄存器"
"param:句柄、设备地址、设备寄存器地址、寄存器大小,要发送到数据、发送数据的大小"
HAL_StatusTypeDef
HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
"检查通信设备是否准备好通信"
"句柄、设备地址、实验次数、超时时间"
HAL_StatusTypeDef
HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout)
"中断事件处理"
void
HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c)
"中断错误处理"
void
HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c)
"主机发送完成回调"
__weak void
HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
"主机接收完成回调"
__weak void
HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
"从机发送完成回调"
__weak void
HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c)
"从机接收完成回调"
__weak void
HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)
"获取状态"
HAL_I2C_StateTypeDef
HAL_I2C_GetState(I2C_HandleTypeDef *hi2c)
"获取模式"
HAL_I2C_ModeTypeDef
HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c)
"主机终止通信"
HAL_StatusTypeDef
HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress)
在此之前就是STM32单片机的基础了解部分,在此之后会结合相关的功能需求和代码进行学习。此部分的函数功能部分也会在应用的过程中不断更新。