为什么我们需要指定闪存等待周期数?

Fel*_*ara 1 stm32 cortex-m

特别是在使用 STMF4xx/F7xx 等“更快”的设备时,我们需要根据电源电压和系统时钟频率指定闪存等待周期数。

当 CPU 获取指令/或常量时,这是通过 FLITF 完成的。我的假设是否正确,即 FLITF 只要能够提供所请求的数据,就会保留 CPU 请求,从而使其他总线主控器无法同时访问闪存。

如果这是真的,为什么了解闪存等待周期对于任何接口来说都很重要。就像缓存一样,它会预加载指令,如果它知道要等待多长时间,那么它是独立的,不是吗?

Not*_*hat 6

因为闪存接口并不神奇。

它必须满足寻址和读出闪存单元所需的设置和保持时间,该时间会根据电压而有所不同。以 STM32F411 为例(因为我手头有 TRM),对电压/频率/等待状态表进行一些数学计算意味着从其中一个闪存读取数据需要大约 30ns(高于 2.7V,低于 2.7V)低于 2.1V 约 60ns。

由于闪存接口没有自己的异步纳秒精度计时能力(因为这会不必要地复杂、耗电且愚蠢),这意味着在n 个时钟周期内断言其信号,之后它可以假设数据来自细胞的信号足够稳定,可以读回*。它如何知道时钟频率是多少,从而知道n应该是多少?很简单:你,作为设置时钟的程序员,告诉它。有些硬件问题让软件处理起来要容易得多。

*然后进行进一步的恶作剧,从读取的 128 位行中提取相关的 8、16 或 32 位,显然最终将从另一侧吐出到 AHB 总线上等待的 CPU。

  • 我对 ST 的内部闪光灯有过使用不正确的等待状态设置的经验,甚至关闭一个也会导致很难追踪的问题。即使您将等待状态削减到低于他们指定的水平。它可能在室温下工作,但在较冷或较热时开始失效。一旦你发现闪光灯配置不正确,一切就都有意义了,但在此之前你会疯狂地试图在所有错误的地方找出问题。 (4认同)