本帖最后由 fq1110 于 2016-5-4 17:13 编辑
大家好,我做了一个定时器,时间间隔1S,在这一秒内,我做了一个IO口上升沿中断检测,不断统计IO口上升沿的个数。另外我用了一个信号发生器产生3M左右方波信号,占空比50%左右,接入这个IO口上,但是发现1S内检测到的中断个数只有1点几M,将信号发生器频率调至2M,基本能测到1.98M左右。4M/5M测出来都是2M左右。以下是主要代码:
//中断配置
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource6);
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Line = EXTI_Line6;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//EXTI_Trigger_Falling;//
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_ClearFlag(EXTI_Line6);
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//中断函数
volatile u32 Num=0;
void EXTI9_5_IRQHandler(void)
{
//if(EXTI->PR & 0x40)
{
EXTI->PR = 0x40;
Num++;
}
}
//1S定时器内设置断点,并去检查这个Num的值,以检测实际测的IO口中断次数,同时并重新清零Num
在软件设计时,我考虑了中断函数的执行时间,没有使用函数库,并且屏蔽了一些不必要的判断。大家能帮我看看中断函数还能优化吗?我希望能达到4M左右的高频较精确的检测。
从理论上讲,72M频率,1.25MIPS/Mhz 1.25*72=90Mips,如果中断函数中的运行周期超过40,则中断的次数最多90M/40=2.25M。
请大家指导,IO口中断频率最大能达到多少,在软件设计上还有什么需要注意的地方?我这的中断函数中的指令到底用了多少个时钟周期,大家有没有关于此方面的介绍,网上没有找到。
非常感谢大家。
|