Thomas2022 发表于 2022-8-3 10:26

stm32f103外部中断丢码

stm32接收编码器脉冲,加四倍频辨向,用外部中断做的。
接收2000线的不丢码,但接收高速脉冲一直丢码,脉冲速率大概50khz左右,脉冲丢%10到%20这个区间内,中断程序执行时间大概2-3μs,程序中也没有其他的中断,优先级也设置为了0,实在找不出原因,能否有高人指点或者提点建议,非常感谢。

Thomas2022 发表于 2022-8-3 10:40

(这是中断初始化函数)
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);
}

专注于嵌入式 发表于 2022-8-3 12:43

这样做没有意义

asmine 发表于 2022-8-3 20:07

四倍频变向是?

zhanghqi 发表于 2022-8-3 22:31

没有其他的中断?

Thomas2022 发表于 2022-8-4 09:47

asmine 发表于 2022-8-3 20:07
四倍频变向是?

双沿检测

Thomas2022 发表于 2022-8-4 10:00

zhanghqi 发表于 2022-8-3 22:31
没有其他的中断?

对,只有外部中断

专注于嵌入式 发表于 2022-8-4 15:43

还有一个你的中断执行确定2-3US?

Thomas2022 发表于 2022-8-4 15:57

专注于嵌入式 发表于 2022-8-4 15:43
还有一个你的中断执行确定2-3US?

确定,中断前使得一个io口先拉高,中断后拉低,示波器看的io口的高电平持续时间。

asmine 发表于 2022-8-6 16:42

Thomas2022 发表于 2022-8-4 09:47
双沿检测

好高深啊
页: [1]
查看完整版本: stm32f103外部中断丢码