yinghan666 发表于 2024-1-18 20:08:16

请问STM32 EXTI外部中断 能检测的速度是多少?

我这边要测试一个周期为1us的脉冲次数,
芯片是STM32F103VCT6用PA6去测试,
输入33个只能检测到19个,而且每次都是19个,
请问是外部中断的速度问题呢还是什么原因呢?


void ex_pa6_Init()
{
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;

    // RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟

    /*初始化PA6*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;         
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//浮空
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

//将中断线0 与GPIOA映射起来,那么GPIOA.0与EXTI 1中断线连接了
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource6);

//EXTI_DeInit();
    /*初始化外部中断1为上升沿触发*/
    EXTI_InitStruct.EXTI_Line = EXTI_Line6;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;//外部中断打开
    EXTI_Init(&EXTI_InitStruct);

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);

    NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);   

}

void EXTI9_5_IRQHandler(void)
{
    //确保是否产生了EXTI Line中断
    if(EXTI_GetITStatus(EXTI_Line6) != RESET)
    {
      EXTI_ClearITPendingBit(EXTI_Line6);   //清除中断标志位
      freq_cnt++;
    }
}




而且我将
freq_cnt++;
放在
EXTI_ClearITPendingBit(EXTI_Line6);
这句之前的话,只能检测到14个,看来提前清除中断标志位很有必要啊

regbbs 发表于 2024-1-19 06:24:20

你还不如用计数器的脉冲捕获

yinghan666 发表于 2024-1-19 10:20:16

regbbs 发表于 2024-1-19 06:24
你还不如用计数器的脉冲捕获

脉冲捕获速率能多少啊?我先试的脉冲捕获,没有捕获到,才改的外部中断

emwin 发表于 2024-1-19 13:42:53

以G0为例,GPIO达到80MHz的速度,剩下得看软件性能了。

Edmund1964 发表于 2024-1-19 19:47:54

103应该可以跑72MHz, 1us脉以现在的代码,应该是足够时间处理的
查看一下主时钟是否72MHz, 另外是否还有其它中断同时打开了

yinghan666 发表于 2024-1-20 10:00:33

Edmund1964 发表于 2024-1-19 19:47
103应该可以跑72MHz, 1us脉以现在的代码,应该是足够时间处理的
查看一下主时钟是否72MHz, 另外是否还有其 ...

主时钟是72MHz,有其他中断,我把目前这个的中断优先级提的比较高了

heluo1985 发表于 2024-1-20 13:38:07

如果只是用于计数,使用timer的计数模式,1us这个中断频率太高了,在实际产品用,不实用,并且进出中断都需要时间

Edmund1964 发表于 2024-1-23 11:41:10

yinghan666 发表于 2024-1-20 10:00
主时钟是72MHz,有其他中断,我把目前这个的中断优先级提的比较高了

靠中断优先级是解决不了此问题的,你现在的问题在于CPU执行时间够不
进中断啥也不做要12周期, 退出又是另外12周期, 你现在的中断处理大慨10来个周期, 那已经用去了 ~0.5us, 如果说再打开另一中断, 根本就不够速度保证响应每一个中断。
用CAPTURE+DMA吧

Xaurora 发表于 2024-5-9 17:51:03

为啥不用捕获啊:lol

albert.hu 发表于 5 天前

中断函数用寄存器写一下,再优化写法,如果只有这个中断,不要判断了,优化等级提高一下,会有效果。最好是捕获模式
页: [1]
查看完整版本: 请问STM32 EXTI外部中断 能检测的速度是多少?