许多微控制器数据表和参考手册都包含如下说明(从ST参考手册中引用):
如果参考手册指定了某些情况,在该情况下该值可能不会立即生效,或者除非重复写入,否则根本不会生效,那么代码可以允许这种可能性。如果没有这样的规范,勤奋的程序员应该如何处理步骤2?可能性包括:
设置FLASH_ACR,对其进行检查,如果该值不符合预期,则发出致命错误。
设置一次FLASH_ACR,然后在do-while循环中对其进行检查,如果从未出现正确的值,则永久循环。
设置FLASH_ACR一次,然后在do-while循环中对其进行检查,但是如果没有出现正确的值,则在经过多次迭代后会发出致命错误。
在do-while循环中设置并检查FLASH_ACR,如果从未正确设置该值,则永久循环。
在do-while循环中设置并检查FLASH_ACR,但在经过多次迭代后发出致命错误。
强制读取硬件寄存器,以防引入必要的延迟,并在设置调试器断点的情况下使该值可见,否则忽略结果。
除了开发过程外,请忽略第2步。
常见的是某些操作会产生延迟效果,并且系统要求该代码在启动其他操作之前先等待某些操作完成。但是,尚不清楚在什么情况下FLASH_ACR可能无法正确设置,而没有严重的芯片损坏,从而使任何尝试执行的程序都变得毫无意义。我的猜测是,检查主要是作为故障排除过程的一部分,以防万一事情无法按预期进行,而在生产代码中则不是必需的。其他人如何处理此类检查?
答案 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。