写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做!
本文写于:2025.04.23
STM32开发板学习——第47节: [14-2] 独立看门狗&窗口看门狗
- 前言
- 开发板说明
- 引用
- 解答和科普
- 一、独立看门狗
- 二、窗口看门狗
- 问题
- 总结
前言
本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始32单片机的学习之路。
欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习32单片机了,就跟着B站上的江协科技开始学习了.
在这里会记录下江协科技32单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!
另外为了增强我的学习效果:每次笔记把我不知道或者问题在后面提出来,再下一篇开头作为解答!
开发板说明
本人采用的是慧净的开发板,因为这个板子是我N年前就买的板子,索性就拿来用了。另外我也购买了江科大的学习套间。
原理图如下
1、开发板原理图
2、STM32F103C6和51对比
3、STM32F103C6核心板
视频中的都用这个开发板来实现,如果有资源就利用起来。另外也计划实现江协科技的套件。
下图是实物图
引用
【STM32入门教程-2023版 细致讲解 中文字幕】
还参考了下图中的书籍:
STM32库开发实战指南:基于STM32F103(第2版)
数据手册
解答和科普
一、独立看门狗
PB1按键
第一步,开启时钟 只有这个LSI时钟开启了,独立看门狗才能运行,所以初始化独立看门狗之前,LSI必须得开启,强制打开
如果独立看门狗已经由硬件选项或软件启动,LSI振荡器将被强制在打开状态,并且不能被关闭。在LSI振荡器稳定后,时钟供应给IWDG。
第二步,写入预分频器和重装寄存器,要先写入键值,解除写保护,
第三步、然后再写入预分频值和重装值;
第四步,写入指令启动独立看门狗。
然后写入喂狗的操作。
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);
对应0x5555解除写保护
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);
写预分频器
void IWDG_SetReload(uint16_t Reload);
写重装值
void IWDG_ReloadCounter(void);
喂狗
void IWDG_Enable(void);
启动独立看门狗,0xCCCC
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);
获取标志位
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);
@arg RCC_FLAG_PINRST: Pin reset* @arg RCC_FLAG_PORRST: POR/PDR reset* @arg RCC_FLAG_SFTRST: Software reset* @arg RCC_FLAG_IWDGRST: Independent Watchdog reset* @arg RCC_FLAG_WWDGRST: Window Watchdog reset* @arg RCC_FLAG_LPWRRST: Low Power reset
void RCC_ClearFlag(void);
查看是什么引起的复位,然后清除
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
#include "OLED.h"int main(void)
{OLED_Init();Key_Init();OLED_ShowString(1,1,"IWDG TEST");if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)== SET){OLED_ShowString(2,1,"IWDGRST");Delay_ms(500);OLED_ShowString(2,1," ");Delay_ms(100);RCC_ClearFlag();}else{OLED_ShowString(3,1,"RST");Delay_ms(500);OLED_ShowString(3,1," ");Delay_ms(100);}IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);IWDG_SetPrescaler(IWDG_Prescaler_16);IWDG_SetReload(2499); //1000msIWDG_ReloadCounter();IWDG_Enable(); //这俩会在键寄存器写入5555之外的值,不用在进行写保护了while(1){Key_GetNum();IWDG_ReloadCounter();OLED_ShowString(4,1,"FEED");Delay_ms(200);OLED_ShowString(4,1," ");Delay_ms(600);}
}
二、窗口看门狗
第一步,开启窗口看门狗APB1的时钟;
第二步,配置寄存器,预分频,窗口值,
第三步,写入控制寄存器CR,看门狗使能位,计数器溢出标志位,和计数器有效位;
写入CNT的计数器值进行喂狗
库函数:
void WWDG_DeInit(void);
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);
写入预分频器
void WWDG_SetWindowValue(uint8_t WindowValue);
写入窗口值
void WWDG_EnableIT(void);
使能中断
void WWDG_SetCounter(uint8_t Counter);
写入计数器喂狗
void WWDG_Enable(uint8_t Counter);
使能窗口看门狗,有参数,
递减计数器处于自由运行状态,即使看门狗被禁止,递减计数器仍继续递减计数。当看门狗被启用时,T6位必须被设置,以防止立即产生一个复位。
FlagStatus WWDG_GetFlagStatus(void);
void WWDG_ClearFlag(void);
void WWDG_SetWindowValue(uint8_t WindowValue)
{__IO uint32_t tmpreg = 0;/* Check the parameters */assert_param(IS_WWDG_WINDOW_VALUE(WindowValue));/* Clear W[6:0] bits */tmpreg = WWDG->CFR & CFR_W_Mask;/* Set W[6:0] bits according to WindowValue value */tmpreg |= WindowValue & (uint32_t) BIT_Mask;/* Store the new value */WWDG->CFR = tmpreg;
}读改写操作oid WWDG_SetCounter(uint8_t Counter)
{/* Check the parameters */assert_param(IS_WWDG_COUNTER(Counter));/* Write to T[6:0] bits to configure the counter value, no need to doa read-modify-write; writing a 0 to WDGA bit does nothing */WWDG->CR = Counter & BIT_Mask;
}
测试
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
#include "OLED.h"int main(void)
{OLED_Init();Key_Init();OLED_ShowString(1,1,"WWDG TEST");if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST)== SET){OLED_ShowString(2,1,"WWDGRST");Delay_ms(500);OLED_ShowString(2,1," ");Delay_ms(100);RCC_ClearFlag();}else{OLED_ShowString(3,1,"RST");Delay_ms(500);OLED_ShowString(3,1," ");Delay_ms(100);}RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);WWDG_SetPrescaler(WWDG_Prescaler_8);WWDG_SetWindowValue(0x40|22); //30msWWDG_Enable(0x40|54); //6位while(1){Key_GetNum();//WWDG_SetCounter(0x40|54);//
// OLED_ShowString(4,1,"FEED");
// Delay_ms(20);
// OLED_ShowString(4,1," ");Delay_ms(33);WWDG_SetCounter(0x40|54);//问题是一直触发窗口看门狗,}
}
问题
总结
本节课主要是学习了独立看门狗和窗口看门狗,如何进行配置。