用外部中断计数编码盘脉冲,当我用一个轮子测试时,应该只会进入到一个中断里,并将相应计数脉冲通过串口传输到PC机,实际上两个中断都进去了。另外我用原子提供的外部中断实验,在两个中断函数里分别添加printf(“。。。。。。”),用一个管脚测试时,实际上也进入到两个中断里,并通过串口都打印出了相应信息。以下程序是编码盘测脉冲的程序,以及串口打印的信息截取如下。望大神指点,不甚感激。
#include "pulsecount.h"
#include "delay.h"
#include "usart.h"
u32 Left_Count,Right_Count; //左右轮脉冲计数值
//左右轮计数相应管脚PB.0和PB.1初始化及外部中断4,5初始化
void PULSECOUT_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
//GPIOB.0 中断线以及中断初始化配置 下降沿触发
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);
EXTI_InitStructure.EXTI_Line = EXTI_Line0; //左轮
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
//GPIOB.1 中断线以及中断初始化配置 下降沿触发
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);
EXTI_InitStructure.EXTI_Line=EXTI_Line1; //右轮
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能左轮计数所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; //抢占优先级1,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //使能右轮计数所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; //抢占优先级1,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);
}
void EXTI0_IRQHandler(void)
{
printf("The left wheel counting is %d\r\n",Left_Count);
Left_Count++;
EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位
}
void EXTI1_IRQHandler(void)
{
printf("The right wheel counting is %d\r\n",Right_Count);
Right_Count++;
EXTI_ClearITPendingBit(EXTI_Line1); //清除LINE1上的中断标志位
}
|