单片机/MCU论坛
直播中

万物死

8年用户 1286经验值
擅长:MEMS/传感技术
私信 关注
[问答]

采用ADUCM361内置看门狗进入中断服务函数后MCU就死了的原因?怎么解决?

问题描述:采用ADUCM361内置看门狗进入中断服务函数后就MCU就死了。采用内置看门狗产生中断复位CPU是正常的!
下面为中断服务函数:
void WDog_Tmr_Int_Handler(void)
{
   WdtClrInt(); // clear watchdog timer interrupt
   __DSB();
   printf("WDog-------------------------------INT!rn");
   [size=13.3333px]delay(500000);
   //__DSB();
}
void Sys_Init(void)
{
    NVIC_EnableIRQ(WDT_IRQn);
    WdtCfg(T3CON_PRE_DIV16,T3CON_IRQ_EN,T3CON_PD_DIS);
    WdtLd(0x1000);
   WdtGo(T3CON_ENABLE_DIS);
ClkDis(CLKDIS_DISSPI0CLK|CLKDIS_DISSPI1CLK|CLKDIS_DISI2CCLK|CLKDIS_DISPWMCLK|CLKDIS_DIST0CLK|CLKDIS_DIST1CLK|CLKDIS_DISDMACLK); // Only enable clock to used blocks   
   ClkCfg(CLK_CD0,CLK_HF,CLKSYSDIV_DIV2EN_DIS,CLK_UCLKCG);
   //ClkCfg(CLK_CD0,CLK_HF,CLKSYSDIV_DIV2EN,CLK_UCLKCG);
    ClkSel(CLK_CD7,CLK_CD7,CLK_CD0,CLK_CD7);   
}
下面为主函数:
int main (void)   
{  
   int i=1;
   Sys_Init();
   uart_init(9600);
   NVIC_EnableIRQ(UART_IRQn);
   printf("Star-------------------------!rn");
   delay(500000);
   while(1){
   //WdtClrInt();
   printf("/*ADUCM360*/----%drn",i);
   delay(500000);
   printf("CPUID=%xrn",SCB->CPUID);
   delay(500000);
   printf("T3VAL=%xrn",pADI_WDT->T3VAL);
   printf("T3STA=%xrn",pADI_WDT->T3STA);
   delay(500000);
   i++;
    }
}
下面为延时函数:
void delay (long int length)
{
    while (length >0)
       length--;
}
下图为调试信息:打印了W说明已经进入了中断服务函数,后面的调试信息没打印,且MCU已死,不知是否有人碰到此问题?


                                                                                                                        

回帖(2)

陈枫希

2024-1-12 14:29:32
中断嵌套了
举报

李军

2024-1-12 14:53:35
在使用ADUCM361内置看门狗的中断服务函数时,MCU死机的原因可能是由于中断服务函数中的某些操作导致了问题。下面是一些可能的原因和解决方法:

1. 硬件相关错误:检查看门狗的配置是否正确,确保看门狗在中断服务函数之前已正确配置。还应确保中断向量表中的中断服务函数地址正确。

2. 堆栈问题:中断服务函数可能导致堆栈溢出或堆栈损坏。在中断服务函数中避免使用过多的局部变量和递归函数调用,以减少堆栈使用量。

3. 中断优先级问题:确保看门狗中断的优先级高于其他中断,以确保中断服务函数可以正常执行。可以使用NVIC_SetPriority函数来设置中断优先级。

4. 芯片特定问题:可能存在某些特殊情况下芯片的硬件限制或错误。在这种情况下,建议参考芯片的数据手册或联系芯片厂商获取支持。

要解决这个问题,可以尝试以下几个步骤:

1. 确定问题所在:通过检查中断服务函数的代码和硬件配置,确定问题出在哪里。

2. 调试:使用调试工具(如JTAG)对MCU进行调试,查看程序的执行状态和堆栈。

3. 确定问题代码:通过在中断服务函数中插入调试语句或使用断点,确定哪些代码导致了MCU死机。

4. 修复问题:根据问题的具体原因,针对性地修改中断服务函数的代码或硬件配置,以解决MCU死机问题。

5. 测试和验证:在修改后的代码上进行测试,并确保MCU在进入看门狗中断服务函数时不会死机。

请注意,在进行任何修改之前,请确保已经备份了原始代码和配置,并在进行修改时小心操作,防止引入其他问题。 此外,一些特定的芯片配置可能需要特殊的工作流程,请查阅相关文档并按照指导操作。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分