打印
[STM32F1]

stm32f103外部中断丢码

[复制链接]
496|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Thomas2022|  楼主 | 2022-8-3 10:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32接收编码器脉冲,加四倍频辨向,用外部中断做的。
接收2000线的不丢码,但接收高速脉冲一直丢码,脉冲速率大概50khz左右,脉冲丢%10到%20这个区间内,中断程序执行时间大概2-3μs,程序中也没有其他的中断,优先级也设置为了0,实在找不出原因,能否有高人指点或者提点建议,非常感谢。

使用特权

评论回复
评论
Liuchangan 2022-8-3 18:44 回复TA
、、、 
沙发
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);
}

使用特权

评论回复
评论
Liuchangan 2022-8-3 18:44 回复TA
、、、 
板凳
专注于嵌入式| | 2022-8-3 12:43 | 只看该作者
这样做没有意义

使用特权

评论回复
评论
Thomas2022 2022-8-4 16:00 回复TA
@专注于嵌入式 :但是测了中断程序所用时间之后,导师认为一定是还存在问题,并不是硬件限制住了。 
专注于嵌入式 2022-8-4 15:40 回复TA
@Thomas2022 :如果真的有能力,那么为什么还会丢掉呢?单片机进入中断和离开中断也需要时间的。 
专注于嵌入式 2022-8-4 15:38 回复TA
@Thomas2022 :你中断这么快,其他事情都没法做了,那么你这个还有什么用呢。真正的项目中是不会这样做的。不然人家搞个编码器干嘛。讲究实用性。 
Thomas2022 2022-8-4 15:19 回复TA
@专注于嵌入式 :您的意思我明白,但是我用的C8T6,四个定时器还要用在其他的方面。而且关键是外部中断本身是有能力接收这种频率的数据,现在一直丢码,想搞清楚原因。 
专注于嵌入式 2022-8-4 08:29 回复TA
@Thomas2022 :STM32不是有编码器接口么?为什么不用。还有中断本生调用也需要时间的。 
Thomas2022 2022-8-3 15:00 回复TA
您好,我不太明白,具体是指哪方面没有意义 
地板
asmine| | 2022-8-3 20:07 | 只看该作者
四倍频变向是?

使用特权

评论回复
5
zhanghqi| | 2022-8-3 22:31 | 只看该作者
没有其他的中断?

使用特权

评论回复
6
Thomas2022|  楼主 | 2022-8-4 09:47 | 只看该作者
asmine 发表于 2022-8-3 20:07
四倍频变向是?

双沿检测

使用特权

评论回复
7
Thomas2022|  楼主 | 2022-8-4 10:00 | 只看该作者
zhanghqi 发表于 2022-8-3 22:31
没有其他的中断?

对,只有外部中断

使用特权

评论回复
8
专注于嵌入式| | 2022-8-4 15:43 | 只看该作者
还有一个你的中断执行确定2-3US?

使用特权

评论回复
9
Thomas2022|  楼主 | 2022-8-4 15:57 | 只看该作者
专注于嵌入式 发表于 2022-8-4 15:43
还有一个你的中断执行确定2-3US?

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

使用特权

评论回复
10
asmine| | 2022-8-6 16:42 | 只看该作者

好高深啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

0

粉丝