标题:
有关STC单片机芯片的软件复位系统
[打印本页]
作者:
dalaoshi
时间:
2023-9-24 06:18
标题:
有关STC单片机芯片的软件复位系统
为何我的以下代码不起作用?
RESETHERE:
MOV A, #56H
LCALL SENTONEBYTE1
CLR P5.4
LCALL DELAY4
MOV 0C7H, #00100000B ;RESET TO AP
SJMP $
DIGITINPUTEXIT:
RET
执行此命令后并没有重新启动,会在附近重复打转,之前已经送出一个#56H的字节到串口,确定是有执行到这里的。
这问题从STC12开始到现在STC8H了都没有解决,是否之前还要设定什么寄存器呢?
作者:
188610329
时间:
2023-9-24 15:37
软件 复位 只需要
MOV 0C7H, #20H
这一句 就能实现。不存在任何前置条件。
你不如考虑一下, 你复位前的几个操作,是否阻止了复位代码的运行。
假定,P01 是 LED, P00 是按键开关。
CLR P0.1 ; 点亮 LED
Roop1:
DJNZ R2,Roop1
DJNZ R3,Roop1
SETB P0.1 ; 灭LED
JB P0.0,$ ; 等待按键按下
MOV 0C7H,#20H ;请求复位
SJMP $
这种方法应该是最简单测试 复位是否成功的方法吧?
作者:
dalaoshi
时间:
2023-9-24 23:39
很难理解为何会有这样的情况,照我理解软件重置后所有寄存器和记忆体都应该归零,然后从0000开始执行,我的板没有按钮,只有一颗指示灯P5.4,无法用你的方法检测,因此我在代码加上四个重置命令,并关闭中断,如果重置无效会看到LED闪灭,结果证明第一次重置就有效,但没有回到0000开始执行,而在这个副程式不断重复。我这副程式有一个写蓝牙模块的副程式,可以看到不断有字节送往串口。
DIGITINPUT2: ;WRITE ECB
LCALL DELAYLONGLONG
LCALL ECB_BONDNAMELAH ;写蓝牙
LCALL DELAYLONGLONG
RESETHERE:
;MOV A, #56H
;LCALL SENTONEBYTE1
CLR EA
CLR P5.4
LCALL DELAY3
MOV 0C7H, #00100000B ;RESET TO AP
SETB P5.4
LCALL DELAY3
MOV 0C7H, #00100000B ;RESET TO AP
CLR P5.4
LCALL DELAY3
MOV 0C7H, #00100000B ;RESET TO AP
SETB P5.4
LCALL DELAY3
MOV 0C7H, #00100000B ;RESET TO AP
SJMP $
DIGITINPUTEXIT:
RET
作者:
188610329
时间:
2023-9-25 16:31
开机后 啥事都不干,先让 LED 慢闪 3 次, 然后 执行 你的其他代码,
然后, 在 执行 MOV 0C7H, #20H 之前,先点亮 LED, 然后 执行重起 再用 SJMP $ 停住代码。
你就可以通过 LED 有没有常亮 来知道 重启是否有效了。 然后在 各代码 出 分别 追加 快闪 来确定问题出在哪里。
作者:
dalaoshi
时间:
2023-9-25 22:06
这问题终于有了答案,原来是我高估了软件重置的功能,重置后只是将各个功能寄存器恢复DEFAULT值,然后从0000开始执行,并没有将内部RAM全部请零,这就影响程式的路径了,必须在MAIN开始处加上清零代码,这样就和重新开机一样了。
MAIN:
;LCALL OSC
LCALL IOSET8G ;8G初始时IO脚全为高阻,必须设定LED才会亮
CLEANRAM: ;THIS CLEAR INTERNAL RAM FFH TO 00H 这个不可用副程式,因为SP会不见?
MOV A, #0
MOV R0, #0FFH
CLEANRAM1:
MOV @R0, A
DJNZ R0, CLEANRAM1
作者:
188610329
时间:
2023-9-25 22:37
dalaoshi 发表于 2023-9-25 22:06
这问题终于有了答案,原来是我高估了软件重置的功能,重置后只是将各个功能寄存器恢复DEFAULT值,然后从000 ...
那个…… 一般 没必要全IDATA清零吧?
通常只有 用 C51 的,才会需要 全IDATA 甚至 XDATA 上电 清0吧?
玩汇编的,一般都是 用什么 给什么上初值吧? 就好比 R0~R7 以及 A 你都是用之前会 上初值吧? 不会说默认以为他是0 的不是么?
作者:
dalaoshi
时间:
2023-9-28 03:28
本帖最后由 dalaoshi 于 2023-9-28 14:25 编辑
上电是应该所有RAM都是零的,特殊功能寄存器都被系统设定为初始值(不一定是零),然后用户软件开始赋值跑动。
我纳闷为何软件重置系统是看门狗必须使用的关键功能,却没有看过软件开始时必须将RAM清零的论述,否则看门狗软件重置后,可能会在故障原地继续打转,因此我做了一项实验,将
MOV 0C7H, #00100000B ;RESET TO AP 改成:
MOV 0C7H, #01100000B ;RESET TO ISP 重置后从系统ISP开始执行代码
再把开始清零的代码去除。
这样运行软件代码后,也能完全重启,这是因为系统ISP里有代码能清除RAM为零。
所以以后软件重置必须是:
MOV 0C7H, #01100000B ;RESET TO ISP ;60H
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1