Cortex何时写入设备

问题描述

当写入Cortex M0上的设备寄存器(在我的情况下是STM32L073)时,会出现一个问题,即在a)排序对设备内存的访问以及b)确定对外围设备进行更改时应该多加小心配置实际上已经完成,以至于任何依赖项都变为有效。

一个特定的示例将内部稳压器更改为其他电压。您将更改写入PWR-> CR,并从PWR-> CSR读取状态。我看到了执行以下操作的代码

Write to PWR->CR to set the voltage range
Spin until (PWR->CSR & voltage flag) becomes zero

在我看来,这里有三个问题:

  1. 访问顺序。这是设备内存,因此相对于其他设备访问事务保留了事务顺序。我认为这意味着在写入CR和从CSR读取之间不需要DSB。一个链接的问题及其答案是:[ARM CortexA]Difference between Strongly-ordered and Device Memory Type

  2. 可以缓冲设备存储器。从CSR进行读取时,是否有可能继续写入CR。这将意味着电压标志将清除并且代码将继续。实际上,国旗还没有涨!

  3. 硬件响应时间。在写入和最终效果之间是否存在延迟?实际上,应该始终对此进行记录-对于STM32,文档中的文档明确地说,当CR寄存器更改时,该标志就被设置了。

这里是否存在比赛条件的可能性?真正让我担心的是缓冲-外设读取发生时外设写仍在进行中。

解决方法

访问顺序。

访问被严格地排序,并且您不需要屏障指令来回读同一寄存器。

可以缓冲设备内存。是否有可能写入CR

是的,有可能。但这不是因为缓冲,而是因为总线传播时间。特定操作可能需要花费多个时钟才能通过所有网桥。

硬件响应时间。在写入和写入之间是否存在延迟 效果成为最终决定

即使存在延迟,从您的角度来看也不重要。如果您将CR寄存器中的位置1,然后等待状态寄存器中的结果。只需等待状态位具有期望值即可。