STM32F407读取内部Flash是否需设置FLASH_ACR LATENCY?
关于STM32F407 168MHz下Flash等待周期的疑问解答
手册内容没有错误,不是无需设置Flash等待周期,而是你看到的代码里系统时钟初始化流程已经自动完成了这个配置,所以不需要单独写代码设置。
具体原因如下:
- 不管是ST标准库的
SystemInit()函数,还是HAL库的HAL_RCC_ClockConfig()等时钟配置函数,在将系统主频配置到168MHz时,都会根据当前时钟频率自动计算并设置Flash的等待周期(WS)。比如标准库的SystemInit()中,会直接针对168MHz的主频设置FLASH_ACR_LATENCY_5WS;HAL库则会通过HAL_FLASH_ConfigLatency()函数,根据传入的时钟参数匹配对应的等待周期。 - 你查阅的官方示例或网上代码,通常都会先调用系统时钟初始化函数,这一步已经隐性处理了Flash延迟的配置,所以不会看到单独的WS设置代码。
- 复位后默认0WS是事实,但如果跳过时钟初始化直接拉满主频且不设置WS,必然会导致Flash读取错误、程序跑飞等问题——手册的要求是必须遵守的,只是库函数帮你把这个步骤整合到了时钟初始化里。
举个标准库SystemInit()中的相关代码片段:
/* 配置Flash预取、指令缓存、数据缓存及等待周期 */ #if (STM32F40_41xxx || STM32F427_437xx || STM32F429_439xx || STM32F401xx) FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_5WS; #endif
简单说:不是不用设置,是初始化代码已经帮你做了,手册的要求完全正确。
内容的提问来源于stack exchange,提问作者ethan
相关产品推荐
相关产品推荐

