flash_acr_latency

关于flash_acr_latency的理解

这个问题网上查了很多资料,但是我感觉都写的不是很清楚。下面我就结合我个人搜集到的资料,再结合个人的理解来认识一下这个参数,但是可能我所的完全是错的,如果说有更多的看法,欢迎指出,我的目的就是为了引出最正确的理解,对这个参数。

首先来看看关于内部flash所涉及的时钟树部分:

image-20210731172345468

在官方手册中有关latency的理解如下:

image-20210731172654218

image-20210731172824261

在配置系统时钟之前,通常需要先调整latency,然后再改变系统时钟,不然可能会出现flash读写问题。

个人想到一个问题是:

如果在改变系统时钟之前,调整了这个latency,那么出现的问题是什么呢?

这个调整了的latency与原先的系统时钟不匹配了,难道不会出现flash读写问题吗?

后面还要执行设置系统时钟的语句,肯定要访问flash,这不就矛盾了吗?

所以说到底怎么回事:

官方文件的意思是为了维持读flash的控制信号,所以需要设置。

控制信号无非就是高低电平,由若干个时钟周期组成,当你系统的时钟改变了。比如频率变高,控制信号按照我的理解应该是 维持一定的电平长度,那么需要的时钟周期数变多。

所以产生控制信号读flash的中,有一个等待完成的电平,也是由若干个时钟周期组成。

那么当频率变高时,就需要增加等待的状态,来维持那个电平信号。

按照这个思路推测,等待时间长一点是没关系的。等待时间短就可能时序产生错误,等待时间长一点,无非就浪费一点时间。

还是能保证时序的正确。

如果以上推测成立,那么得出的结论如下:

1)0<时钟频率=<24M HZ 时,三个等待状态都可以选择。

2)24<时钟频率=<48HZ时,二个状态可以选择,即one wait state或者two wait state

3) 48<时钟频率=<72HZ时,只能是two wait state

4) 如果时钟频率是从大往小了 调,那么就是必须先调整时钟频率,然后再调latency。

一句话总结就是,如果时钟频率较低,可以容忍较大latency,如果时钟频率较高,绝不能容忍较低是latency。

以上就是个人的猜测,可能就是完全是胡说八道,如果知道更好的理解的,十分欢迎指出来。

如何证明这个结论呢?

1)做实验,我暂时没去做,实验的过程想大致就是,配置一个系统时钟,然后设置不同的latency,然后看程序是否能正常运行。

如果能正常运行,那么读flash是没问题的。

2)第二个就是官方的HAL库的配置例程,他的代码时如何写的呢?这也是我想法的来源,当时看这个代码时就思考为什么其这么写。

没有比ST官方自己更了解自己芯片的了。

我们来看一下其代码:(直接跳到最后面看)

HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef  *RCC_ClkInitStruct, uint32_t FLatency)
{
   
  uint32_t tickstart;

  /* Check Null pointer */
  if (RCC_ClkInitStruct == NULL)
  {
   
    return HAL_ERROR;
  }

  /* To correctly read data from FLASH memory, the number of wait states (LATENCY)
  must be correctly programmed according to the frequency of the CPU clock
    (HCLK) of the device.
    为了能正确的阅读数据从FLASH内存,等待状态的数量(延迟)必须被正确编程,根据设备的CPU时钟频率(HCLK)
    */
//如果在工具链中定义了该宏
#if defined(FLASH_ACR_LATENCY)
  /* Increasing the number of wait states because of higher CPU frequency
  如果延迟大于当前寄存器的延迟
  */
  if (FLatency > __HAL_FLASH_GET_LATENCY())
  {
   
    /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR reg
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值