【STM32单片机学习笔记】HAL库函数使用说明

这篇文章总结常用的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单片机的基础了解部分,在此之后会结合相关的功能需求和代码进行学习。此部分的函数功能部分也会在应用的过程中不断更新。 

  • 16
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值