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

怎样缩短中断进入时间

[复制链接]
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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版