LV16-23-WDG-02-看门狗实例

本文主要是STM32中的独立看门狗和窗口看门狗实例相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows windows11
Ubuntu Ubuntu16.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
SecureCRT Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日
开发板 正点原子 i.MX6ULL Linux阿尔法开发板
uboot NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03)
linux内核 linux-4.15(NXP官方提供)
STM32开发板 正点原子战舰V3(STM32F103ZET6)
点击查看本文参考资料
  • 通用
分类 网址说明
官方网站https://www.arm.com/ARM官方网站,在这里我们可以找到Cotex-Mx以及ARMVx的一些文档
https://www.st.com/content/st_com/zh.htmlST官方网站,在这里我们可以找到STM32的相关文档
https://www.stmcu.com.cn/意法半导体ST中文官方网站,在这里我们可以找到STM32的相关中文参考文档
http://elm-chan.org/fsw/ff/00index_e.htmlFatFs文件系统官网
教程书籍《ARM Cortex-M3权威指南》ARM公司专家Joseph Yiu(姚文祥)的力作,中文翻译是NXP的宋岩
《ARM Cortex-M0权威指南》
《ARM Cortex-M3与Cortex-M4权威指南》
开发论坛http://47.111.11.73/forum.php开源电子网,正点原子的资料下载及问题讨论论坛
https://www.firebbs.cn/forum.php国内Kinetis开发板-野火/秉火(刘火良)主持的论坛,现也做STM32和i.MX RT
https://www.amobbs.com/index.php阿莫(莫进明)主持的论坛,号称国内最早最火的电子论坛,以交流Atmel AVR系列单片机起家,现已拓展到嵌入式全平台,其STM32系列帖子有70W+。
http://download.100ask.net/index.html韦东山嵌入式资料中心,有些STM32和linux的相关资料也可以来这里找。
博客参考http://www.openedv.com/开源网-原子哥个人博客
http://blog.chinaaet.com/jihceng0622博主是原Freescale现NXP的现场应用工程师
cortex-m-resources这其实并不算是一个博客,这是ARM公司专家Joseph Yiu收集整理的所有对开发者有用的官方Cortex-M资料链接(也包含极少数外部资源链接)
  • STM32
STM32STM32 HAL库开发实战指南——基于F103系列开发板野火STM32开发教程在线文档
STM32库开发实战指南——基于野火霸道开发板野火STM32开发教程在线文档
  • SD卡
SD Association提供了SD存储卡和SDIO卡系统规范
点击查看相关文件下载
STM32F103xx英文数据手册STM32F103xC/D/E系列的英文数据手册
STM32F103xx中文数据手册STM32F103xC/D/E系列的中文数据手册
STM32F10xxx英文参考手册(RM0008)STM32F10xxx系列的英文参考手册
STM32F10xxx中文参考手册(RM0008)STM32F10xxx系列的中文参考手册
Arm Cortex-M3 处理器技术参考手册-英文版Cortex-M3技术参考手册-英文版
STM32F10xxx Cortex-M3编程手册-英文版(PM0056)STM32F10xxx/20xxx/21xxx/L1xxxx系列Cortex-M3编程手册-英文版
SD卡相关资料——最新版本有关SD卡的一些资料可以从这里下载
SD卡相关资料——历史版本有关SD卡的一些历史版本资料可以从这里下载,比如后边看的SD卡2.0协议
SD 2.0 协议标准完整版这是一篇关于SD卡2.0协议的中文文档,还是比较有参考价值的,可以一看

一、独立看门狗

1. 硬件设计

独立看门狗属于 STM32F1 的内部资源,只需要软件设置好即可正常工作。我们通过LED灯来指示 STM32F1 的复位情况来看指示独立看门狗的喂狗情况。

2. STM32CubeMX配置

2.1 IWDG配置

image-20230513193914903

独立看门狗的配置时间比较简单:

①、选择IWDG;

②、勾选Activated,表示启用独立看门狗;

③、看门狗的时钟分频,时钟源为40KHz,这里选择64分频;

④、重载寄存器初始值,这里设置为500。

根据前边计算溢出时间的公式,可以知道这样配置的话,溢出时间为Tout = prv/40 * rlr (s), prv 可以是 [4,8,16,32,64,128,256]。如果我们需要设置 1s 的超时溢出, prv 可以取 IWDG_ PRESCALER _64, rlr 取 625,这时 Tout=64/40*625=1s。

2.2 时钟树

image-20230513194753810

3. 看门狗实现

3.1 初始化看门狗

1
2
3
4
5
6
7
8
9
10
void MX_IWDG_Init(void)
{
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_64;
hiwdg.Init.Reload = 625;
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
{
Error_Handler();
}
}

3.2 喂狗

1
2
3
4
5
6
7
8
HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
{
/* Reload IWDG counter with value defined in the reload register */
__HAL_IWDG_RELOAD_COUNTER(hiwdg);

/* Return function status */
return HAL_OK;
}

3.3 测试函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void IWDG_Test(void)
{
LED1 = 0; // LED亮
HAL_Delay(100); // 延时 100ms 再初始化看门狗,LED1 的变化"可见"
MX_IWDG_Init(); // 初始化看门狗
LED1 = 1; // 关闭LED1
while(1)
{
if(KEY_Scan() == WKUP_PRES) //如果 WK_UP 按下,喂狗
{
HAL_IWDG_Refresh(&hiwdg); //喂狗
}
delay_ms(10);
}
}

3.4 测试现象

在编译成功之后,下载代码, 可以看到 LED1 不停的闪烁,证明程序在不停的复位,否则只会 LED1 常亮。这时我们不停的按 KEY_UP 按键,可以看到 LED1 就常亮了,不会再闪烁。

二、窗口看门狗

1. 硬件设计

窗口看门狗属于 STM32F1 的内部资源,只需要软件设置好即可正常工作。我们通过LED灯来指示 STM32F1 的复位情况和窗口看门狗的喂狗情况。

2. STM32CubeMX配置

2.1 WWDG配置

image-20230513195945132

①、选择WWDG配置;

②、选择Activated,表示启用窗口看门狗;

③、窗口看门狗的分频数,这里选择为8;

④、设置窗口上边界值,范围:0x400x7F,换算成十进制就是44127;

⑤、设置计数器的值,范围:0x400x7F,换算成十进制就是44127,计数器会从这个值网下递减;

⑥、使能唤醒中断。

2.2 NVIC中断配置

image-20230513205800870

注意,这里不要把看门狗的中断优先级设置的太高,不然系统无法运行。

2.3 时钟树

image-20230513200632344

3. 看门狗实现

3.1 初始化看门狗

1
2
3
4
5
6
7
8
9
10
11
12
void MX_WWDG_Init(void)
{
hwwdg.Instance = WWDG;
hwwdg.Init.Prescaler = WWDG_PRESCALER_8;
hwwdg.Init.Window = 80;
hwwdg.Init.Counter = 127;
hwwdg.Init.EWIMode = WWDG_EWI_ENABLE;
if (HAL_WWDG_Init(&hwwdg) != HAL_OK)
{
Error_Handler();
}
}

3.2 配置底层及中断

1
2
3
4
5
6
7
8
9
10
void HAL_WWDG_MspInit(WWDG_HandleTypeDef* wwdgHandle)
{
if(wwdgHandle->Instance==WWDG)
{
__HAL_RCC_WWDG_CLK_ENABLE();

HAL_NVIC_SetPriority(WWDG_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(WWDG_IRQn);
}
}

3.3 中断服务函数

1
2
3
4
void WWDG_IRQHandler(void)
{
HAL_WWDG_IRQHandler(&hwwdg);
}

3.4 回调函数

这个是需要重写的,此函数会被 HAL_WWDG_IRQHandler()调用

1
2
3
4
5
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef* hwwdg)
{
HAL_WWDG_Refresh(&hwwdg);//更新窗口看门狗值
LED1=!LED1;
}

3.5 测试函数

1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
// 其他的部分省略
LED1 = 0; //点亮 LED
HAL_Delay(300); // 延时 300ms 再初始化看门狗,LED 的变化"可见"
MX_WWDG_Init();

while (1)
{
LED1=1;
}
return 0;
}

3.6 测试现象

当产生窗口看门狗中断的时候,会反转LED的电平,我们在while(1)中将LED持续性关闭,所以当进入看门狗中断的时候,LED被点亮,这样我们就会看到LED不断地闪烁,设就说明我们进入了看门狗的中断。