历史上的今天
今天是:2024年12月18日(星期三)
2018年12月18日 | STM32—IWDG看门狗
2018-12-18 来源:eefocus
背景:
STM32的看门狗有2个:独立看门狗IWDG和窗口看门狗WWDG本文主要介绍STM32的IWDG。
内容:
IWDG主要性能
(1)自由运行的递减计数器;
(2)时钟由独立的RC振荡器提供(可在停止和待机模式下工作),LSI为其时钟源,STOP和SLEEP模式仍可运行;
(3)看门狗被激活后,在计数器计数至0x000的的时产生复位。
下图为看门狗的框图。

上图中,IWDG由4个寄存器控制,PR,SR,RLR和KR。下面继续分析STM32的HAL库中IWDG的使用。
IWDG_HandleTypeDef hiwdg;定义一个IWDG_HandleTypeDef类型的结构体,查看其结构体,如下
typedef struct
{
IWDG_TypeDef * Instance; / *!<寄存器基地址* /
IWDG_InitTypeDef Init; / *! } IWDG_HandleTypeDef; 继续查看其内部的两个结构体,如下 typedef struct { __IO uint32_t KR; / *! __IO uint32_t PR; / *! __IO uint32_t RLR; / *! __IO uint32_t SR; / *! } IWDG_TypeDef; typedef struct { uint32_t Prescaler; / *!<选择IWDG的预分频器。 此参数可以是@ref的值IWDG_Prescaler * / uint32_t Reload; / *!<指定IWDG减计数器重载值。 此参数必须是介于Min_Data = 0和Max_Data = 0x0FFF之间的数字* / } IWDG_InitTypeDef; 下面继续分析看门狗的初始化函数: static void MX_IWDG_Init(void) { hiwdg.Instance = IWDG; //传入IWDG的基地址; hiwdg.Init.Prescaler = IWDG_PRESCALER_32; //32预分频 hiwdg.Init.Reload = 3000; if(HAL_IWDG_Init(&hiwdg)!= HAL_OK) { _Error_Handler(__ FILE__,__LINE__); } } 继续查看HAL_IWDG_Init函数: HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef * hiwdg) { uint32_t tickstart; / *检查IWDG句柄分配* / if(hiwdg == NULL) { return HAL_ERROR; } / *检查参数* / assert_param(IS_IWDG_ALL_INSTANCE(hiwdg-> Instance)); assert_param(IS_IWDG_PRESCALER(hiwdg-> Init.Prescaler)); assert_param(IS_IWDG_RELOAD(hiwdg-> Init.Reload)); / *启用IWDG。LSI开启automaticaly * / __HAL_IWDG_START(hiwdg); / *通过在KR * / IWDG_ENABLE_WRITE_ACCESS(hiwdg)中写入0x5555来启用对IWDG_PR和IWDG_RLR寄存器的写入访问; / *写入IWDG寄存器Prescaler&Reload值与* / hiwdg-> Instance-> PR = hiwdg-> Init.Prescaler; hiwdg-> Instance-> RLR = hiwdg-> Init.Reload; / *检查未决的标志,如果以前的更新没有完成,则返回超时* / tickstart = HAL_GetTick(); / *等待寄存器更新* / while(hiwdg-> Instance-> SR!= RESET) { if((HAL_GetTick() - tickstart)> HAL_IWDG_DEFAULT_TIMEOUT) { return HAL_TIMEOUT; } } / *在重装载寄存器* /定义的值重新加载IWDG计数器 __HAL_IWDG_RELOAD_COUNTER(hiwdg); / *返回函数状态* / return HAL_OK; } 当实际程序中使用看门狗后,需要在计数时间内不停地喂狗,以防止程序重启。若程序较为复杂,也可通过开启的一个定时器来不停地喂狗,喂狗即让看门狗复位从新计数,调用 __HAL_IWDG_RELOAD_COUNTER(hiwdg)函数来喂狗。
史海拾趣
|
1 引言 单片机具有集成度高,运算快速快,体积小、运行可靠,价值低廉,因此在过程控制、数据采集、机电一体化、智能化仪表、家用电器以及网络技术等方面得到广泛应用,本文主要介绍单片机在炉温控制中的应用。 在工业生产中,有很多行业有大量的 ...… 查看全部问答> |
|
请问Nand flash在手机上是存储什么的?相当于外存还是内存,它和RAM有什么区别和联系呢?和SD卡的联系呢? 手机中的程序比如QQ是在那个存储器里运行的呢?Nand flash 和PC机的硬盘是不是一个概念? 谢谢… 查看全部问答> |
|
急!!!如何让我开发的WDM驱动程序在双核的机器中只运行在单核上? 我们一张PCI卡里面一块芯片的读写只支持在单核上运行,这样在双核机器上要强制让操作系统运行在单CPU模式下才可正确使用,我用的操作系统是Windows Vista. 请问我应该怎样通过编程的方式让我的驱动程序能内在的指定运行在单核上?… 查看全部问答> |
|
大虾们好!最近最一个产品,测试一个润滑脂的低液位报警,就是提醒要加料了! 装在直径200mm,高度75mm(这个很小)还有高度250mm的塑料桶里面。桶底有一个直流电机带动的刮板。 润滑脂粘度很大,类似于黄油,稍微稀一点,流动性很小。 用音叉肯 ...… 查看全部问答> |
|
看了一下712的管脚的好象没有外部中断管脚,除了710中的P2.8到P2.10是外部中断管脚。除了712中的capture,还有没有 ...… 查看全部问答> |
|
定义了全局变量,在中断函数中赋值。在主程序中全局变量的值为何没有变。请各位大侠指教,不胜感激!结果是 ser=0!!!!! #include <msp430x14x.h> unsigned char a[6]; unsigned char b[6]; unsigned char n; unsigned char pt; unsigned ...… 查看全部问答> |
|
自由选择一种传感器,设计一款检测仪表,至少包括传感器。单片机。显示及按键四个部分,并完成以下内容。 1.传感器的工作原理 2.该仪表的组成框图 3.(单片机)的开发流程 4.仪表主要构成部分及代码… 查看全部问答> |




