STM32/STM8技术论坛
直播中

季晓龙

未满1年用户 3经验值
擅长:可编程逻辑 嵌入式技术 EDA/IC设计 接口/总线/驱动
私信 关注
[问答]

关于江协科技的中断实验

在江协科技的stm32的中断实验的视频中的实验。为什么最后即使加了再次判断引脚电平,但是还是不稳定,还会有跳变啊?有没有大神解答一下疑惑?

附代码:



#include "stm32f10x.h"                  // Device header

int16_t Encoder_Count;

void Encoder_Init(void)

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);

EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_Init(&NVIC_InitStructure);


}

int16_t Encoder_Get(void)

{

int16_t Temp;

Temp = Encoder_Count;

Encoder_Count = 0;

return Temp;

}

void EXTI0_IRQHandler(void)

{

if (EXTI_GetITStatus(EXTI_Line0) == SET)

{

/ *如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动* /

if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)

{

if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)

{

Encoder_Count --;

}

}

EXTI_ClearITPendingBit(EXTI_Line0);

}

}

void EXTI1_IRQHandler(void)

{

if (EXTI_GetITStatus(EXTI_Line1) == SET)

{

/ *如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动* /

if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)

{

if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)

{

Encoder_Count ++;

}

}

EXTI_ClearITPendingBit(EXTI_Line1);

}

}

回帖(1)

jf_40131637

2025-10-25 08:25:53
你要延时过后再次判断,单片机处理一条语句很快的,你要在第一次判断过后加一个延时,要么你就直接写一个判断松手等待的while循环(要加超时退出机制)
举报

更多回帖

发帖
×
20
完善资料,
赚取积分