回复
Highlighted
Administrator
发帖数: 669
注册日期: ‎09-05-2012

使用 RSTSRC

问题

 

如何使用 RSTSRC 寄存器并设计我的固件来对不同的复位事件做出响应?

 

 

答案

 

RSTSRC 寄存器向固件通知最后一次设备复位的原因。此信息可用于提升系统的稳定性,甚至启用系统中的新功能。

 

在读取 RSTSRC 寄存器的任何位之前,固件应当检查上电复位位。如果此位置位,寄存器中的其他位则为不确定的值。

 

导致闪存错误复位的因素可能有多种:

- 闪存写入/擦除例程可能尝试访问不在用户空间内的闪存区域或受 MCU 锁定字节保护的区域。

- 对固件中不存在的函数进行调用,这可能会导致程序计数器跳转至项目范围之外的闪存区域。然后,失控的程序计数器可能超出用户代码空间范围并导致复位。

 

外部振荡器出现故障或配置不正确时,会导致丢失时钟检测器事件。此外,当运行频率低于丢失时钟检测器电路能够测量的最低频率时,外部时钟源也可能导致此事件。如果固件在 C 模式或 RC 模式下使用外部振荡器,决定产生丢失时钟检测器复位的 catch 语句会设置一个向外部时钟初始化例程发送信号的变量,告诉此例程应该增加电路的驱动强度以增加生成的外部时钟频率。

 

硬复位事件意味着 RST 引脚被触发为低电平。这可能是由最终产品的用户导致,或由故意复位 MCU 的系统中另一设备导致。固件可能将此类复位视为某种形式的用户输入并提供相应的操作响应。

 

软复位事件意味着代码形式的固件置位了 RSTSRC 中强制硬件复位的位。固件可以使用此操作将自身置于特殊的操作状态。例如,系统可以将此类事件用作信号以将设备置于操作的引导装载状态。

 

将最近复位事件的日志保存于非易失性存储器中以供日后分析和调试会非常有用。日志子系统应该分配闪存的整个页面并尽可能简洁地保存有关复位事件的信息。应该使用 Silicon Labs 定义的所有最佳做法执行闪存的写入和擦除操作。


Nari | Community Manager | Silicon Labs