怎样缩短中断进入时间
使用芯片stm32f103c8t6ADC采样配置如下:
void ADC_Conf(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1);
ADC_StructInit(&ADC_InitStructure);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T4_CC4;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Left;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_2,1,ADC_SampleTime_13Cycles5);
NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // AD中断优先级最高
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
ADC_ExternalTrigConvCmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE);
}
AD中断服务函数如下:
void ADC1_2_IRQHandler(void)
{
if (ADC1->SR & 0x02)
{
ADC1->SR = ~(uint32_t)0x02;
adc.adc_samples = _IQ16toIQ(ADC_GetConversionValue(ADC1));
}
}
问题:
从发生中断到进入中断服务函数时间过长(不计算中断执行时间),大概在6us左右。
请问各位大神,有没有办法把这个进入时间缩短到2us左右。
想办法缩短ADC转换时间,中断响应应该是ns级的 这个时间主要是受内核的压栈时间,在cotrtex-m3内核上说为12个机器周期,也就是说你想缩短时间,看看是否可以提高mcu速率,还有一个你这个中断优先级的配置,提高中断优先级为1,0;减少优先级分组,减少其优先级判断的时间,也会有些作用。 你这个6us是怎么得出的?测量方法得对,是前提。 采用DMA方式就无需计较中断进入时间了。 谢谢 @tanic 提醒
我这边程序里面AD采样时钟为12M
RCC_HCLKConfig(RCC_SYSCLK_Div1); // AHB 72M
RCC_PCLK2Config(RCC_HCLK_Div1); // APB2 72M
RCC_PCLK1Config(RCC_HCLK_Div2); // APB1 36M
RCC_ADCCLKConfig(RCC_PCLK2_Div6); // ADC 12M
11.6 Channel-by-channel programmable sample time
ADC samples the input voltage for a number of ADC_CLK cycles which can be modified using
the SMP bits in the ADC_SMPR1 and ADC_SMPR2 registers. Each channel can be
sampled with a different sample time.
The total conversion time is calculated as follows:
Tconv = Sampling time + 12.5 cycles
Example:
With an ADCCLK = 14 MHz and a sampling time of 1.5 cycles:
Tconv = 1.5 + 12.5 = 14 cycles = 1 μs
按照11.6计算的话:
Tconv = 13.5 + 12.5 = 26 cycles = 2.17us
这里还有其他什么原因吗?
谢谢 @sky_han 方法可以考虑 to @toofree
使用定时器计数并计算的。每次TIM4计数到CCR4的时候触发中断,而进入中断后TIM4的CNT值比CCR4增加了200左右,定时器的时钟为36M。
感谢@sky_han
通过改变NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 不过没有明显效果。
谢谢@wenyangzeng
本方案中不能采用DMA,以后该中断函数中还有其他的命令执行。
页:
[1]
2