电子产业
数字化服务平台

扫码下载
手机洽洽

  • 微信小程序

    让找料更便捷

  • 扫码下载手机洽洽

    随时找料

    即刻洽谈

    点击下载PC版
  • 华强电子网公众号

    电子元器件

    采购信息平台

  • 华强电子网移动端

    生意随身带

    随时随地找货

  • 华强商城公众号

    一站式电子元器件

    采购平台

  • 芯八哥公众号

    半导体行业观察第一站

STM32F10xxx窗口看门狗喂狗须知

来源:华强电子网 作者:华仔 浏览:1214

标签:

摘要: STM32F10xxx系列ARM处理器的WWDG一旦启动后(RCC_APB1ENR的bit11为1同时WWDG_CR的WDGA(bit7)为1),要喂狗就必须遵循WWDG_CR的T[6:0]小于等于WWDG_CFR的W[6:0],即计数器的值小于等于窗口

             STM32F10xxx系列ARM处理器的WWDG一旦启动后(RCC_APB1ENR的bit11为1同时WWDG_CR的WDGA(bit7)为1),要喂狗就必须遵循WWDG_CR的T[6:0]小于等于WWDG_CFR的W[6:0],即计数器的值小于等于窗口值,否则喂狗将导致立即复位。下面的例程采用库函数编写。

初始化时钟

bool Target_InitClock (void)
{
    /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
    /* RCC system reset(for debug purpose) */
    RCC_DeInit();
 
    /* Enable HSE */
    RCC_HSEConfig(RCC_HSE_ON);

    /* Wait till HSE is ready */
    HSEStartUpStatus = RCC_WaitForHSEStartUp();

    if (HSEStartUpStatus == SUCCESS)
    {
        /* Enable Prefetch Buffer */
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

        /* Flash 2 wait state */
        FLASH_SetLatency(FLASH_Latency_2);

        /* HCLK = SYSCLK */
        RCC_HCLKConfig(RCC_SYSCLK_Div1);

        /* PCLK2 = HCLK */
        RCC_PCLK2Config(RCC_HCLK_Div1);

        /* PCLK1 = HCLK/2 */
        RCC_PCLK1Config(RCC_HCLK_Div2);

        /* ADCCLK = PCLK2/6 */
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);

        /* PLLCLK = 8MHz * 9 = 72 MHz. */
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);


        /* Enable PLL */
        RCC_PLLCmd(ENABLE);

        /* Wait till PLL is ready */
        while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
        {}

        /* Select PLL as system clock source */
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

        /* Wait till PLL is used as system clock source */
        while (RCC_GetSYSCLKSource() != 0x08)
        {
        }
  
        return TRUE;
    }
 
    return FALSE;
}

1、如果在WWDG中断服务函数里面喂狗。

void WWDG_NVICConfiguration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_InitStructure。NVIC_IRQChannel = WWDG_IRQChannel;
    NVIC_InitStructure。NVIC_IRQChannelPreemptionPriority = 4; //用户自定义优先级
    NVIC_InitStructure。NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure。NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

void WWDG_Configuration(void)
{
    WWDG_DeInit();
 
    /* 窗口看门狗时钟允许 */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);  


    /* 看门狗节拍 = (36M(PCLK1)/4096)/8 = 1098 Hz*/
    WWDG_SetPrescaler(WWDG_Prescaler_8);
  
    /* 窗口值用0x42*/
    // 1098 Hz / (0x7F - 0x42) = 18 Hz: 56MS
    WWDG_SetWindowValue(0x42);
  
    /*看门狗使能并初始化定时器为0x7f*/
    WWDG_Enable(0x7F);
  
    /* Clear EWI flag */
    WWDG_ClearFlag();
   
    /* Enable EW interrupt */
    WWDG_EnableIT();
}

void WWDG_IRQHandler(void)
{
    WWDG_SetCounter(0x7F);
    WWDG_ClearFlag();  /* 清中断标志*/
}

void main (void){
    if (!Target_InitClock())
    {        while (1);    }     /* Deinitializes the NVIC */    NVIC_DeInit();

#ifdef  VECT_TAB_RAM
     /* Set the Vector Table base location at 0x20000000 */
     NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH */
    /* Set the Vector Table base location at 0x08000000 */
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
 
    NVIC_PriorityGroupConfig( NVIC_PriorityGroup_3 );

    /* Configure HCLK clock as SysTick clock source. */
    SysTick_CLKSourceConfig( SysTick_CLKSource_HCLK );
   
    DBGMCU_Config(DBGMCU_WWDG_STOP, ENABLE);


    WWDG_Configuration();
    WWDG_NVICConfiguration();

    while(1)

    {

    }

}

 

2、如果有操作系统(无论是轮询式系统、带任务切换的分时系统还是实时操作系统),建议在主循环的最后或最低优先级的线程里面喂狗,这样可以防止因程序的问题导致系统崩溃。

void WWDG_ResetCounter(void)
{
    INT8U wr, tr;
    tr = WWDG->CR & 0x7F;
    wr = WWDG->CFR & 0x7F;
    if (tr <= wr)
    {
        //只有当计数器的值,小于窗口寄存器的值才能写CR!!
        WWDG->CR |= 0x7F;
    }
}

void WWDG_Configuration(void)
{
    WWDG_DeInit();
 
    /* 窗口看门狗时钟允许 */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);  


    /* 看门狗节拍 = (36M(PCLK1)/4096)/8 = 1098 Hz*/
    WWDG_SetPrescaler(WWDG_Prescaler_8);
  
    /* 窗口值用0x7F*/
    WWDG_SetWindowValue(0x7F); //用最大值可以保证计数器值永远小于等于窗口值,只要计数器值大于等于0x40,喂狗就不会立即引起复位。
  
    /*看门狗使能并初始化定时器为0x7f*/
    WWDG_Enable(0x7F);
  
    /* Clear EWI flag */
    WWDG_ClearFlag();
   
    /* Enable EW interrupt */
    //WWDG_EnableIT(); //不需要中断
 }

void main (void)
{
    if (!Target_InitClock())

    {
        while (1);
    }
 
    /* Deinitializes the NVIC */
   NVIC_DeInit();

#ifdef  VECT_TAB_RAM
    /* Set the Vector Table base location at 0x20000000 */
    NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH */
    /* Set the Vector Table base location at 0x08000000 */
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
 
    NVIC_PriorityGroupConfig( NVIC_PriorityGroup_3 );

    /* Configure HCLK clock as SysTick clock source. */
    SysTick_CLKSourceConfig( SysTick_CLKSource_HCLK );
   
    DBGMCU_Config(DBGMCU_WWDG_STOP, ENABLE);


    WWDG_Configuration();


    while(1)

    {

        // 其他任务......

        WWDG_ResetCounter();

    }

}



技术资讯 技术方案 技术应用 技术新品 技术前沿 行业资讯 行业方案 行业应用 行业新品 行业前沿
型号 厂商 价格
EPCOS 爱普科斯 /
STM32F103RCT6 ST ¥461.23
STM32F103C8T6 ST ¥84
STM32F103VET6 ST ¥426.57
STM32F103RET6 ST ¥780.82
STM8S003F3P6 ST ¥10.62
STM32F103VCT6 ST ¥275.84
STM32F103CBT6 ST ¥130.66
STM32F030C8T6 ST ¥18.11
N76E003AT20 NUVOTON ¥9.67