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

这篇具有很好参考价值的文章主要介绍了STM32HAL库定时器中断、按键中断、串口中断、按键消抖和低通滤波算法详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

目录

1. 定时器中断

2. 按键中断

3. 串口中断

4. 按键消抖

5. 低通滤波算法

一、定时器中断

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

1. 配置定时器

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

 2. 初始化定时器

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

```c

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)

{

  if(htim_base->Instance == TIMx)

  {

    /* TIMx clock enable */

    __HAL_RCC_TIMx_CLK_ENABLE();

  

    /* TIMx interrupt Init */

    HAL_NVIC_SetPriority(TIMx_IRQn, 0, 0);

    HAL_NVIC_EnableIRQ(TIMx_IRQn);

  }

}

```

 3. 启动定时器

在main函数中,调用HAL_TIM_Base_Start_IT()函数启动定时器。

```c

HAL_TIM_Base_Start_IT(&htimx);

```

4. 编写定时器中断回调函数

在stm32fxxx_it.c文件中,编写定时器中断回调函数。

```c

void TIMx_IRQHandler(void)

{

  HAL_TIM_IRQHandler(&htimx);

}



void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

  if (htim->Instance == TIMx)

  {

    // 在这里添加定时任务代码

  }

}

```

二、 按键中断

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

1. 配置按键引脚

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

 2. 初始化按键引脚

在main.c文件中,调用HAL_GPIO_EXTI_MspInit()函数初始化按键引脚。

```c

void HAL_GPIO_EXTI_MspInit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

{

  if(GPIOx == KEY_GPIO_Port && GPIO_Pin == KEY_Pin)

  {

    /* GPIO clock enable */

    __HAL_RCC_GPIOx_CLK_ENABLE();



    /* EXTI interrupt Init */

    HAL_NVIC_SetPriority(EXTIx_IRQn, 0, 0);

    HAL_NVIC_EnableIRQ(EXTIx_IRQn);

  }

}

```

3. 启动按键中断

在main函数中,调用HAL_GPIO_EXTI_IRQHandler()函数启动按键中断。

```c

HAL_GPIO_EXTI_IRQHandler(KEY_Pin);

```

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

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

```c

void EXTIx_IRQHandler(void)

{

  HAL_GPIO_EXTI_IRQHandler(KEY_Pin);

}



void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

  if (GPIO_Pin == KEY_Pin)

  {

    // 在这里添加按键动作代码

  }

}

```

三、 串口中断

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

 1. 配置串口

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

 2. 初始化串口

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

```c

void HAL_UART_MspInit(UART_HandleTypeDef* huart)

{

  if(huart->Instance == USARTx)

  {

    /* USARTx clock enable */

    __HAL_RCC_USARTx_CLK_ENABLE();

  

    /* USARTx interrupt Init */

    HAL_NVIC_SetPriority(USARTx_IRQn, 0, 0);

    HAL_NVIC_EnableIRQ(USARTx_IRQn);

  }

}

```

 3. 启动串口接收中断

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

```c

uint8_t rx_data;

HAL_UART_Receive_IT(&huartx, &rx_data, 1);

```

 4. 编写串口中断回调函数

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

```c

void USARTx_IRQHandler(void)

{

  HAL_UART_IRQHandler(&huartx);

}



void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

  if (huart->Instance == USARTx)

  {

    // 在这里添加串口接收处理代码



    // 持续接收

    HAL_UART_Receive_IT(huart, &rx_data, 1);

  }

}

```

四、 按键消抖

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

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

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

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

```c

#define KEY_DEBOUNCE_DELAY 20 // 按键消抖延时



uint8_t key_state = 0; // 按键状态

uint8_t key_cnt = 0; // 按键计数



// 定时器中断回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

  if (htim->Instance == TIMx)

  {

    // 读取按键状态

    uint8_t current_key_state = HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin);



    // 判断按键状态是否改变

    if (current_key_state != key_state)

    {

      // 计数加1

      key_cnt++;



      // 判断计数是否达到预设值

      if (key_cnt >= KEY_DEBOUNCE_DELAY)

      {

        key_state = current_key_state; // 更新按键状态

        key_cnt = 0; // 清零计数



        // 按键动作处理

        if (key_state == GPIO_PIN_SET)

        {

          // 按键按下处理

        }

        else

        {

          // 按键松开处理

        }

      }

    }

    else

    {

      // 清零计数

      key_cnt = 0;

    }

  }

}

```

五、低通滤波算法

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

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

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

 示例:移动平均法实现低通滤波文章来源地址https://www.toymoban.com/news/detail-616019.html

```c

#define FILTER_N 10 // 滤波数据长度



float data_buf[FILTER_N]; // 数据缓存

uint8_t buf_index = 0; // 缓存索引



// 将新数据添加到缓存中

void add_data_to_buffer(float data)

{

  data_buf[buf_index] = data;

  buf_index = (buf_index + 1) %
}

到了这里,关于STM32HAL库定时器中断、按键中断、串口中断、按键消抖和低通滤波算法详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包