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初始化程序:
hi,
你将UART和TIM的中断使能指令 放在 DMAENABLE()之后 测试下结果看看。 这明显是因为, 串口和TIM的中断引起的, 要证明这一点很容易,加上红色这两句, 如果不再受影响就证明这猜测是正确的。
__set_PRIMASK(1);
DMAENABLE()
__set_PRIMASK(0); 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() ; //打开总中断 把tim和串口的组优先级调低一级试试。 请问你的UART中断和TIMER中断的服务程序里主要做些操作?有访问哪些外设或存储块?
页:
[1]