让找料更便捷
电子元器件
采购信息平台
生意随身带
随时随地找货
一站式电子元器件
采购平台
半导体行业观察第一站
标签:
摘要: 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 |