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

Posted

技术标签:

【中文标题】你怎么知道微控制器何时复位?【英文标题】:How do you know when a micro-controller reset? 【发布时间】:2019-02-18 11:46:49 【问题描述】:

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

我的问题是,我怎么知道电脑什么时候重置?我知道有一个管理重置的重置控制器。称为状态寄存器 (RSTC_SR) 的寄存器存储复位源。我是否需要定期阅读此注册表?

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

【问题讨论】:

当您的系统启动代码被调用时,您会知道系统已重置。 我在数据表 (13.4.3) 中读到,可以在某些类型的重置功能中管理 ISR。 你需要研究什么重置是,首先,任何这一切都有意义。复位时,所有硬件、所有寄存器和程序计数器都将恢复以从在复位向量(ARM 的地址 0 处写入的 32 位地址)处编程的功能开始执行。这是重置的定义。 @SirJoBlack : 13.4.3 仅指可配置为中断引脚的复位引脚的 NRST 引脚——如果它被配置为中断,它并不是真正的复位——尽管中断处理程序可能会发出复位。然后,您可以使用它来计数或记录被断言的复位引脚,但还有其他复位源不会被计算在内。所以我不确定这是否有帮助。 SAM9G20 被 Atmel/Microchip 归类为 MPU,而不是 “微控制器”。它有一个 MMU,通常执行它的引导 ROM,然后是引导程序,然后是 U-Boot,然后是重置后的 Linux。 【参考方案1】:

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

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

【讨论】:

可能甚至 之前 main() - 很多代码和可能的中断可能在 main 之前运行,这本身可能会强制重置。理想情况下,在发生任何中断或任何可能导致重置或卡住并强制使用看门狗的代码之前。 @Clifford 我有点假设一个明智的平台不会在启用任何特定中断的情况下退出重置。哪些微机可以做到这一点? 无。那不是我建议的。在 main 执行标准库初始化之前运行的启动代码,包括可能利用中断的 I/O 和时序。【参考方案2】:

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

int main(void)

  // setup stuff here
  while (1)
  
    // handle stuff here
  
  return 0;

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

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

【讨论】:

如果在reset ISR和调用main的指针之间有reset怎么办?如果发生重置,这对他们来说很可能是一个地方。【参考方案3】:

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

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

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

在启用任何中断之前,应在代码启动的早期对复位原因进行计数(因为中断本身可能会导致复位)。这可能需要您在调用 main() 之前在启动代码中实现计数器,以防启动代码可能启用中断 - 例如用于 stdio 或文件系统支持。

【讨论】:

【参考方案4】:

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

【讨论】:

这是对问题标题的一种回答,但问题的主体更详细一些,这不是我认为的答案. 您可能是对的,但对我来说,不清楚目标是记录重置状态还是只是“查看”是否发生重置。其次,我认为我的回答是实现该目标的简单方法。

以上是关于你怎么知道微控制器何时复位?的主要内容,如果未能解决你的问题,请参考以下文章

STM32F103C8T6微控制器 功能怎么样? 这个型号芯片解密成功率高吗?

如何制作自己的微控制器?

在 Mac 上与 AVR 微控制器交互

AVR 微控制器中的 USART 数字逻辑是啥?

基于微控制器的日出/设置算法实现

微控制器的状态机与 RTOS