【发布时间】:2017-07-20 08:28:18
【问题描述】:
我以前用过 PIC,现在我用的是 STM32F415。 在我的代码的时间关键部分,我需要设置一个非常精确的延迟来调整 DAC-DMA 的周期,它们一起工作以创建周期性模拟信号。
我想添加的延迟从 0 到 63 个时钟周期(如果我能够做到 10-63 个时钟周期也可以)。在 PIC24F 汇编中,有一条指令“REPEAT”允许我重复下一条指令一定次数。这对我很有用,因为我可以这样做:
REPEAT #0xNUMBER
NOP
我试图找到与 STM32F4 类似的东西,但我在指令集、参考手册和一般互联网上搜索都没有运气。
我已经尝试在 C 中使用 for/while 循环和专用的计时器,但是所需的额外指令消耗了太多时间(40-50 个循环,具体取决于我的编程方式)。
如果有人有想法或知道怎么做,这对我来说非常有用。
非常感谢。
英语不是我的母语,所以对于任何可能的错误,我深表歉意。让我知道,我会努力改进它:)
编辑 1(2017 年 7 月 23 日)
感谢大家的回答,我一直很忙,无法单独回答你们每一个人。 我会尝试门控时钟的@berendi 解决方案,它似乎最适合我的应用程序。 学习了很多STM32不知道的东西,谢谢大家!
【问题讨论】:
-
您能提供更多关于您的系统如何工作的信息吗?这是一个周期性循环,您想添加一些受控抖动吗?
-
此代码进入 de DMA ISR。系统在每次半传输和每次传输完成时输入 ISR。因此,每次半传输我想添加一个非常小的延迟来将信号的周期调整到我想要的确切值。我停止使 de DMA-DAC 工作的定时器,进行延迟,然后再次启用它。代码有效,我可以延迟,但 C 代码指令所需的周期太多,所以我想要一个更有效的解决方案,比如我提到的 REPEAT-NOP。
-
我认为使用 DMA-DAC 和 TIMERS 组合来产生您想要的信号是一个更好的主意。手动延迟可能效率低下。
-
@ctasdemir 问题是在计算周期时,我从除法中得到错误。所以我计算了我在整个周期中“丢失”了多少个周期(因为周期分为 64 个值来构造信号),然后尝试手动“添加”它们。信号的后半部分为 0,因此再增加几个周期不会失真。
-
好的,除法运算需要可变数量的周期,您是否试图弥补这一点?是否可以在除法之前启动一个计时器,然后在除法之后对计时器进行忙碌等待?通过这种方式,硬件可以为您管理延迟。一个更好的步骤是,如果您的下一个阶段可以由定时器中断驱动,即延迟后的动作实际上是在定时器中断中?
标签: arm embedded stm32 stm32f4