STM8外部中断不响应

STM8外部中断不响应

坑哥在编写STML152K4的一个简单的按键输入中断时被迷惑了半天,做一个总结帮助后人填坑。

BUG坑现象
void key_init(void) {
	
	GPIO_Init(POWER_KEY, GPIO_Mode_In_FL_IT);
	EXTI_DeInit();
	EXTI_SetPinSensitivity(EXTI_Pin_4, EXTI_Trigger_Falling);//下降沿触发
}

上面是一个按键外部中断初始化的代码,看似没什么问题。但是调试时候问题出现了,稍微碰一下按键中断在中断函数里不断进行触发,即使请了外部中断标志位 还是不停触发。通过调试发现需要在按键初始化前先关闭总中断 然后在开启总中断。

void key_init(void) {
	
	disableInterrupts();
	GPIO_Init(POWER_KEY, GPIO_Mode_In_FL_IT);
	EXTI_DeInit();
	EXTI_SetPinSensitivity(EXTI_Pin_4, EXTI_Trigger_Falling);
	enableInterrupts();
}

通过上面配置,还是发现当IO配置成浮空输入时候因为没有固定的电平会经常误触发,因此建议使用IO配置成GPIO_Mode_In_PU_IT这种模式给予固定的上拉电平。

在看一下硬件上面的BUG问题

下面是客户的一个板子的原理图按键,我在实际使用时IO配置成输入上拉中断模式发现死活不能进入中断函数。后面经过分析问题出在了这个电阻上面,当IO配置成上拉模式时候此处电阻过大(可能客户为了低功耗不得而知)导致得不到低电平了。具体可以看下STM8L手册配置成IO上拉时官方给接电阻是多少,结合此处的电阻进行合理选择达到功耗最低。此处坑哥后来改成了4.7K可以正常使用。
在这里插入图片描述

对坑哥对软文感兴趣可以关注支持下,坑哥将会继续努力填坑。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32中,外部中断可以通过配置GPIO口的中断触发方式来实现。以下是一个简单的外部中断响应的示例代码: ```c #include "stm32f4xx.h" void EXTI0_IRQHandler(void) // 定义外部中断0的中断服务函数 { if(EXTI_GetITStatus(EXTI_Line0) != RESET) // 判断是否产生了外部中断0 { // 在此处添加中断处理代码 EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志位 } } int main(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); // 使能SYSCFG时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置GPIOA.0为输入口 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 配置为输入模式 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉模式 GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA.0 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); // 配置中断线路为GPIOA.0 EXTI_InitStructure.EXTI_Line = EXTI_Line0; // 配置中断线路为外部中断0 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 配置为中断模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能中断线路 EXTI_Init(&EXTI_InitStructure); // 初始化中断线路 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; // 配置中断通道为外部中断0 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; // 抢占优先级为0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; // 子优先级为1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中断通道 NVIC_Init(&NVIC_InitStructure); // 初始化中断通道 while(1) { } } ``` 在上述代码中,我们首先配置了GPIOA.0为输入口,并通过SYSCFG_EXTILineConfig()函数将中断线路配置为GPIOA.0。接下来,我们初始化了外部中断0的EXTI_InitStructure,并通过EXTI_Init()函数将其初始化。最后,我们配置了中断通道为外部中断0,并通过NVIC_Init()函数将其初始化。在中断服务函数EXTI0_IRQHandler()中,我们添加了中断处理代码,并通过EXTI_ClearITPendingBit()函数清除了中断标志位。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值