关于 STC8H3K64S2 看门狗
关于 STC8H3K64S2 看门狗的应用看到有硬件(ISP)与软件启动方式2种.
我的疑问是:
如果由硬件(ISP)配置,启动看门狗,同时设置分频系数,
在程序里,软件是不能再关闭的,那分频系数这个软件还能修改吗? 本帖最后由 LFB 于 2023-3-16 20:05 编辑
#define MAIN_Fosc 22118400L //定义主时钟(精确计算9600波特率)
#define D_WDT_FLAG (1<<7)
#define D_EN_WDT (1<<5)
#define D_CLR_WDT (1<<4)// auto clear
#define D_IDLE_WDT (1<<3)// WDT counter when Idle
#define D_WDT_SCALE_2 0
#define D_WDT_SCALE_4 1
#define D_WDT_SCALE_8 2 // T=393216*N/fo
#define D_WDT_SCALE_16 3
#define D_WDT_SCALE_32 4
#define D_WDT_SCALE_64 5
#define D_WDT_SCALE_128 6
#define D_WDT_SCALE_256 7
#define WDT_PS_Set(n) do{ WDT_CONTR = (WDT_CONTR & ~0x07) | (n & 0x07); } while(0) // 看门狗定时器时钟分频系数设置
#define WDT_reset(n) do{ WDT_CONTR = D_EN_WDT + D_CLR_WDT + D_IDLE_WDT + (n); } while(0) // 初始化WDT,喂狗
#define CLRWDT() do{ WDT_CONTR |= D_CLR_WDT; } while(0)
CLRWDT() do{ WDT_CONTR |= D_CLR_WDT; } while(0) // 清看门狗
通过ISP启用WDT,64分频(20M主频时,约1.26秒,我这个应该差不多),程序中通过 CLRWDT() 清看门够,发现不起作用(会复位).但同一个程序通过ISP关闭WDT方式重新烧录是正常.
这种清看门狗方式不对?
-----------------------------编辑增加说明-----------------------------
程序中有EEPROM操作(FLASH模拟)
-----------------------------再编辑增加说明-----------------------------
上面的清WDT方式(WDT_CONTR |= D_CLR_WDT;)没问题,关于同一个程序通过ISP关闭WDT方式重新烧录是正常,是乌龙,程序修改有错,没注意看,直接在STC-ISP软件点下载.
但关于ISP配置WDT分频,软件能不能修改这个暂时未测试.
启动看门狗后:
1,看门狗就不能被关闭,除非停电===这才是尽职的狗
2,喂狗时间可以被反复修改====灵活性 神农鼎 发表于 2023-3-16 19:46
启动看门狗后:
1,看门狗就不能被关闭,除非停电===这才是尽职的狗
2,喂狗时间可以被反复修改====灵活性 ...
感谢,已经确认是软件问题. 本帖最后由 LFB 于 2023-3-16 20:15 编辑
有个奇怪的问题还没想到哪不对
void F_ShowAll(void)
{
volatile u16 u16Xms = 500;
App_AllDisplayData(0xff);
App_TM1640Display();
//F_DelayXms(250);
//F_DelayXms(250);
fTick1ms = 0;
while(u16Xms)
{
if(1 == fTick1ms)
{
fTick1ms = 0;
CLRWDT();
u16Xms--;
}
}
App_AllDisplayData(0x00);
App_TM1640Display();
}
这段程序就会死机(WDT复位),效果就是一直全显示.fTick1ms在定时中断置位.
; FUNCTION F_ShowAll (BEGIN)
; SOURCE LINE # 398
; SOURCE LINE # 399
; SOURCE LINE # 400
0000 750001 R MOV u16Xms,#01H
0003 7500F4 R MOV u16Xms+01H,#0F4H
; SOURCE LINE # 401
0006 7FFF MOV R7,#0FFH
0008 120000 E LCALL _App_AllDisplayData
; SOURCE LINE # 402
000B 120000 E LCALL App_TM1640Display
; SOURCE LINE # 407
000E C200 E CLR fTick1ms
0010 ?C0098:
; SOURCE LINE # 408
0010 E500 R MOV A,u16Xms+01H
0012 4500 R ORL A,u16Xms
0014 6012 JZ ?C0099
; SOURCE LINE # 409
C51 COMPILER V9.60.0.0 APP_UI 03/16/2023 20:08:07 PAGE 25
; SOURCE LINE # 410
0016 3000F7 E JNB fTick1ms,?C0098
; SOURCE LINE # 411
; SOURCE LINE # 412
0019 C200 E CLR fTick1ms
; SOURCE LINE # 414
001B 120000 E LCALL CLRWDT
; SOURCE LINE # 415
001E E500 R MOV A,u16Xms+01H
0020 1500 R DEC u16Xms+01H
0022 70EC JNZ ?C0098
0024 1500 R DEC u16Xms
0026 ?C0104:
; SOURCE LINE # 416
; SOURCE LINE # 417
0026 80E8 SJMP ?C0098
0028 ?C0099:
; SOURCE LINE # 419
0028 E4 CLR A
0029 FF MOV R7,A
002A 120000 E LCALL _App_AllDisplayData
; SOURCE LINE # 420
002D 020000 E LJMP App_TM1640Display
; FUNCTION F_ShowAll (END)
这是反汇编
void F_DelayXms(u8 u8Xms)
{
fTick1ms = 0;
while(u8Xms)
{
if(1 == fTick1ms)
{
fTick1ms = 0;
CLRWDT();
u8Xms--;
}
}
}
但通过调用上面函数的方式[调用2次F_DelayXms(250)]就没问题.
我一般建议再程序里启动看门狗,只在主循环喂狗一次。
硬件启动也可以,程序运行后,在看门狗溢出之前一定要喂狗。碰到个别客户,用硬件启动看门都,但初始化时间太长,没有及时喂狗,导致不断复位。
特别提醒:不要在中断中喂狗。研发程序时先不要启动看门狗,研发完成最后再启动。 梁工 发表于 2023-3-16 23:26
我一般建议再程序里启动看门狗,只在主循环喂狗一次。
硬件启动也可以,程序运行后,在看门狗溢出之前一定 ...
没在中断喂狗,肯定不会在中断这样操作的.
因为就是上电全显示,所以简单处理,直接延时个0.5秒(延时过程中清WDT),
页:
[1]