SDK版本:simplelink_cc2640r2_sdk_2_30_00_28
工程:aoa_sender_cc2640r2lp_app示例工程
问题:1、看门重装载值设置,设置值和实际值不匹配
2、看门狗不能正常工作
问题描述:
在AoASender_init()初始化中对看门狗进行了初始化操作(代码参照“..examples\rtos\CC2640R2_LAUNCHXL\drivers\watchdog”)编写的,在初始化过程中通过Util_constructClock()函数创建了几个不同周期的软件定时器;
初始化代码如下:
void WDT_init()
{
uint32_t time_count = 0;
Watchdog_Params params;
Watchdog_init();
//创建看门狗
Watchdog_Params_init(¶ms);
// params.callbackFxn = (Watchdog_Callback)watchdogCallback;
params.resetMode = Watchdog_RESET_ON;
params.debugStallMode = Watchdog_DEBUG_STALL_ON;
//打开看门狗
watchdogHandle = Watchdog_open(Board_WATCHDOG0, ¶ms);
if (watchdogHandle == NULL) {
/* Error opening Watchdog */
SystemReset();
}
Watchdog_setReload(watchdogHandle, 65536);
}
1、首先验证看门狗初始化是否成功以及是否正常运行,此时调用Watchdog_clear()函数进行喂狗操作
现象:看门狗正常运行,当超时时可以复位;但是通过Watchdog_setReload()设置的重新装载值与实际超时时间不符合;
1->查找资料获取到,看门狗时钟为48M / 32 = 1.5M,即当设置为 Watchdog_setReload(1500000),则计时为1s;但实际测量时比1s大很多。
2->猜想,是否由于在无任务时,进入了睡眠导致的,进入睡眠后系统时钟应为32.768KHz;当设置为Watchdog_setReload(32768)时,确实看门狗计时为1s,但当设置为Watchdog_setReload(2*32768)时,实际计时值并没有改变还是1s左右。
3->猜想,是否是通过Util_constructClock()创建的软定时与看门狗有冲突导致的;将所有的软定时器创建代码屏蔽掉,发现看门狗不能正常工作。
请问,这是由于什么原因导致的。
2、在计时值不正确的情况下,是可以产生看门狗复位的。
但当加入Watchdog_clear()喂狗函数后,发现看门狗又不能正常工作了(不会产生超时复位)。
其喂狗,是通过一个周期性的软定时器定期产生一个事件,事件产生后进行喂狗操作。
if(events & AOA_FREQ_EVT)
{
Watchdog_clear(watchdogHandle); //喂狗
}