单片机wwdg实验

单片机:STM32F407

开发板:DMF407电机开发板

平台:keil V5.31

HSE 为8MHZ

HSI为16MHZ

配置:

复制代码
WWDG_HandleTypeDef wwdg_handler;    /* 窗口看门狗句柄 */

/**
 * @brief       初始化窗口看门狗
 * @param       tr: T[6:0],计数器值
 * @param       tw: W[6:0],窗口值
 * @note        fprer:分频系数(WDGTB),范围:WWDG_PRESCALER_1~WWDG_PRESCALER_8,表示2^WDGTB分频
 *              Fwwdg=PCLK1/(4096*2^fprer). 一般PCLK1=42Mhz
 * @retval      无
 */
void wwdg_init(uint8_t tr, uint8_t wr, uint32_t fprer)
{
    wwdg_handler.Instance = WWDG;
    wwdg_handler.Init.Prescaler = fprer;         /* 设置分频系数 */
    wwdg_handler.Init.Window = wr;               /* 设置窗口值 */
    wwdg_handler.Init.Counter = tr;              /* 设置计数器值 */
    wwdg_handler.Init.EWIMode = WWDG_EWI_ENABLE; /* 使能窗口看门狗提前唤醒中断 */
    HAL_WWDG_Init(&wwdg_handler);                /* 初始化WWDG */
}

/**
 * @brief       WWDG底层驱动,时钟配置,中断配置
                此函数会被HAL_WWDG_Init()调用
 * @param       hwwdg:窗口看门狗句柄
 * @retval      无
 */
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
{
    __HAL_RCC_WWDG_CLK_ENABLE();            /* 使能窗口看门狗时钟 */

    HAL_NVIC_SetPriority(WWDG_IRQn, 2, 3);  /* 抢占优先级2,子优先级为3 */
    HAL_NVIC_EnableIRQ(WWDG_IRQn);          /* 使能窗口看门狗中断 */
}

/**
 * @brief       窗口看门狗中断服务程序
 * @param       无
 * @retval      无
 */
void WWDG_IRQHandler(void)
{
    HAL_WWDG_IRQHandler(&wwdg_handler);     /* 调用WWDG共用中断处理函数 */
}

/**
 * @brief       中断服务函数处理过程
                此函数会被HAL_WWDG_IRQHandler()调用
 * @param       无
 * @retval      无
 */
extern uint32_t irqnum;
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
    HAL_WWDG_Refresh(&wwdg_handler);        /* 更新窗口看门狗值 */
    LED1_TOGGLE();                          /* 绿灯闪烁 */
		irqnum++;
}

主函数:

复制代码
extern WWDG_HandleTypeDef wwdg_handler;    /* 窗口看门狗句柄 */
uint32_t temp=0;
uint32_t random_num=0;
uint32_t PCLK1=0;
uint32_t PCLK2=0;
uint32_t feednum=0;
uint32_t irqnum=0;
int main(void)
{
    HAL_Init();                             /* 初始化HAL库 */
    sys_stm32_clock_init(336, 8, 2, 7);     /* 设置时钟,168Mhz */
    delay_init(168);                        /* 延时初始化 */
    usart_init(115200);                     /* 串口初始化为115200 */
    led_init();                             /* 初始化LED */
    LED0(0);                                /* 点亮LED0(红灯) */   
    delay_ms(300);                          /* 延时100ms再初始化看门狗,LED0的变化"可见" */
		
		PCLK1=HAL_RCC_GetPCLK1Freq();
		PCLK2=HAL_RCC_GetPCLK2Freq();
		printf("\nreset,PCLK1=%d,PCLK2=%d,r=%d\n",PCLK1,PCLK2,random_num);
    wwdg_init(0x7F, 0x5F, WWDG_PRESCALER_8);/* 计数器值为7F,窗口寄存器为5F,分频数为8 */

    while(1)
    {
			printf("temp=%d,irqnum=%d,feednum=%d\n",temp,irqnum,feednum);
			if(temp<34)
			{
				temp++;
			}
			else
			{
        LED0_TOGGLE();                           /* 关闭LED0(红灯) */
				HAL_WWDG_Refresh(&wwdg_handler);        /* 更新窗口看门狗值 */
				temp=0;
				feednum++;
			}
				
			delay_us(1000); 
    }
}

测试结果:

1、当temp<6时,喂狗就复位

2、temp<7,可以喂狗

3、temp<12,可以喂狗

4、temp<13,可以喂狗,喂11次触发复位

5、temp<14,可以喂狗触发复位

6、temp<20,可以喂狗触发复位

7、temp<21,可以喂狗触发EWI中断

8、temp<24,可以喂狗触发EWI中断,1000次后触发复位

9、temp<25,可以喂狗触发EWI中断,100次后触发复位

10、temp<26,可以喂狗触发EWI中断,11次后触发复位

11、temp<27,可以喂狗触发EWI中断,12次后触发复位

12、temp<28,可以喂狗触发EWI中断,1次后触发复位

相关推荐
破晓单片机5 小时前
067、STM32项目分享:语音儿童学习书桌系统
stm32·单片机·嵌入式硬件
欢乐熊嵌入式编程6 小时前
嵌入式 + MQTT:数据上传到阿里云实战(从0到1完整教程)
stm32·单片机·mqtt·freertos·嵌入式架构·efr32
10WTW016 小时前
微机原理 8259A 可编程中断控制器
单片机·嵌入式硬件
破晓单片机8 小时前
068、STM32项目分享:智能小区门禁系统
stm32·单片机·嵌入式硬件
H__Rick9 小时前
C51单片机学习-DAY3
单片机·学习·mongodb
望眼欲穿的程序猿10 小时前
Hello World
嵌入式硬件·rust
bkspiderx11 小时前
Windows DLL核心技术:深入理解__declspec(dllexport)与__declspec(dllimport)
windows·stm32·单片机·dllimport·dllexport·windows dll·__declspec
ACP广源盛1392462567311 小时前
GSV5600@ACP#多接口协议转换芯片,物理 AI 便携终端的互联核心
大数据·人工智能·分布式·嵌入式硬件·spark
望眼欲穿的程序猿11 小时前
ESP32-S3 定时器中断
单片机·嵌入式硬件
电气_空空12 小时前
基于 LabVIEW 的深海气密采水器测控系统
单片机·嵌入式硬件·毕业设计·labview