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 */
  • 10
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别人家的孩子380

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值