Microchip低档和中档PIC®MCU器件采用一个特殊功能,可以在程序重新启动后确定器件复位的原因.此功能在PCON
和STATUS
寄存器中使用几个标志位,这些位由某些指令和某些事件写入,这些寄存器可由程序代码读取,以确定触发器件复位的原因.
STATUS
寄存器中的两个位PD
和TO
.PD
在上电时置1,在SLEEP被调用时清零,TO
在发生WDT超时并导致器件唤醒清零.PD
和TO
两个位不能由软件直接写入,但可以由硬件事件写入.
由于在代码可以访问STATUS
寄存器之前,STATUS
寄存器的内容可能会丢失.MPLAB®XC8 C编译器提供了一种功能,可以将STATUS
寄存器自动复制到以后可以从C代码访问的位置.此步骤在编译器生成的运行时启动代码的开始发生,因此将在复位发生后立即执行.
要访问STATUS
寄存器的保存内容,您的C代码应声明并引用符号__resetbits
(注意两个前导下划线).您还可以声明和引用符号__powerdown
和__timeout
,它们分别保存PD
和TO
这两个位的副本.如果需要,在程序中声明如下.
extern unsigned char __resetbits;
extern bit __powerdown;
extern bit __timeout;
在访问项目中的上述任何符号时,此状态寄存器保存功能将自动启用.你的代码必须实际读取一个符号,并做一些有用的东西;仅仅声明符号将不会启用此功能.以下是16F1xxx器件的代码示例,该器件使用STATUS
寄存器副本,判断TO
位的副本是否已设置,PD
位的副本是否清零,以及常规PCON
寄存器中的nMCLR
位是否清零.这种情况表示在睡眠期间发生的主清除.
if(__timeout && ! __powerdown && ! PCONbits.nRMCLR) {
// process MCLR reset during sleep
}
查阅器件的数据手册了解更多相关的器件复位条件和用于检测这些条件的标志的完整信息.
如果要确认此功能的操作,请在构建项目后打开startup.as或startup.lst文件,并搜索上述任何符号(在汇编器中将有三个前导下划线字符). 您需要启用-RUNTIME选项的keep子选项,或者在MPLAB X IDE项目属性中检查XC8链接器>运行时>保持生成的startup.as以查看此文件,因为它在每次构建后通常会被删除.
可以通过在-RUNTIME选项中启用resetbits子选项或检查MPLAB X IDE项目属性中的XC8链接器>运行时>备份复位条件标志来手动强制STATUS
寄存器在启动时复制.
参考资料:http://microchip.wikidot.com/xc8:cause-of-reset
版权声明:署名-非商业性使用-禁止演绎 4.0 国际 | Creative Commons BY-NC-ND 4.0