硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7340|回复: 8
收起左侧

[有问必答] 添加窗口看门狗后,在函数中添加while(1)测试,无法复位

[复制链接]

5

主题

18

回帖

33

积分

新手上路

积分
33
发表于 2021-2-24 16:30:19 | 显示全部楼层 |阅读模式
各位大佬,我添加了窗口看门狗,设置窗口上限为0x7f,然后测试其复位功能。我在函数中DMA的中断函数中添加while(1),可以触发看门狗复位,但是放在main函数中的while循环里,看门狗就失效了,请问为什么呀?
代码如下:
1)看门狗生效:

void DMA2_Stream0_IRQHandler(void)
{
    //printf("Enter dma inteerupt\r");
   
    if(DMA_GetITStatus(DMA2_Stream0, DMA_IT_TCIF0))
    {
     DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF0);         
    }
    Adc_Dma_Enter = 1 ;
    while(1);

}

2看门狗失效:

在此函数中添加while循环

void AdcDataCalculate(void)
{
      while(1){};
}

main函数:

int main(void)
{   
//    uint8_t i;
      uint16_t wwdg_tr, wwdg_wr;
   
    /*
        ST固件库中的启动文件已经执行了 SystemInit() 函数,该函数在 system_stm32f4xx.c 文件,主要功能是
    配置CPU系统的时钟,内部Flash访问时序,配置FSMC用于外部SRAM
    */
        bsp_Init();        /* 硬件初始化 */
        Tim4_Start();
        Tim2_Start();


        bsp_InitWwdg(0x7f, 0x7F, WWDG_Prescaler_8);
        wwdg_wr = WWDG->CFR & 0X7F;
   
    /* 进入主程序循环体 */
    while (1)
    {

         /*feed the dog*/        
        wwdg_tr = WWDG->CR & 0X7F;
        //printf("WWDG_TR is %d.\r\n",wwdg_tr);
            
        if( wwdg_tr < wwdg_wr )
        {
                WWDG_SetCounter(127);
        }

        if(Adc_Dma_Enter)
        {
             AdcDataCalculate();//   while循环放在此函数里
             Adc_Dma_Enter = 0;
        }

    }
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2021-2-24 17:00:14 | 显示全部楼层
在main里面启动窗口看门狗后,直接后面加个while(1)是否可以触发复位
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-2-24 17:07:03 | 显示全部楼层
eric2013 发表于 2021-2-24 17:00
在main里面启动窗口看门狗后,直接后面加个while(1)是否可以触发复位

无法触发复位
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-2-24 17:11:34 | 显示全部楼层
eric2013 发表于 2021-2-24 17:00
在main里面启动窗口看门狗后,直接后面加个while(1)是否可以触发复位

无法触发呢,请问可能是什么导致的呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2021-2-24 18:35:40 | 显示全部楼层
liwei0225 发表于 2021-2-24 17:11
无法触发呢,请问可能是什么导致的呢?

你是不是开窗口看门狗中断了。
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-2-25 08:36:08 | 显示全部楼层
eric2013 发表于 2021-2-24 18:35
你是不是开窗口看门狗中断了。

这是看门狗的初始化函数,初始化的时候打开的是EW 中断
void bsp_InitWwdg(uint8_t _ucTreg, uint8_t _ucWreg, uint32_t WWDG_Prescaler)
{
        NVIC_InitTypeDef NVIC_InitStructure;
       
        /* 检测系统是否从窗口看门狗复位中恢复 */
        if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) != RESET)
        {        
                /* 清除复位标志 */
                RCC_ClearFlag();
        }
        else
        {
                /* WWDGRST 标志没有设置 */
        }
       
        /* 使能WWDG时钟 */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
       
        /*
           窗口看门狗分频设置:
           比如选择WWDG_Prescaler_8
           (PCLK1 (50MHz)/4096)/8 = 1525.8 Hz (~655 us)  
        */
        WWDG_SetPrescaler(WWDG_Prescaler);
       
        /*
         设置窗口值是_ucWreg,用户必须在小于_ucWreg且大于0x40时刷新计数
         器,要不会造成系统复位。
    */
        WWDG_SetWindowValue(_ucWreg);
       
        /*
         使能WWDG,设置计数器
         比如设置_ucTreg=127 8分频时,那么溢出时间就是= ~780 us * 64 = 49.92 ms
         窗口看门狗的刷新时间段是: ~655 * (127-127) = 0ms < 刷新窗口看门狗 < ~655 * 64 = 41.9ms
        */
        WWDG_Enable(_ucTreg);
       
        /* 清除EWI中断标志 */
        WWDG_ClearFlag();       

        /* 使能EW中断 */
        WWDG_EnableIT();

    /* 设置 WWDG 的NVIC */
        NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);       
       
        //NVIC_EnableIRQ(WWDG_IRQn);
}

WWDG_TypeDef *wdg;
uint8_t temp;

void WWDG_IRQHandler(void)
{
        printf("Enter wwdg IRQ handler");

//        WWDG_ClearFlag();

//        while (WWDG_GetFlagStatus() == SET);

//        WWDG_SetCounter(127);

}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2021-2-25 11:27:00 | 显示全部楼层
liwei0225 发表于 2021-2-25 08:36
这是看门狗的初始化函数,初始化的时候打开的是EW 中断
void bsp_InitWwdg(uint8_t _ucTreg, uint8_t _u ...

你这里开中断了
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE

关闭了就有效果了
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-2-26 10:44:51 | 显示全部楼层
eric2013 发表于 2021-2-25 11:27
你这里开中断了
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE

谢谢,我找到原因了,是因为我还在SysTick_ISR()里面的一个bsp_RunPer1ms()函数中添加了喂狗操作,因此看门狗无法复位。
void SysTick_Handler(void)
{
        SysTick_ISR();
}

请问这种在滴答中断服务程序内喂狗的方式可以在程序跑飞时,让系统复位吗?(目前来看,在非中断处理函数内添加while(1)的方式,无法让系统复位。)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2021-2-27 09:24:12 | 显示全部楼层
liwei0225 发表于 2021-2-26 10:44
谢谢,我找到原因了,是因为我还在SysTick_ISR()里面的一个bsp_RunPer1ms()函数中添加了喂狗操作,因此 ...

不推荐中断里面喂狗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-16 13:52 , Processed in 0.045588 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表