如何使用keil中的看门狗检查我的代码的正确操作。
我可以将一切一致到NMI处理程序,但是当它到达例程结束时,它执行软件重置
SetWord16(SYS_CTRL_REG, (GetWord16(SYS_CTRL_REG) & ~REMAP_ADR0) | SW_RESET);
然后报告说无法启动核心。我假设软件重置已经发生,但我没有办法获得控制回来,而不断开开发板。
如果我尝试在调试器之外运行程序(通过在它到达这一点之前停止调试器),它仍然不能正确重置。
那么如何使用启用WDOG运行我的程序来重置设备并在不刻录OTP的情况下检查其工作确定。是否可以?
我用beacon3。40.6作为基础。
它直接使用WDOG强制设备重置吗?
设备:
当看门狗触发时,它最终到达NMI处理程序例程中的以下行(Beacon3.40.6)
SetWord16(SYS_CTRL_REG, (GetWord16(SYS_CTRL_REG) & ~REMAP_ADR0) | SW_RESET);
这是重置系统的指令。执行此代码后,不会发生任何事情。
~REMAP_ADR0到底是什么意思?在数据表中有4个可能的值-默认值是00 (ROM),这意味着它将从ROM中的位置0开始执行。
我有限的理解告诉我应该从系统RAM中重新启动,因为我的程序驻留在这里(假设我没有失去电源或进入深度睡眠模式)。
有人能确认我需要改变REMAP_ADR0从它的默认设置,我什么时候不需要这样做?
SetWord16(SYS_CTRL_REG, (GetWord16(SYS_CTRL_REG) & ~REMAP_ADR0) | SW_RESET);
因此,这一行的目的是有效地使与REMAP_ADR0对应的位为零,即强制使用默认值。
如果我把线路换成
setword16(sys_ctrl_reg,(getword16(sys_ctrl_reg))| sw_reset);
并在此调用之前使REMAP_ADR0 =0x02 (SysRAM),然后看门狗定时器过期导致“正确的”复位,代码重新开始运行。
我还可以设置断点的工作,所以一切似乎都很好!
我还是不确定当我和看门狗去OTP时会发生什么。默认设置是否适合该场景?
嗨DrNick1,
是的,正确的REMAP_ADR0是为了确保REMAP_ADR0被设置为默认地址。默认设置应该强制引导加载程序运行,并最终从OTP读取数据。
由于MT_dialog
你好。
我尝试使用sdk_driver看门狗API来初始化看门狗。
1.我已经启用了看门狗
/ / # undef CFG_WDOG
2.我试过了
wdg_init (1)
和wdg_init (0)
我的软件似乎没有重新启动,即使我没有重置看门狗:
1.它不会再点亮LED(我有一个LED闪烁启动)
2.我的Keil IDE调试会话没有命中NMI_HandlerC
添加代码来测试看门狗计数器,并将其卡在0x00FF上
嗨kobyfr_mag,
您是否模拟了最终会使软件崩溃并触发看门狗(例如,意味着陷入无尽的循环中)的情况?你在睡眠模式时使用看门狗,看门狗重置每次你从睡眠中醒来。你不需要显式地启用它,只需定义它,SDK会负责初始化。除此之外,当处于睡眠模式时,看门狗会在每次唤醒时重新加载main_func()函数底部的arch_main.c文件,你可以注释掉下面的代码片段并测试它:
如果(USE_WDOG)
wdg_reload(watchdog_default_period);
由于MT_dialog
1.是的,我想引起一个watchdog to fire, in order to test it is operational. I had no idea if I did all that is required in order to activate it.
2.我注释掉了arch_main.c
wdg_reload (WATCHDOG_DEFAULT_PERIOD)
3.我的init序列是3个快速LED闪烁。(总持续时间600 mSec)
4.我无尽的循环是慢的LED闪光(应该导致看门狗在〜2秒后燃烧)
5.我从uVision加载我的程序到RAM,通过JLink调试器。
我允许它自由运行
7.我观察了快速LED闪烁序列一次,然后慢速LED闪烁序列不间断。==> no SW reset ==> no watchdog occurred
我还需要做什么才能让看门狗开火,复位吗?
嗨kobyfr_mag,
我刚刚注意到第5篇文章,你把看门狗的定义注释掉了吗?尝试#define CFG_WDG不要注释出来,如果你注释出来SDK将不会启用它。
请尝试禁用睡眠模式,并留下wdg_reload(WATCHDOG_DEFAULT_PERIOD)注释,在一个新的模板中使用keil环境运行它。如果您这样做,您的代码将转到NMI_Handler()。
由于MT_dialog
谢谢你!
添加
#define cgf_wdog.
起了作用。由于
而(1)
我插入了,我点击了nmi_handler,看门狗每2.5秒保持射击。嗨chen123,
谢谢你的评论。这个论坛的帖子很旧,也很封闭,所以你能再发一个新的吗?
谢谢,PM_Dialog