当前位置:   article > 正文

STM32HAL库定时器中断、按键中断、串口中断、按键消抖和低通滤波算法详解

hal库定时器中断

本文将详细介绍STM32HAL库中的定时器中断、按键中断、串口中断的使用方法,以及按键消抖和低通滤波算法的实现。希望能对您的STM32开发提供帮助。

目录

1. 定时器中断

2. 按键中断

3. 串口中断

4. 按键消抖

5. 低通滤波算法

一、定时器中断

定时器中断是STM32开发中常用的一种中断方式,主要用于定时执行某些任务,例如按键消抖、定时更新显示等。以下为创建定时器中断的步骤:

1. 配置定时器

首先,在STM32CubeMX中配置相应的定时器,并设置对应的时钟和预分频系数。

 2. 初始化定时器

在main.c文件中,调用HAL_TIM_Base_MspInit()函数初始化定时器。

  1. ```c
  2. void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
  3. {
  4.   if(htim_base->Instance == TIMx)
  5.   {
  6.     /* TIMx clock enable */
  7.     __HAL_RCC_TIMx_CLK_ENABLE();
  8.   
  9.     /* TIMx interrupt Init */
  10.     HAL_NVIC_SetPriority(TIMx_IRQn, 0, 0);
  11.     HAL_NVIC_EnableIRQ(TIMx_IRQn);
  12.   }
  13. }
  14. ```
  15.  3. 启动定时器
  16. 在main函数中,调用HAL_TIM_Base_Start_IT()函数启动定时器。
  17. ```c
  18. HAL_TIM_Base_Start_IT(&htimx);
  19. ```
  20. 4. 编写定时器中断回调函数
  21. 在stm32fxxx_it.c文件中,编写定时器中断回调函数。
  22. ```c
  23. void TIMx_IRQHandler(void)
  24. {
  25.   HAL_TIM_IRQHandler(&htimx);
  26. }
  27. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  28. {
  29.   if (htim->Instance == TIMx)
  30.   {
  31.     // 在这里添加定时任务代码
  32.   }
  33. }
  34. ```

二、 按键中断

按键中断是STM32开发中常用的一种中断方式,主要用于检测按键动作。以下为创建按键中断的步骤:

1. 配置按键引脚

首先,在STM32CubeMX中配置按键引脚,并设置为外部中断模式。

 2. 初始化按键引脚

  1. 在main.c文件中,调用HAL_GPIO_EXTI_MspInit()函数初始化按键引脚。
  2. ```c
  3. void HAL_GPIO_EXTI_MspInit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
  4. {
  5.   if(GPIOx == KEY_GPIO_Port && GPIO_Pin == KEY_Pin)
  6.   {
  7.     /* GPIO clock enable */
  8.     __HAL_RCC_GPIOx_CLK_ENABLE();
  9.     /* EXTI interrupt Init */
  10.     HAL_NVIC_SetPriority(EXTIx_IRQn, 0, 0);
  11.     HAL_NVIC_EnableIRQ(EXTIx_IRQn);
  12.   }
  13. }
  14. ```
  15. 3. 启动按键中断
  16. 在main函数中,调用HAL_GPIO_EXTI_IRQHandler()函数启动按键中断。
  17. ```c
  18. HAL_GPIO_EXTI_IRQHandler(KEY_Pin);
  19. ```

 4. 编写按键中断回调函数

在stm32fxxx_it.c文件中,编写按键中断回调函数。

  1. ```c
  2. void EXTIx_IRQHandler(void)
  3. {
  4.   HAL_GPIO_EXTI_IRQHandler(KEY_Pin);
  5. }
  6. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  7. {
  8.   if (GPIO_Pin == KEY_Pin)
  9.   {
  10.     // 在这里添加按键动作代码
  11.   }
  12. }
  13. ```

三、 串口中断

串口中断是STM32开发中常用的一种中断方式,主要用于实现串口通信。以下为创建串口中断的步骤:

 1. 配置串口

首先,在STM32CubeMX中配置相应的串口,并设置对应的波特率、数据位、停止位等参数。

 2. 初始化串口

在main.c文件中,调用HAL_UART_MspInit()函数初始化串口。

  1. ```c
  2. void HAL_UART_MspInit(UART_HandleTypeDef* huart)
  3. {
  4.   if(huart->Instance == USARTx)
  5.   {
  6.     /* USARTx clock enable */
  7.     __HAL_RCC_USARTx_CLK_ENABLE();
  8.   
  9.     /* USARTx interrupt Init */
  10.     HAL_NVIC_SetPriority(USARTx_IRQn, 0, 0);
  11.     HAL_NVIC_EnableIRQ(USARTx_IRQn);
  12.   }
  13. }
  14. ```

 3. 启动串口接收中断

在main函数中,调用HAL_UART_Receive_IT()函数启动串口接收中断。

  1. ```c
  2. uint8_t rx_data;
  3. HAL_UART_Receive_IT(&huartx, &rx_data, 1);
  4. ```
  5.  4. 编写串口中断回调函数
  6. 在stm32fxxx_it.c文件中,编写串口中断回调函数。
  7. ```c
  8. void USARTx_IRQHandler(void)
  9. {
  10.   HAL_UART_IRQHandler(&huartx);
  11. }
  12. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  13. {
  14.   if (huart->Instance == USARTx)
  15.   {
  16.     // 在这里添加串口接收处理代码
  17.     // 持续接收
  18.     HAL_UART_Receive_IT(huart, &rx_data, 1);
  19.   }
  20. }
  21. ```

四、 按键消抖

按键消抖是为了消除按键在按下和松开时,由于机械原因产生的抖动现象。以下为实现按键消抖的方法:

1. 定时器中断法:通过定时器中断定时检测按键状态,若连续多次检测到按键状态一致,则认为按键有效。

2. 软件滤波法:通过软件记录按键状态,当按键状态改变时开始计数,若计数达到预设值,则认为按键有效。

示例:定时器中断法实现按键消抖

  1. ```c
  2. #define KEY_DEBOUNCE_DELAY 20 // 按键消抖延时
  3. uint8_t key_state = 0; // 按键状态
  4. uint8_t key_cnt = 0; // 按键计数
  5. // 定时器中断回调函数
  6. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  7. {
  8.   if (htim->Instance == TIMx)
  9.   {
  10.     // 读取按键状态
  11.     uint8_t current_key_state = HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin);
  12.     // 判断按键状态是否改变
  13.     if (current_key_state != key_state)
  14.     {
  15.       // 计数加1
  16.       key_cnt++;
  17.       // 判断计数是否达到预设值
  18.       if (key_cnt >= KEY_DEBOUNCE_DELAY)
  19.       {
  20.         key_state = current_key_state; // 更新按键状态
  21.         key_cnt = 0; // 清零计数
  22.         // 按键动作处理
  23.         if (key_state == GPIO_PIN_SET)
  24.         {
  25.           // 按键按下处理
  26.         }
  27.         else
  28.         {
  29.           // 按键松开处理
  30.         }
  31.       }
  32.     }
  33.     else
  34.     {
  35.       // 清零计数
  36.       key_cnt = 0;
  37.     }
  38.   }
  39. }
  40. ```

五、低通滤波算法

低通滤波算法是一种常用的数字滤波方法,主要用于消除高频噪声。以下为实现低通滤波的方法:

1. 移动平均法:通过计算一段时间内的数据平均值,达到滤波效果。

2. 指数加权移动平均法:通过计算当前数据与历史数据的加权平均值,达到滤波效果。

 示例:移动平均法实现低通滤波

  1. ```c
  2. #define FILTER_N 10 // 滤波数据长度
  3. float data_buf[FILTER_N]; // 数据缓存
  4. uint8_t buf_index = 0; // 缓存索引
  5. // 将新数据添加到缓存中
  6. void add_data_to_buffer(float data)
  7. {
  8.   data_buf[buf_index] = data;
  9.   buf_index = (buf_index + 1) %
  10. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/739167
推荐阅读
相关标签
  

闽ICP备14008679号