为什么我们需要指定闪存等待周期数?
Why do we need to specify the number of flash wait cycles?
特别是在使用 "faster" 设备时,例如 STMF4xx/F7xx 我们需要根据电源电压和系统时钟频率指定闪存等待周期数。
当 CPU 获取 instructions/or 常量时,这是通过 FLITF 完成的。我的假设是否正确,即 FLITF 持有 CPU 请求,只要它可以提供请求的数据,使得其他 Bus-Masters 不可能同时访问闪存。
如果这是真的,那么为什么了解闪存等待周期对任何接口来说都很重要。就像缓存会预加载指令一样,如果它知道要等待多长时间是独立的,不是吗?
因为 Flash 界面并不神奇。
它必须满足寻址和读出闪存单元所需的设置和保持时间,这会因电压而有所不同。以 STM32F411 为例(因为我手边有那个 TRM),用 voltage/frequency/wait-state table 做一些数学运算意味着从闪存读取其中一个需要大约 2.7V 以上的 30ns ,低至 2.1V 以下 ~60ns。
由于闪存接口没有自己的异步纳秒级精度计时能力(因为那会不必要地复杂、耗电且愚蠢),这转化为断言其信号 n 个时钟周期,之后它可以假设来自单元的数据信号是 stable 足以读回 *。它如何知道时钟频率是多少,以及 n 应该是多少?很简单:你,作为设置时钟的程序员,告诉它。有些硬件的东西让软件处理起来要容易得多。
* 和 then 通过进一步的恶作剧从读取的 128 位行中提取相关的 8、16 或 32 位,最终显然,将 从另一侧吐到 AHB 总线上等待 CPU。
特别是在使用 "faster" 设备时,例如 STMF4xx/F7xx 我们需要根据电源电压和系统时钟频率指定闪存等待周期数。
当 CPU 获取 instructions/or 常量时,这是通过 FLITF 完成的。我的假设是否正确,即 FLITF 持有 CPU 请求,只要它可以提供请求的数据,使得其他 Bus-Masters 不可能同时访问闪存。
如果这是真的,那么为什么了解闪存等待周期对任何接口来说都很重要。就像缓存会预加载指令一样,如果它知道要等待多长时间是独立的,不是吗?
因为 Flash 界面并不神奇。
它必须满足寻址和读出闪存单元所需的设置和保持时间,这会因电压而有所不同。以 STM32F411 为例(因为我手边有那个 TRM),用 voltage/frequency/wait-state table 做一些数学运算意味着从闪存读取其中一个需要大约 2.7V 以上的 30ns ,低至 2.1V 以下 ~60ns。
由于闪存接口没有自己的异步纳秒级精度计时能力(因为那会不必要地复杂、耗电且愚蠢),这转化为断言其信号 n 个时钟周期,之后它可以假设来自单元的数据信号是 stable 足以读回 *。它如何知道时钟频率是多少,以及 n 应该是多少?很简单:你,作为设置时钟的程序员,告诉它。有些硬件的东西让软件处理起来要容易得多。
* 和 then 通过进一步的恶作剧从读取的 128 位行中提取相关的 8、16 或 32 位,最终显然,将 从另一侧吐到 AHB 总线上等待 CPU。