硬汉嵌入式论坛

 找回密码
 立即注册
查看: 443|回复: 7
收起左侧

[有问必答] 请问STM32 EXTI外部中断 能检测的速度是多少?

[复制链接]

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2024-1-18 20:08:16 | 显示全部楼层 |阅读模式
我这边要测试一个周期为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个,看来提前清除中断标志位很有必要啊

回复

使用道具 举报

0

主题

214

回帖

214

积分

高级会员

积分
214
发表于 2024-1-19 06:24:20 | 显示全部楼层
你还不如用计数器的脉冲捕获
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2024-1-19 10:20:16 | 显示全部楼层
regbbs 发表于 2024-1-19 06:24
你还不如用计数器的脉冲捕获

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

使用道具 举报

210

主题

1042

回帖

1682

积分

至尊会员

More we do, more we can do.

积分
1682
发表于 2024-1-19 13:42:53 | 显示全部楼层
以G0为例,GPIO达到80MHz的速度,剩下得看软件性能了。
回复

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2024-1-19 19:47:54 | 显示全部楼层
103应该可以跑72MHz, 1us脉以现在的代码,应该是足够时间处理的
查看一下主时钟是否72MHz, 另外是否还有其它中断同时打开了
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2024-1-20 10:00:33 | 显示全部楼层
Edmund1964 发表于 2024-1-19 19:47
103应该可以跑72MHz, 1us脉以现在的代码,应该是足够时间处理的
查看一下主时钟是否72MHz, 另外是否还有其 ...

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

使用道具 举报

2

主题

61

回帖

67

积分

初级会员

积分
67
发表于 2024-1-20 13:38:07 | 显示全部楼层
如果只是用于计数,使用timer的计数模式,1us这个中断频率太高了,在实际产品用,不实用,并且进出中断都需要时间
回复

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2024-1-23 11:41:10 | 显示全部楼层
yinghan666 发表于 2024-1-20 10:00
主时钟是72MHz,有其他中断,我把目前这个的中断优先级提的比较高了

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 13:54 , Processed in 0.181607 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表