本帖最后由 冷漠 于 2010-4-11 21:35 编辑
"亮灭运行是正常的" ------- 这说明复位电路没有问题,也不应该有问题,否则就是厂家的 RP 问题了。
讨论:程序可以运行,不一定说明复位电路没有问题。
很简单的道理,看芯片手册,是这样写的:
“如果系统在上电时得不到有效的复位,则程序计数器PC将得不到一个正确的起始初值。因此,CPU可能会从一个未被定义的位置开始执行程序。”
很容易理解,不完全的复位,不能使51系列PC指针初始化为0x0000;但是程序计数器PC仍然会在机器时钟的驱动下计数,CPU从随机地址开始执行程序。
我固化的下面一个闪烁LED测试程序只占了8K程序空间很小的一部分。程序空间大部分固化为空 0xFF,——即汇编指令 MOV R7,A ; 于是不完整的复位使CPU从随机地址,大概率程序空代码0xFF 区域开始运行: MOV R7,A ; MOV R7,A ;MOV R7,A .....一直运行到PC=0xFFF,再回卷到0x0000,结果CPU经过随机地址, 进入正常程序轨道,LED开始闪亮。
这个非正常复位进入正常程序轨道的异常过程,并没有使所有应该初始化的端口、专用功能寄存器SFR 等恢复到复位初始值。ALE也不受影响,该没有还是没有。
测试程序如下:
sbit LED=P1^0;
void main(void)
(
while(1)
{
LED=!LED;
delayms(1000); //延时1秒
}
}
程序虽然看上去正常运行了,它并不是正常复位引导的。芯片并没有正常复位!
可以在空代码地址位置布一个陷阱,例如在0xC00处写下while(1);马上就可以知道以上论证的正确性了。 |