你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

怎样缩短中断进入时间

[复制链接]
michael_nuaa 提问时间:2019-4-10 16:42 /
使用芯片stm32f103c8t6

ADC采样配置如下:
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[0] = _IQ16toIQ(ADC_GetConversionValue(ADC1));
    }
}


问题:
从发生中断到进入中断服务函数时间过长(不计算中断执行时间),大概在6us左右。
请问各位大神,有没有办法把这个进入时间缩短到2us左右。
收藏 评论19 发布时间:2019-4-10 16:42

举报

19个回答
michael_nuaa 回答时间:2019-4-10 17:19:22
谢谢 @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[2:0] 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

这里还有其他什么原因吗?
michael_nuaa 回答时间:2019-4-12 12:06:42
问题算是找到了
if (ADC_GetITStatus(ADC1, ADC_IT_EOC) == SET) 占用了较长时间,后面估计要改成汇编了

谢谢各位

    if (ADC_GetITStatus(ADC1, ADC_IT_EOC) == SET) //if (ADC1->SR & 0x02)
    {  
        GPIO_SetBits(GPIOB, GPIO_Pin_5);
       ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
    }
edmundlee 回答时间:2019-4-11 12:04:28
先改一段测试代码, 不要让它中断, 就在主函数轮询ADC的EOS, 便可确认转换时间是否如楼主所原先所设计的
先确认了是哪儿的问题才想解决方案吧, 除非你有N个中断在ADC中断前发生了, 否则中断的响应时间是不可能是几个us的
所以我觉得是转换时间的问题

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

tanic 回答时间:2019-4-10 17:04:03
想办法缩短ADC转换时间,中断响应应该是ns级的

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

sky_han 回答时间:2019-4-10 17:15:44
这个时间主要是受内核的压栈时间,在cotrtex-m3内核上说为12个机器周期,也就是说你想缩短时间,看看是否可以提高mcu速率,还有一个你这个中断优先级的配置,提高中断优先级为1,0;减少优先级分组,减少其优先级判断的时间,也会有些作用。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

七哥 回答时间:2019-4-10 17:16:20
你这个6us是怎么得出的?测量方法得对,是前提。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

wenyangzeng 回答时间:2019-4-10 17:16:38
采用DMA方式就无需计较中断进入时间了。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

michael_nuaa 回答时间:2019-4-10 17:21:01
谢谢 @sky_han 方法可以考虑
michael_nuaa 回答时间:2019-4-10 17:24:26
to @toofree
使用定时器计数并计算的。每次TIM4计数到CCR4的时候触发中断,而进入中断后TIM4的CNT值比CCR4增加了200左右,定时器的时钟为36M。
michael_nuaa 回答时间:2019-4-10 17:30:08
感谢@sky_han
通过改变NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 不过没有明显效果。
michael_nuaa 回答时间:2019-4-10 17:32:39
谢谢@wenyangzeng
本方案中不能采用DMA,以后该中断函数中还有其他的命令执行。
sky_han 回答时间:2019-4-10 17:44:47
理论分析:

你的MCU正在执行其他程序,此时中断发生,MCU需要判断此中断以及优先级,然后保护现场进行压栈,然后取中断服务程序地址,还有hclk速率不要分频这会影响存储速度,同样增加时间,你想想从哪里能够省下时间?
捕获M3.JPG

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

tanic 回答时间:2019-4-11 09:35:43
应当用示波器测量
启动ADC转换拉一个IO高  ,进入ADC中断后再拉低,看脉冲宽度。
废鱼 回答时间:2019-4-11 09:53:44
把其他的中断优先级设置低于ADC中断。ADC采样设置到最小。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

michael_nuaa 回答时间:2019-4-12 11:12:57
本帖最后由 michael_nuaa 于 2019-4-12 11:14 编辑

to @edmundlee
软件中循环输出GPIO,用逻辑分析仪测试发现大概需要2.45us,和理论计算2.17us有一点差距。

使用中断方式发现从触发到进入中断需要3.48us
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版