158***832
您好:
我们需要记录设备的复位原因,特别是狗复位的遇到了几个问题请教下,
我们使用的是GR5515I0NDA ,SDK版本SDK V1.7.00 (commit d9e44f51)
1、我们使用了aon_wdt,我们重新定义了函数 hal_aon_wdt_alarm_callback 想记录下狗复位,可是最终的结果好像这并没有被执行到
我们的AON_WDT的配置如下:
void wdt_init(void)
{
int wdtTime = 5;
g_aon_wdt_handle.init.counter = wdtTime * 32768 - 1; //AON_WDT use SystemCoreLowClock = 32.768KHz
g_aon_wdt_handle.init.alarm_counter = 0X1F;
if(hal_aon_wdt_init(&g_aon_wdt_handle) == 0)
{
my_printf("aon wdt init ok(time:%d s)",wdtTime);
}
else
{
my_printf("aon wdt init error");
}
}
2、在启动阶段我们调用了 ll_aon_wdt_is_active_flag_reboot()和pwr_mgmt_get_wakeup_flag(),查看服务的可能原因,但是无论是掉电、复位pin教、狗引起的复位pwr_mgmt_get_wakeup_flag得到的值都是冷复位,这款芯片那种情况属于WARM_BOOT。
3、我们的系统有second boot,我们想使用RAM_RESERVE空间存放信息,将boot中获取的信息送给APP固件,(例如使用ll_aon_wdt_is_active_flag_reboot获取到的值,boot版本等),我看代码中只有定义全局的变量属性指定了RAM_RESERVE空间,如果second boot和APP都定义同样的变量能够访问相同的地址空间吗? 或者如果直接使用地址方式使用RAM_RESERVE空间。
Ping

看门狗有个Alarm值,是5bit,相等于hal_aon_wdt_alarm_callback回调后,30*30us = 1ms时间内系统会进行复位,无法提供足够的时间给UART进行信息输出。可以尝试在hal_aon_wdt_alarm_callback函数中进行喂狗后,再调用printf函数打印输出,示例代码如下:
void AON_WDT_IRQHandler(void)
{
hal_aon_wdt_irq_handler(&g_aon_wdt_handle);
}
void hal_aon_wdt_msp_init(aon_wdt_handle_t *p_aon_wdt)
{
/* Enable interrupt */
hal_nvic_clear_pending_irq(AON_WDT_IRQn);
hal_nvic_enable_irq(AON_WDT_IRQn);
}
void hal_aon_wdt_msp_deinit(aon_wdt_handle_t *p_aon_wdt)
{
/* Disable interrupt */
hal_nvic_disable_irq(AON_WDT_IRQn);
}
void hal_aon_wdt_alarm_callback(aon_wdt_handle_t *p_aon_wdt)
{
hal_aon_wdt_refresh(&g_aon_wdt_handle);//先喂狗,确保有足够的时间保存数据
printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n"); //reset 。。。。
}
void aon_wdt_reset(void)
{
g_aon_wdt_handle.init.counter = 2 * 32768 - 1; //AON_WDT use SystemCoreLowClock = 32.768KHz
g_aon_wdt_handle.init.alarm_counter = 32768 - 1;
hal_aon_wdt_init(&g_aon_wdt_handle);
for (uint32_t i = 0; i < 10; i++)
{
sys_delay_ms(300);
hal_aon_wdt_refresh(&g_aon_wdt_handle);
printf("\r\n %dth freed dog.\r\n", i);
}
printf("\r\nSystem will reset.\r\n");
}
zhongchengzhi

您好:
1、hal_aon_wdt_alarm_callback是watchdog将要(0x1F个tick,每个tick 1/32768 s)复位的中断回调,您这边是怎么判断没有被执行的?您这边可以在回调函数里面加上log:
void hal_aon_wdt_alarm_callback(aon_wdt_handle_t *p_aon_wdt)
{
printf("WDT RESET");
}2、
a、ll_aon_wdt_is_active_flag_reboot本意是获取是否是aon watchdog复位,但是在SDK V1.7.0初始化的时候被platform_init里面的ll_pwr_clear_wakeup_event(LL_PWR_WKUP_EVENT_ALL)清除了,,您可以在清除之前做下标记:
/* Clear All Wakeup Event When Cold Boot */
ll_pwr_clear_wakeup_event(LL_PWR_WKUP_EVENT_ALL);
for(uint8_t i = 0; i < MAX_NUMS_IRQn; i++)
{
NVIC_ClearPendingIRQ((IRQn_Type)(i));
}b、pwr_mgmt_get_wakeup_flag是判断是否是唤醒,除了冷启动(上电,watchdog复位等),其余都是唤醒(pwr_mgmt_get_wakeup_flag);
3、second boot和APP都定义同样的变量,不一定能相互访问(毕竟是两个APP,彼此在地址分配的时候是没有任何关系的),这和您里面的变量多少和编译器有关,不一定两边的变量是在同一个地址,建议您这边用地址的方式使用RAM_RESERVE空间;
打开微信,使用“扫一扫”即可关注