当微控制器的手册说“检查XX是否发生”时,如果没有,应该怎么办?

时间:2019-06-21 15:47:28

标签: embedded

许多微控制器数据表和参考手册都包含如下说明(从ST参考手册中引用):

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

如果参考手册指定了某些情况,在该情况下该值可能不会立即生效,或者除非重复写入,否则根本不会生效,那么代码可以允许这种可能性。如果没有这样的规范,勤奋的程序员应该如何处理步骤2?可能性包括:

  1. 设置FLASH_ACR,对其进行检查,如果该值不符合预期,则发出致命错误。

  2. 设置一次FLASH_ACR,然后在do-while循环中对其进行检查,如果从未出现正确的值,则永久循环。

  3. 设置FLASH_ACR一次,然后在do-while循环中对其进行检查,但是如果没有出现正确的值,则在经过多次迭代后会发出致命错误。

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

  5. 在do-while循环中设置并检查FLASH_ACR,但在经过多次迭代后发出致命错误。

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

  7. 除了开发过程外,请忽略第2步。

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

2 个答案:

答案 0 :(得分:2)

ST自己的启动代码不执行任何操作。例如,从elapsedTime=((double) (t2.tv_sec - t1.tv_sec))+((double) (t2.tv_usec - t1.tv_usec) / 1000000.0); 版本1.6.9开始:

system_stm32f4xx.c

重要的是,在切换之前,不要将时序设置为与PLL时钟速度不兼容的值,但是如果对寄存器进行编程失败,那么将不需要任何软件解决方案。

答案 1 :(得分:0)

这取决于所需的错误处理程度。如果您希望记录或显示Flash ACR寄存器失败,则可以等待一段时间,然后再返回到安全错误处理程序模式。

对于大多数系统来说,只需在早期就启用看门狗,然后通过忙等待while循环等待寄存器设置就足够了。

特别是在等待状态和时钟的情况下,如果发生错误,您可能/想做的事不多,因为那里的错误意味着程序运行所在的环境已死。充其量,MCU将恢复为默认的内部RC振荡器,以使您的错误处理程序““回”。对于某些应用程序,您甚至根本不需要这样做,而只需复位MCU。