没有“循环”,重复一次指令一定次数?

时间:2017-07-20 08:28:19

标签: arm embedded stm32 stm32f4

之前我使用过PIC,现在我正在使用STM32F415。 在我的代码的时间关键部分,我需要一个非常精确的延迟来调整DAC-DMA的周期,它们一起工作以产生周期性的模拟信号。

我想要添加的延迟从0到63个时钟周期(如果我能够做10-63个时钟周期就可以了)。在PIC24F汇编中,有“REPEAT”指令允许我重复下一条指令一定次数。这对我来说很有用,因为我可以做到:

REPEAT #0xNUMBER
NOP

我正在尝试使用STM32F4找到类似的东西,但我没有在指令集,参考手册和一般的互联网上搜索。

我已经尝试在C中使用for / while循环和专用的定时器,但是额外的指令需要消耗太多时间(40-50个循环,具体取决于我编程的方式)。

如果某人有想法或知道如何做,那对我来说非常有用。

非常感谢。

英语不是我的母语,所以我很抱歉任何可能的错误。让我知道,我会尝试改进它:)

编辑1(23-jul-17)

感谢所有人的回答,我一直很忙,无法单独回答你们每个人。 我将尝试@berendi门控时钟的解决方案,它似乎最适合我的应用程序。 我正在学习很多关于我不知道的STM32的事情,谢谢大家!

3 个答案:

答案 0 :(得分:2)

  

我停止使DMA DMA工作的定时器,然后执行延迟   再次启用它。

因此,如果我正确理解它,您可以使用定时器A控制DAC,在每次计数器溢出时触发转换,并且您希望将其延迟一段可变的时钟周期。 / p>

STM32F4的大多数(如果不是全部)定时器支持门控模式从操作,您可以在其中选择另一个定时器(定时器B)作为主设备,并且定时器A仅在触发器计数时计数定时器B的输出为低电平。换句话说,定时器A将在定时器B的上升沿停止计数,并在下降沿重新开始计数。现在,配置定时器B在启用时输出单脉冲,其中脉冲宽度是您想要的延迟,然后定时器A将在脉冲的确切持续时间内延迟。

enter image description here

参见参考手册中有关单脉冲模式,定时器和外部触发同步以及CR1,CR2和SMCR寄存器的说明。

答案 1 :(得分:1)

对于延迟,NOP不是一个很好的解决方案。请使用屏障指令,因为执行时间与ARM文档中的描述完全相同(3,4或5个周期,具体取决于指令和核心版本)。您可以设置n个连续的障碍来存档您需要的延迟

答案 2 :(得分:1)

在PIC上你可以做到这一点,这是一个非常常见的解决方案,执行时间是确定性的。像这样的外部架构,以及同样具有确定性(在克隆出来之前)的旧芯片也是可以的。但总的来说,这不是你如何延迟,它不是确定性的,你可以得到一个"至少这么长的"对于一个调谐的循环,但你不能得到"正是这么长的"甚至调整,或永远不应该期望。这就是为什么在mcu设计中通常有多个定时器,这就是你用来测量时间的原因。对于你试图解决的问题,这就是解决方案,一个计时器或级联计时器,如果你真的需要它。

Arm没有x86之类的重复指令你最小的循环将是两个指令我无数次证明在同一芯片上这个循环的速度可以变化,所以调整它,添加一行代码和延迟此循环更改的属性

here:
  sub r0,#1
  bne here

对于经典(气体)语法,对于统一语法,使用subs而不是sub。

你也在stm32上,他们在指令端有一个你无法关闭或控制的隐藏缓存,它通常不会给你等待状态性能,当然对于这样的事情,但显然他们没有大小的缓存闪存所以预取周期必须在某个地方发生,而且你必须期望在跳转到这个循环时你有时会感觉到预取。