你怎么知道微控制器何时复位?

How do you know when a micro-controller reset?

我正在学习基于 ARM9 处理器 (SAM9G20) 的嵌入式系统。我更熟悉通用的过程编程。因此,我正在做的是浏览 data sheet 并了解有哪些寄存器以及如何操作它们。

我的问题是,我如何知道计算机何时重置?我知道有一个管理重置的重置控制器。称为状态寄存器 (RSTC_SR) 的寄存器存储复位源。我需要定期读取这个寄存器吗?

我的解决方案是将重置次数存储在 FRAM 中(或从将其设置为 0 开始),一旦发生重置,我将此变量与主函数中的寄存器值进行比较。如果寄存器值更高,那么显然它会重置。但是我确信有一种更优化的方法(可能使用中断)。或者这就是通常的做法?

一个简单的解决方案是利用代码的结构。 许多嵌入式代码库采用这种形式:

int main(void)
{
  // setup stuff here
  while (1)
  {
    // handle stuff here
  }
  return 0;
}

你可以利用上面的代码 while(1) 在启动时只 运行 一次。您可以在那里增加一个计数器,并将其保存在非易失性存储中。那会告诉你微控制器重置了多少次。

另一个例子是在 Arduino 上,其中代码的结构是调用一次名为 setup() 的函数,然后连续调用一个名为 loop() 的函数。使用此结构,您可以增加 setup() 函数中的变量以达到相同的效果。

您不需要定期检查,因为每次重置机器时您的程序都会从​​头开始。

只需在启动代码中添加检查,即根据需要在 main() 的早期添加检查。如果您想弄清楚 经常 重置的方式,那么这会更加困难,因为通常(没有使用 SAM 的经验,我是 STM32 类型的人)机载计时器等也会重置。最好是某种真实世界的独立时钟,例如可以轮询并保存其值的 RTC。不过,请考虑您是否真的需要它。

一种方法是 运行 调试模式下的代码(如果您有 SAM 的调试器)。重置后,程序计数器 (PC) 指向代码开始的地址。

每当您的处理器启动时,根据定义,它已退出重置状态。复位状态寄存器的作用是指示复位的来源或原因,例如上电、看门狗定时器、掉电、软件指令、复位引脚等。

这不是知道处理器何时重置的问题 - 这是隐含的,因为您的代码已重新启动。而是了解重置的原因

如果您的应用程序不需要它,您根本不需要监视或读取重置状态,但在某些应用程序中,它可能是一种有用的诊断,例如维护各种重置原因的计数,因为它可能具有指示性系统软件的稳定性、电源或操作员的行为。理想情况下,假设您在启动时足够早地拥有合适的 RTC 源,那么您希望使用时间戳记录原因。重置时间通常是一种有用的诊断方法,而简单地计算它们可能不是。

任何对重置原因的计数都应该在代码启动的早期发生,然后再启用任何中断(因为中断本身可能会导致重置)。在启动代码可能启用中断的情况下,这可能需要您在调用 main() 之前在启动代码中实现计数器 - 例如,对于 stdio 或文件系统支持。