gpt4 book ai didi

embedded - 当微 Controller 的手册上写着 "check that XX happens"时,如果不是,应该怎么办?

转载 作者:行者123 更新时间:2023-12-02 00:52:13 25 4
gpt4 key购买 nike

许多微 Controller 数据表和引用手册包含如下说明[引自 ST 引用手册]:

  1. 将新的等待状态数编程到 FLASH_ACR 中的 LATENCY 位注册
  2. 通过读取 FLASH_ACR 寄存器检查是否考虑了新的等待状态数以访问闪存
  3. 通过写入 RCC_CFGR 寄存器中的 SW 位来修改 CPU 时钟源...

如果引用手册指定了某些情况下该值可能不会立即生效,或者可能根本不会生效,除非重复写入,然后代码可以考虑这种可能性。没有任何这样的规范,一个勤奋的程序员应该如何处理第 2 步?可能性包括:

  1. 设置 FLASH_ACR,检查它,如果值不符合预期,则发出 fatal error 信号。

  2. 设置 FLASH_ACR 一次,然后在 do-while 循环中检查它,如果正确值从未出现,则永远循环。

  3. 设置 FLASH_ACR 一次,然后在 do-while 循环中检查它,但如果没有出现正确的值,则在一定次数的迭代后发出 fatal error 信号。

  4. 在 do-while 循环中设置和检查 FLASH_ACR,如果值从未正确设置,则永远循环。

  5. 在 do-while 循环中设置并检查 FLASH_ACR,但在一定次数的迭代后发出 fatal error 信号。

  6. 强制读取硬件寄存器以防引入必要的延迟,并在设置调试器断点时使值可见,否则忽略结果。

  7. 除了开发期间,忽略第 2 步。

某些操作具有延迟效果是很常见的,并且系统要求代码等待某些操作完成后再启动其他操作。然而,尚不清楚在什么情况下 FLASH_ACR 可能无法正确设置,芯片损坏严重到足以使任何尝试的程序执行变得毫无意义。我的猜测是,这些检查主要是作为故障排除过程的一部分,以防万一事情没有按预期工作,但不是生产代码的必要部分。其他人如何处理此类支票?

最佳答案

ST 自己的启动代码不执行此类操作。例如,从 system_stm32f4xx.c 版本 1.6.9 开始:

    /* Wait till the main PLL is ready */
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}

#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx)
/* Configure Flash prefetch, Instruction cache, Data cache and wait state */
FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
#endif /* STM32F40_41xxx || STM32F42_43xxx */

#if defined (STM32F401xx)
/* Configure Flash prefetch, Instruction cache, Data cache and wait state */
FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_2WS;
#endif /* STM32F401xx */

/* Select the main PLL as system clock source */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= RCC_CFGR_SW_PLL;

/* Wait till the main PLL is used as system clock source */
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
{
}

在切换之前不要将时序设置为与 PLL 时钟速度不兼容的值,这一点很重要,但如果对寄存器编程失败,那么再多的软件也无济于事。

关于embedded - 当微 Controller 的手册上写着 "check that XX happens"时,如果不是,应该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56706697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com