aceking1123 发表于 2019-3-27 17:34:38

F405,DMA受到串口或者TIM中断而延迟2-6us。,有遇到的吗?

本帖最后由 aceking1123 于 2019-3-27 17:43 编辑

周期触发DMA,传数组到SPI,在F103上一直正常,移植到F405上出问题,

具体表现在,不打开串口和TIM中断,DMA可以准时发送数据

一旦打开串口或者TIM中断,DMA使能函数被调用后,总是慢个2-6us,SPI才发送数据。。

最先以为是串口或者TIM中断影响了DMA使能函数的调用,做了个计数器监测程序,发现并没有,DMAENABLE()被调用的时刻正常(误差0.3us以内),那么问题就在于DMAENABLE()后延迟执行了。。

SPI和DMA,中断优先级都已经设置成最高了。。仍然会受到串口TIM外设影响。。

第一次遇到外设干扰DMA,岂止蛋痛简直是蛋碎了。。难道是F405内核的问题吗?


程序:
这是调用DMA程序,rectim5是测试用,通过读TIM5计数器,检查被执行时间点对不对,只有+-0.3us误差是没问题的



DMA使能程序:


初始化程序:
DMA优先级已经设置为高


中断优先级最高:




SPI初始化程序:



xmshao 发表于 2019-4-23 10:55:35

hi,
你将UART和TIM的中断使能指令 放在 DMAENABLE()之后 测试下结果看看。

edmundlee 发表于 2019-4-23 14:37:47

这明显是因为, 串口和TIM的中断引起的, 要证明这一点很容易,加上红色这两句, 如果不再受影响就证明这猜测是正确的。

__set_PRIMASK(1);
DMAENABLE()
__set_PRIMASK(0);

aceking1123 发表于 2019-4-29 10:27:25

edmundlee 发表于 2019-4-23 14:37
这明显是因为, 串口和TIM的中断引起的, 要证明这一点很容易,加上红色这两句, 如果不再受影响就证明这猜 ...

不行的,为了不让中断影响,下面语句都试了一圈了,中断的时候还是SPI延迟,

我觉得可能是圧栈时间过长的原因,还在找问题,找到了来更新帖子

        __set_PRIMASK(1);                                                        //__disable_irq() ;                 //关闭       
        //USART_ITConfig(USART1, USART_IT_TC,                 DISABLE);                  //发送完成中断
        //USART_ITConfig(USART1, USART_IT_RXNE,         DISABLE);                  //接收中?
        //__ASM("CPSID I");                //关闭
        //__ASM("CPSIE I");
        //__disable_irq() ; //关闭总中断
        //__enable_irq() ; //打开总中断

发表于 2019-4-29 11:06:22

把tim和串口的组优先级调低一级试试。

xmshao 发表于 2019-4-29 15:18:01

请问你的UART中断和TIMER中断的服务程序里主要做些操作?有访问哪些外设或存储块?
页: [1]
查看完整版本: F405,DMA受到串口或者TIM中断而延迟2-6us。,有遇到的吗?