hal库开启中断关中断_[STM32]HAL库下GPIO按键中断与去抖问题分析(分析源码解决问题)...

自上篇文章STM32 非阻塞HAL_UART_ReceiveIT解析与实际应用,具体总结了HAL库下套娃函数中如何看清库函数的脉络,更细致的认识调用的过程,以解决潜在的问题。又又又遇到了新的问题(GPIO按键中断),感觉网络上和各种资料都没解释清楚的情况下。我又去扒了扒HAL库函数源码,提供不一样解决按键抖动的问题(个人认为除了那些通过配置具体寄存器的外;是从HAL库提供函数的基础上解决的)有别于那种在Callback返回函数中添加延迟和判断具体是否按下按键的方法(个人实际操作感觉这种方法效果也不好)。而是在HAL_GPIO库函数上的HAL_GPIO_EXTI_IRQHandler处理中断函数解决按键抖动带来的问题,是更根上解决问题的方法。

前言Yume-知乎文章​www.zhihu.comzhihu-card-default.svg

在这里,还是以我一贯的风格——不重复造轮子。具体如何配置STM32CubeMX初始化、生成工程目录之类的问题。包括关于STM32的Cortex-M3处理器的中断细节都不会在本文章中赘述,想了解的朋友可以自行去翻看“Cortex-M3 权威指南”、“Cortex-M3 技术手册”等相关技术文档,都有中文的翻译版本。本文的目的只在如何具体分析问题,解决问题。

1 STM32CubeMX中GPIO配置(基于正点原子的Stm32F1-Nano板)

像如何配置RCC、配置相关的时钟树、配置中断NVIC、配置中断输入等基础配置,生成工程文件的问题。这里就省略了,有需要的朋友可以参考其他网络上资料。重点就看看关于GPIO配置,便于后面分析讲解代码。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于HAL库STM32F407外部中断实现的示例代码: ```c #include "main.h" /* External interrupt handler function */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_0) { /* Handle interrupt on GPIO Pin 0 */ } else if(GPIO_Pin == GPIO_PIN_1) { /* Handle interrupt on GPIO Pin 1 */ } /* Add more else if statements for other GPIO Pins */ } int main(void) { /* Initialize HAL library */ HAL_Init(); /* Initialize GPIO Pin for external interrupt */ GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); // Enable GPIOA clock GPIO_InitStruct.Pin = GPIO_PIN_0; // Use GPIO Pin 0 for interrupt GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; // Interrupt on falling edge GPIO_InitStruct.Pull = GPIO_PULLUP; // Use pull-up resistor HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // Initialize GPIOA /* Enable interrupt in NVIC */ HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); // Set interrupt priority HAL_NVIC_EnableIRQ(EXTI0_IRQn); // Enable interrupt in NVIC /* Start main loop */ while (1) { /* Do something else */ } } /* Interrupt handler function for GPIO Pin 0 */ void EXTI0_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); } ``` 在这个示例中,我们初始化了GPIO Pin 0并将其配置为下降沿触发的外部中断。在main函数中,我们还启用了中断,并使用HAL_GPIO_EXTI_Callback函数处理GPIO Pin 0的中断事件。最后,我们还定义了EXTI0_IRQHandler函数作为中断处理函数。 需要注意的是,我们还可以使用HAL库中的其他函数来配置外部中断,例如HAL_GPIO_WritePin和HAL_GPIO_ReadPin等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值