外部中断无法触发的问题记录

描述

GPIO外部中断一直无法触发

分析

CUBE生成的程序中, SysTick是中断型延时(利用中断来查询时间到了没)。

   /* Use systick as time base source and configure 1ms tick (default clock after Reset is MSI) */ 
    HAL_InitTick(TICK_INT_PRIORITY);
    #define  TICK_INT_PRIORITY            ((uint32_t)0x000F)    /*!< tick interrupt priority */  

SysTick是内核中断,优先级别默认最低。

(可以用内核函数来修改~ 当然,这就要看内核M3的书了,而不是看STM32的参考手册那么简单。暂时就不深入研究,日后更新。)

总结起来就是,就是传说中优先级别默认最低,虽然SysTick一直在跑,但是没进入到中断来读取它的值~
(不知是哪里让我潜意识地认为SysTick级别比外设都高,导致这问题)
如果中断里调用HAL_Delay就会停在那里,因为根本不会进入那个级别更低的中断。

解决办法

延迟消抖改为
unsigned int count = 2500;
while(count–); //消抖

参考博客

1、为何HAL库的工程“进入不了”外部中断?
2、中断里调用HAL_Delay()进入死循环的原因

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,我是ChitGPT! 关于您的问题,我可以帮您解答。首先,STM32F103C8T6的外部中断是通过设置NVIC寄存器和EXTI寄存器来实现的,您可以通过以下代码实现外部中断的上升沿触发和频率记录: ```c++ #include "stm32f10x.h" uint32_t pulseCount = 0; float frequency = 0; void EXTI0_IRQHandler(void) { pulseCount++; EXTI_ClearITPendingBit(EXTI_Line0); } int main(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOA, &GPIO_InitStructure); EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); while(1) { frequency = (float)pulseCount * 1000.0 / 4000.0; // Assuming a 4ms period pulseCount = 0; } return 0; } ``` 在中断处理函数中,我们累加脉冲计数器,然后在主函数中计算频率。这个例子假设外部中断信号的周期为4ms,如果不同,您需要根据实际情况进行修改。 希望这能解决您的问题!如果您还有其他问题,可以继续问我哦。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值