stm32f103外部中断丢码
stm32接收编码器脉冲,加四倍频辨向,用外部中断做的。接收2000线的不丢码,但接收高速脉冲一直丢码,脉冲速率大概50khz左右,脉冲丢%10到%20这个区间内,中断程序执行时间大概2-3μs,程序中也没有其他的中断,优先级也设置为了0,实在找不出原因,能否有高人指点或者提点建议,非常感谢。 (这是中断初始化函数)
void Init_EXTIX_TI(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure; //定义一个EXTI结构体变量
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能IO复用功能,使用中断功能重要!!!
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0;
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
//GPIO_ResetBits(GPIOB,GPIO_Pin_0);
//GPIO_ResetBits(GPIOB,GPIO_Pin_1);
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);//映射
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);
/* 设置外部中断结构体的成员*/
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式为中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
//EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line1;
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断线
EXTI_Init(&EXTI_InitStructure); //根据参数初始化中断寄存器
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //设置中断优先级分组
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //中断占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副优先级?
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure); //根据参数初始化中断寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //中断占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副优先级?
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure); //根据参数初始化中断寄存器
}
(中断执行函数)
void EXTI0_IRQHandler(void)
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);
Pinb=GPIO_ReadInputData(GPIOB);
ACurrLevel=((Pinb)>>(0)&1);
BCurrLevel=((Pinb)>>(1)&1);
if(EXTI_GetITStatus(EXTI_Line0)!= RESET) //判断是否发生中断,发生则中断标志置1
{
//GPIO_SetBits(GPIOC,GPIO_Pin_13);
if(last_ACurrLevel==1 && last_BCurrLevel==1)
{
if(ACurrLevel==0&&BCurrLevel==1)TIM3CH3_CAPTURE_COUNT++;
else if(ACurrLevel==1&&BCurrLevel==0)TIM3CH3_CAPTURE_COUNT--;
}
else if(last_ACurrLevel==0 && last_BCurrLevel==1)
{
if(ACurrLevel==0&&BCurrLevel==0)TIM3CH3_CAPTURE_COUNT++;
else if(ACurrLevel==1&&BCurrLevel==1)TIM3CH3_CAPTURE_COUNT--;
}
else if(last_ACurrLevel==0 && last_BCurrLevel==0)
{
if(ACurrLevel==1&&BCurrLevel==0)TIM3CH3_CAPTURE_COUNT++;
else if(ACurrLevel==0&&BCurrLevel==1)TIM3CH3_CAPTURE_COUNT--;
}
else if(last_ACurrLevel==1 && last_BCurrLevel==0)
{
if(ACurrLevel==1&&BCurrLevel==1)TIM3CH3_CAPTURE_COUNT++;
else if(ACurrLevel==0&&BCurrLevel==0)TIM3CH3_CAPTURE_COUNT--;
}
}
last_ACurrLevel=ACurrLevel;
last_BCurrLevel=BCurrLevel;
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
EXTI_ClearITPendingBit(EXTI_Line0);
} 这样做没有意义 四倍频变向是? 没有其他的中断? asmine 发表于 2022-8-3 20:07
四倍频变向是?
双沿检测 zhanghqi 发表于 2022-8-3 22:31
没有其他的中断?
对,只有外部中断 还有一个你的中断执行确定2-3US? 专注于嵌入式 发表于 2022-8-4 15:43
还有一个你的中断执行确定2-3US?
确定,中断前使得一个io口先拉高,中断后拉低,示波器看的io口的高电平持续时间。 Thomas2022 发表于 2022-8-4 09:47
双沿检测
好高深啊
页:
[1]