CN / EN
CN / EN

提问

设计支持

您的项目私密技术问题如需获得一对一支持,请点击下方联系我们。

如何记录复位原因 GR551x

已解决

158***832

2023-12-15 01:46

您好:

我们需要记录设备的复位原因,特别是狗复位的遇到了几个问题请教下,

我们使用的是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空间。

0收藏

1赞成

Ping

汇顶员工
2023-12-15 18:57

看门狗有个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");
}


0条评论

1赞成

0收藏

您的评论
最佳答案

zhongchengzhi

汇顶员工
2023-12-15 10:30

您好:

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空间;

2条评论

0赞成

0收藏

您的评论

登录后可回答问题,请 注册

我们时刻倾听您的声音
联系销售

扫描关注公众号

打开微信,使用“扫一扫”即可关注