STM32 HAL库常用函数(学习备份版)
目录
GPIO
读取电平
电平设置
翻转IO口电平
NVIC
中断回调函数
switch选择中断线
定时器中断回调函数
UART中断回调函数
Timers
定时器开关函数
开启定时器及中断
关闭定时器及中断
开启定时器
关闭定时器
PWM开启定时器
PWM关闭定时器
读写定时器相关值的函数
设置比较值
获取当前比较值
设置重载数值
获取重载数值
设置计数值
获取计数值
微秒级延时函数(放在tim.c中)
开启定时器,并修改htimx
UART
串口发送数据函数
printf格式化输出
改写printf调用的fputc函数(放在main函数前)
调用printf
串口接收数据函数
scanf接收数据
改写scanf调用的fgetc函数(放在main函数前)
调用scanf
利用中断的串口发送数据函数
利用中断的串口接收数据函数(使用数组应用全局变量)
ADC
ADC启动函数
ADC关闭函数
ADC启动函数并打开中断
ADC关闭函数并关闭中断
查询ADC转化完成标志(等待转换)
获取ADC数值
使用DMA获取ADC数值(创建volatile uint16_t adc_value[4];数组)
RTC
读取系统时间(时分秒)
读取系统日期(年月日)
获取日期时间结构体声明
打印范例
掉电恢复解决方案
GPIO
写入电平
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) 例如:HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
读取电平
HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 例如:HAL_GPIO_ReadPin(GPIOH, GPIO_PIN_2);
电平设置
GPIO_PIN_RESET 0 GPIO_PIN_SET 1
翻转IO口电平
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 例如:HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
NVIC
中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {}
switch选择中断线
switch(GPIO_Pin)
{
case GPIO_PIN_2:
//内容1
break;
case GPIO_PIN_3:
//内容2
break;
case GPIO_PIN_13:
//内容3
break;
}
定时器中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {}
UART中断回调函数
发送中断回调
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {} 接收中断回调
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {} ADC中断回调函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {}
Timers
定时器开关函数
开启定时器及中断
HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) 例如:HAL_TIM_Base_Start_IT(&htim2);
关闭定时器及中断
HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim) 例如:HAL_TIM_Base_Stop_IT(&htim2);
开启定时器
HAL_TIM_Base_Start(TIM_HandleTypeDef *htim) 例如:HAL_TIM_Base_Start(&htim2);
关闭定时器
HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim) 例如:HAL_TIM_Base_Stop(&htim2);
PWM开启定时器
HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel) 例如:HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);
PWM关闭定时器
HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) 例如:HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_3);
读写定时器相关值的函数
设置比较值
__HAL_TIM_SetCompare (__HANDLE__, __CHANNEL__, __COMPARE__) 例如:__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_3,1000);
获取当前比较值
__HAL_TIM_GetCompare (__HANDLE__, __CHANNEL__) 例如:__HAL_TIM_GetCompare(&htim3,TIM_CHANNEL_3);
设置重载数值
__HAL_TIM_SetAutoreload (__HANDLE__, __AUTORELOAD__) 例如:__HAL_TIM_SetAutoreload(&htim3,1000);
获取重载数值
__HAL_TIM_GetAutoreload (__HANDLE__) 例如:__HAL_TIM_GetAutoreload(&htim3);
设置计数值
__HAL_TIM_SetCounter (__HANDLE__,__COUNTER__) 例如:__HAL_TIM_SetCounter(&htim3,1000);
获取计数值
__HAL_TIM_GetCounter (__HANDLE__) 例如:__HAL_TIM_GetCounter(&htim3);
微秒级延时函数(放在tim.c中)
开启定时器,并修改htimx
void delay_us(uint16_t us)
{
uint16_t differ = 0xffff-us-5;
__HAL_TIM_SET_COUNTER(&htim7,differ); //设定TIM7计数器起始值
HAL_TIM_Base_Start(&htim7); //启动定时器
while(differ < 0xffff-5)
{ //判断
differ = __HAL_TIM_GET_COUNTER(&htim7); //查询计数器的计数值
}
HAL_TIM_Base_Stop(&htim7);
}
UART
串口发送数据函数
HAL_UART_Transmit(UART_HandleTypeDef *huart,uint8_t *pData,uint16_t Size,uint32_t Timeout) 例如:HAL_UART_Transmit(&huart1,(uint8_t*)"wangzenb",8,0xFFFFF);
printf格式化输出
改写printf调用的fputc函数(放在main函数前)
int fputc(int c,FILE *stream)
{
uint8_t ch[1]={c};
HAL_UART_Transmit(&huart1,ch,1,0xFFFFF);
return c;
}
调用printf
例如:printf("wangzenb%d\n\r",123);
串口接收数据函数
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) 例如:HAL_UART_Receive(&huart1,buf,3,0xFFFF);
scanf接收数据
改写scanf调用的fgetc函数(放在main函数前)
int fgetc(FILE *stream)
{
uint8_t ch[1];
HAL_UART_Receive(&huart1,ch,1,0xFFFF);
return ch[0];
}
调用scanf
例如:scanf("%d",&val);
利用中断的串口发送数据函数
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart,uint8_t *pData,uint16_t Size) 例如:HAL_UART_Transmit_IT(&huart1,(uint8_t*)"wangzenb",8);
利用中断的串口接收数据函数(使用数组应用全局变量)
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 例如:HAL_UART_Receive_IT(&huart1,buf,3);
ADC
ADC启动函数
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc) 例如:HAL_ADC_Start(&hadc1);
ADC关闭函数
HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc) 例如:HAL_ADC_Stop(&hadc1);
ADC启动函数并打开中断
HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc) 例如:HAL_ADC_Start_IT(&hadc1);
ADC关闭函数并关闭中断
HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc) 例如:HAL_ADC_Stop_IT(&hadc1);
查询ADC转化完成标志(等待转换)
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef *hadc,uint32_t Timeout) HAL_ADC_PollForConversion(&hadc1,50);
获取ADC数值
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc) 例如:HAL_ADC_GetValue(&hadc1);
使用DMA获取ADC数值(创建volatile uint16_t adc_value[4];数组)
HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length) 例如:HAL_ADC_Start_DMA(&hadc1,(uint32_t*)adc_value,8);
RTC
读取系统时间(时分秒)
HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format) 例如:HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);
读取系统日期(年月日)
HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format) 例如:HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);
获取日期时间结构体声明
RTC_DateTypeDef GetData; //获取日期结构体 RTC_TimeTypeDef GetTime; //获取时间结构体
打印范例
printf("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date); printf("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);
掉电恢复解决方案
rtc.c中声明函数
void user_CheckRtcBkup() { HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 1); } 修改void MX_RTC_Init(void)函数
/* USER CODE BEGIN Check_RTC_BKUP */ if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1)==1) { return; } /* USER CODE END Check_RTC_BKUP */
作者:别人家的孩子380