单片机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次后触发复位

相关推荐
芯岭技术郦35 分钟前
批量不到1元,芯岭技术集成 2.4G 射频32 位 MCU 与 USB2.0的超低功耗 SoC XL2417U
单片机·嵌入式硬件·射频工程
少年、潜行3 小时前
【开源】基于STM32的无线姿态检测仪设计
stm32·嵌入式硬件·开源·姿态检测仪
三品吉他手会点灯5 小时前
STM32F103 学习笔记-22-DMA(第1节)-DMA功能框图讲解和DMA初始化结构体讲解
笔记·stm32·单片机·嵌入式硬件·学习
陌上花开缓缓归以7 小时前
定时器和延时函数选型
单片机
华普微HOPERF7 小时前
电视冰箱洗衣机、空调风扇热水器,Matter协议如何塑造全屋智能?
嵌入式硬件·物联网·智能家居·matter协议·全屋智能
ThornArmor8 小时前
【控制篇】斩断无休止空转:4-bit 指令集里的跳转律令与时序状态机
c语言·汇编·c++·单片机·嵌入式硬件
篮子里的玫瑰8 小时前
STM32/MCU【IAP在线升级】全流程深度解析与实战指南
stm32·单片机·嵌入式硬件
深圳市青牛科技实业有限公司8 小时前
D3815C30V/0.8A高调光比 LED恒流驱动器介绍
单片机·嵌入式硬件·人机交互·摄像机
Plankton_Li9 小时前
嵌入式国密加密:STM32L4 + MIRACL 库实现 SM2 加解密
stm32·单片机·嵌入式软件
高速上的乌龟9 小时前
Lattice LFCPNX-100 HSB+Fpga开发详解:2.2 Marvell MV-Q3244 Phy的Podl电路详解
单片机·嵌入式硬件·fpga开发·软件工程