eeant blog
  • Home
  • Categories
  • Tags
  • Archives

查找PIC单片机复位的原因


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以查看此文件,因为它在每次构建后通常会被删除.

keep_startup_option


可以通过在-RUNTIME选项中启用resetbits子选项或检查MPLAB X IDE项目属性中的XC8链接器>运行时>备份复位条件标志来手动强制STATUS寄存器在启动时复制.

backup_reset_condition_flags_option


参考资料:http://microchip.wikidot.com/xc8:cause-of-reset


版权声明:署名-非商业性使用-禁止演绎 4.0 国际 | Creative Commons BY-NC-ND 4.0


  • « 选择合适的整数数据类型
  • python3内建函数id »

Published

Nov 20, 2016

Category

microchip

Tags

  • 复位 1
  • pic 5
  • Powered by Pelican. Theme: Elegant by Talha Mansoor