2

我正在 8051 系列的 ATMEL AT89C51 上开发应用程序。

任何人都可以建议如何在编码中确定重置是由于电源循环还是通过软件完成的?

4

3 回答 3

3

根据Atmel 8051 微控制器硬件手册(PDF 链接),当 VCC 从 0 上升到其标称电压时,电源控制寄存器(PCON / 87h)中的断电标志(POF / 位 4)由硬件设置。断电标志复位值只有在上电(冷复位)后才会为 1。热复位(例如软件复位)不会影响该位的值。

我经常发现不同的供应商在 SFR 空间中实现了他们自己的寄存器,可以在这种情况下利用这些寄存器。例如,Silicon Labs 在其复位源寄存器 (RSTSRC) 中使用了上电复位标志 (PORSF)。

于 2013-03-05T22:49:02.013 回答
1

这真的取决于您是否想依赖某些特定的 8051 变体供应商。最好使用供应商提供的寄存器,但是如果您更改了供应商,您的代码将会崩溃,或者更糟糕的是,它会出现异常。

如果您的系统中有外部 RAM(并且它不是电池供电的),那么您可以在内存的保留部分的某处写入一系列字节(如 0xAA、0x55 ...),并检查它是否仍然存在启动后。如果没有,你已经冷启动了。当然,您应该修改汇编程序启动代码以确保它不会初始化这部分内存(或者在每次启动时为零),并且您应该指示链接器从链接中排除该内存,以便它不会得到被其他任何东西使用。

最后,在您的代码中包含条件编译,这样如果您有一些带有特殊寄存器的 8051 变体,就会使用它,如果没有,请尝试 B 计划。

我已经用几个字节的内部 8051 内存 / 我所有的外部 RAM 都是电池供电 / 然后我了解到不是每个 8051 变体在启动时都有一致的策略 - 有些已经初始化了所有的内部存储器,有些只初始化SFR 和其他一些特定区域给我留下了几个字节来使用所描述的程序。

于 2013-03-13T18:17:35.757 回答
0

我不认为有一种方法可以确定重置是如何发生的,因为一旦重置,一切都会从 8051 开始。

我想一种可行的方法是,

假设取一个变量 X,在每个复位软件代码之前,只需设置 X=1(表示软件复位)并将此变量存储在任何 ROM 中,如果您与外部接口。

在每次重置时,在开始时包含一个实例,该实例检查此变量 X 以查看发生了哪个重置并将 X 更改为 0,以便下次检测。

如果您没有外部 ROM,请至少连接一个 D-latch。

我希望这行得通。请告诉我这是否有效。

于 2013-03-05T14:05:53.907 回答