网站建设家乡网页设计模板,优化营商环境条例,wordpress 最近访客 多说,电脑硬盘做网站服务器教程一、PY32F003F18窗口看门狗特点#xff1a;
即使窗口看门狗被禁止#xff0c;窗口看门狗的递减计数器也会继续递减计数。
二、窗口看门狗复位的条件#xff1a; 1、将控制寄存器WWDG_CR中的WDGA1,激活窗口看门狗计数器等于0x3F时,则产…一、PY32F003F18窗口看门狗特点
即使窗口看门狗被禁止窗口看门狗的递减计数器也会继续递减计数。
二、窗口看门狗复位的条件 1、将控制寄存器WWDG_CR中的WDGA1,激活窗口看门狗计数器等于0x3F时,则产生复位 2、装载窗口看门狗的计数器值大于窗口看门狗window寄存器的值,则产生复位。 3、窗口看门狗的提前唤醒中断EWI1且窗口看门狗递减计数器的值达到0x40时则产生EWI中断。 其中断处理程序处理完后则产生复位。 4、装载窗口看门狗计数器值的条件 递减计数器的值小于或等于窗口寄存器的数值并且大于0x3F时才可以向窗口看门狗计数器值写入新值否则会引起复位。
三、窗口看门狗框图 四、窗口看门狗装载计数器值的时间图 五、测试程序
#include WWDG.h
#include stdio.h //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()/*
即使窗口看门狗被禁止窗口看门狗的递减计数器也会继续递减计数;
窗口看门狗复位的条件
1、将控制寄存器WWDG_CR中的WDGA1,激活窗口看门狗计数器等于0x3F时,则产生复位
2、装载窗口看门狗的计数器值大于窗口看门狗window寄存器的值,则产生复位。
3、窗口看门狗的提前唤醒中断EWI1且窗口看门狗递减计数器的值达到0x40时则产生EWI中断。
其中断处理程序处理完后则产生复位。
4、装载窗口看门狗计数器值的条件
递减计数器的值小于或等于窗口寄存器的数值并且大于0x3F时才可以向窗口看门狗计数器值写入新值
否则会引起复位。
*/uint32_t WWDG_Config(void);
void WWDG_Counter_Reload(void);
void SysRstSrcRecord(void);uint32_t WWDG_Config(void)
{WWDG_HandleTypeDef WwdgHandle;uint32_t timeoutvalue 0;uint32_t pclk1 0;uint32_t wdgtb 0;__HAL_RCC_WWDG_CLK_ENABLE(); //使能WWDG时钟WwdgHandle.Instance WWDG; //选择WWDGWwdgHandle.Init.EWIMode WWDG_EWI_DISABLE; //窗口看门狗计数器值到达0x40时不会产生中断WwdgHandle.Init.Prescaler WWDG_PRESCALER_8; //窗口看门狗的预分频器值:选择8分频WwdgHandle.Init.Counter 0x7F; //窗口看门狗计数器值(7位): 0x7FWwdgHandle.Init.Window WWDG_Window_Value; //窗口看门狗窗口值(7位): 0x40~0x7fHAL_WWDG_Init(WwdgHandle);//WWDG初始化
//hwwdg-Init.EWIModeWWDG_EWI_ENABLE使能窗口看门狗计数器值到达0x40时产生中断
//hwwdg-Init.EWIModeWWDG_EWI_DISABLE窗口看门狗计数器值到达0x40时不会产生中断
//hwwdg-Init.Prescaler表示窗口看门狗的预分频器值
//窗口看门狗产生复位的时间: (hwwdg-Init.Counter - hwwdg-Init.Window 1 ) * tPCLK * 4096 * 窗口看门狗的预分频器值timeoutvalue(WwdgHandle.Init.Counter - WwdgHandle.Init.Window) 1;//计算窗口看门狗计数器值和窗口看门狗窗口值的差pclk1 HAL_RCC_GetPCLK1Freq();//获取PCLK的值wdgtb (1 ((WwdgHandle.Init.Prescaler) 7)); //获取分频值,2^WDGTB[1:0]timeoutvalue ((4096 * wdgtb * timeoutvalue) / (pclk1 / 1000));//计算超时时间return(timeoutvalue);//返回窗口看门狗的复位时间,单位为毫秒
}//函数功能:喂狗
void WWDG_Counter_Reload(void)
{WRITE_REG(WWDG-CR,0x7F);//Write to WWDG CR the WWDG Counter value to refresh with 0x7F
}//函数功能:打印CPU复位原因
void SysRstSrcRecord(void)
{uint8_t i;uint8_t Reset_Buffer[11];for(i0;i11;i) Reset_Buffer[i]0;//清除Reset_Buffer[0] __HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY);//读取内部部24MHz时钟源稳定标志Reset_Buffer[1] __HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY);//读取外部4~32MHz时钟源稳定标志
// Reset_Buffer[2] __HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY); //读取PLL时钟稳定标志
// Reset_Buffer[3] __HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY);//读取外部32.768KHz的时钟源稳定标志Reset_Buffer[4] __HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY);//读取内部RC的32KHz时钟源稳定标志Reset_Buffer[5] __HAL_RCC_GET_FLAG(RCC_FLAG_PINRST); //读取外部引脚复位标志Reset_Buffer[6] __HAL_RCC_GET_FLAG(RCC_FLAG_PWRRST); //读取BOR/POR/PDR复位标志Reset_Buffer[7] __HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST); //读取软件复位标志Reset_Buffer[8] __HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST); //读取独立看门狗定时器复位标志Reset_Buffer[9] __HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST); //读取窗口看门狗定时器复位标志Reset_Buffer[10] __HAL_RCC_GET_FLAG(RCC_FLAG_OBLRST); //读取Option byte loader复位标志if( Reset_Buffer[0] ) printf(\r\nHSI OK!);if( Reset_Buffer[1] ) printf(\r\nHSE OK!);
// if( Reset_Buffer[2] ) printf(\r\nPLL OK!);
// if( Reset_Buffer[3] ) printf(\r\nLXTAL OK!);if( Reset_Buffer[4] ) printf(\r\nLSI OK!);if( Reset_Buffer[5] ) printf(\r\nPIN reset!);if( Reset_Buffer[6] ) printf(\r\nPOR reset!);if( Reset_Buffer[7] ) printf(\r\nSWR reset!);if( Reset_Buffer[8] ) printf(\r\nIWDG reset!);if( Reset_Buffer[9] ) printf(\r\nWWDG reset!);if( Reset_Buffer[10] ) printf(\r\nOption byte loader reset!);
} #ifndef __WWDG_H
#define __WWDG_H#include py32f0xx_hal.h#define WWDG_Window_Value 0x50#define _HAL_WWDG_ENABLE(__INSTANCE__) SET_BIT((__INSTANCE__)-CR, WWDG_CR_WDGA)
//将控制寄存器WWDG_CR中的WDGA1,激活窗口看门狗计数器等于0x3F时产生复位#define Get_WWDG_Counter(__INSTANCE__) ( (__INSTANCE__)-CR (~WWDG_CR_WDGA) )
//读窗口计数器的值extern uint32_t WWDG_Config(void);
extern void WWDG_Counter_Reload(void);
extern void SysRstSrcRecord(void);
#endif /* __WWDG_H */
#include py32f0xx_hal.h
#include SystemClock.h
#include delay.h
#include LED.h
#include SystemClock.h
#include USART2.h
#include stdio.h //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include string.h //使能strcpy(),strlen(),memset()
#include WWDG.hconst char CPU_Reset_REG[]\r\nCPU reset!\r\n;int main(void)
{uint32_t delay;HSE_Config();
// HAL_Init();//systick初始化delay_init();
// HAL_Delay(1000);USART2_Init(115200);//PA0是为USART2_TX,PA1是USART2_RX//中断优先级为0x01//波特率为115200,数字为8位,停止位为1位,无奇偶校验,允许发送和接收数据,只允许接收中断,并使能串口printf(%s,CPU_Reset_REG);SysRstSrcRecord();MCU_LED_Init();TIM1_LED_Init();delayWWDG_Config();while (1){MCU_LED_Toggle();
// HAL_Delay(delay5);if( Get_WWDG_Counter(WWDG) WWDG_Window_Value)//喂狗时间到WWDG_Counter_Reload();//喂狗}
}
六、测试结果