找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1760|回复: 7
收起左侧

有关STC单片机芯片的软件复位系统

[复制链接]
ID:283954 发表于 2023-9-24 06:18 | 显示全部楼层 |阅读模式
为何我的以下代码不起作用?

RESETHERE:
MOV A, #56H
LCALL SENTONEBYTE1
CLR P5.4
LCALL DELAY4
MOV 0C7H, #00100000B ;RESET TO AP
SJMP $
DIGITINPUTEXIT:
RET


执行此命令后并没有重新启动,会在附近重复打转,之前已经送出一个#56H的字节到串口,确定是有执行到这里的。

这问题从STC12开始到现在STC8H了都没有解决,是否之前还要设定什么寄存器呢?



回复

使用道具 举报

ID:624769 发表于 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  $

这种方法应该是最简单测试 复位是否成功的方法吧?

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:283954 发表于 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




评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:624769 发表于 2023-9-25 16:31 | 显示全部楼层
开机后 啥事都不干,先让 LED  慢闪 3 次, 然后 执行 你的其他代码,  
然后, 在  执行  MOV 0C7H, #20H  之前,先点亮  LED,   然后 执行重起 再用 SJMP $  停住代码。
你就可以通过  LED 有没有常亮 来知道 重启是否有效了。  然后在 各代码 出 分别 追加 快闪 来确定问题出在哪里。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:283954 发表于 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
回复

使用道具 举报

ID:624769 发表于 2023-9-25 22:37 | 显示全部楼层
dalaoshi 发表于 2023-9-25 22:06
这问题终于有了答案,原来是我高估了软件重置的功能,重置后只是将各个功能寄存器恢复DEFAULT值,然后从000 ...

那个…… 一般 没必要全IDATA清零吧?
通常只有 用 C51 的,才会需要 全IDATA 甚至 XDATA 上电 清0吧?
玩汇编的,一般都是 用什么 给什么上初值吧?  就好比  R0~R7  以及 A  你都是用之前会 上初值吧? 不会说默认以为他是0 的不是么?
回复

使用道具 举报

ID:283954 发表于 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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表