0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详解MM32F0140的独立看门狗

灵动MM32MCU 来源:灵动MM32MCU 作者:灵动MM32MCU 2022-07-15 10:30 次阅读

独立看门狗(IWDG)的设计初衷是为了检测和解决由软件错误所引起的故障,与窗口看门狗的主要区别在于独立看门狗可以作为一个处于主程序之外,由内部低速时钟(LSI)驱动,能够完全独立工作的模块,当主时钟发生故障或芯片处在低功耗模式的时候,独立看门狗依旧可以继续工作。

它的原理可以简述为:当独立看门狗计数器不断递减达到给定数值时,将产生一个系统复位信号使系统复位或产生中断信号。

MM32F0140的独立看门狗有一个特色功能,用户可以通过配置选择IWDG产生复位还是产生中断功能,比如在stop模式下,用户可以选择中断方式唤醒从而不用复位MCU,SRAM数据不用因为看门狗唤醒而被清除。

1产生复位或者中断

MM32F014x的独立看门狗内部是自由运行的12位递减计数器,当设置IWDG复位方式时,当计数达到0x0000时,会产生一个系统复位;当设置IWDG中断方式时,当设置看门狗中断生成值IGEN,每当计数器值递减等于该值时,会产生一个中断信号。

2计数器时钟

IWDG是由低速时钟源(LSI)驱动,经过IWDG_PR预分频器分频得到,预分频因子可以被设置为4,8,16,32,64,128,256,在开启IWDG前需要先开启LSI,如图1所示。

faf4641a-034f-11ed-ba43-dac502259ad0.png

图1

3重装载寄存器

每次执行喂狗操作,就会将重装载寄存器(IWDG_RLR)的值重新加载到计数器中,从而避免产生复位或者中断信号,该操作通常叫做喂狗操作。复位时重装载寄存器(IWDG_RLR)的值为0xFFF,如图2。

fb11f994-034f-11ed-ba43-dac502259ad0.png

图2

4看门狗超时时间

IWDG的超时周期可以通过重装载寄存器(IWDG_RLR)的值和预分频寄存器(IWDG_PR)计算得到,公式如下:

Tout(ms)=((4×2^PR)×RLR)/40

当IWDG_RLR寄存器为最大值时,可以获得最长的超时时间,参考时间如表1:

fb2ee996-034f-11ed-ba43-dac502259ad0.png

表1

5寄存器保护

独立看门狗中的IWDG_PR,IWDG_RLR,IWDG_IGEN寄存器具有访问保护功能,只能在向键值寄存器(IWDG_KR)写入0x5555,才能修改以上被保护的寄存器的值。向键值寄存器写入其他值或者重载操作时,寄存器依旧出在保护状态。

6看门狗中断

当开启独立看门狗后,计数器开始从其复位值0xFFF开始递减,当IWDG_CR控制寄存器中的IRQ_SEL位置1时,计数器递减到IWDG_IGEN设定的值后会产生一个中断。独立看门狗中断被连接到EXTI24上,所以看门狗中断可以使MCU从低功耗模式下唤醒,结合IWDG_IGEN寄存器的设定,可以模拟低功耗定时器来使用。

7部分库函数参考

PVU_CheckStatus();

IWDG_WriteAccessCmd(0x5555);

IWDG_SetPrescaler(IWDG_Prescaler);

修改预分频寄存器(IWDG_PR),修改前需要先向键值寄存器(IWDG_KR)写入0x5555。

RVU_CheckStatus();

IWDG_WriteAccessCmd(0x5555);

IWDG_SetReload(Reload & 0xfff);

修改重装载寄存器(IWDG_RLR),修改前需要先向键值寄存器(IWDG_KR)写入0x5555。

IVU_CheckStatus();

IWDG_WriteAccessCmd(0x5555);

IWDG_SetIGen(0x7ff);

修改中断生成寄存器(IWDG_IGEN),修改前需要先向键值寄存器(IWDG_KR)写入0x5555。

IWDG_EnableIT();

开启看门狗中断,如果需要看门狗复位方式需要设置:IWDG_Reset();

IWDG_ReloadCounter();

IWDG_Enable();

重载计数器、开启IWDG计数器。

IWDG_ClearITPendingBit();

清除看门狗中断标志位。

8程序配置

8.1 开启独立看门狗

开启看门狗前需要先打开LSI,配置预分频寄存器,配置重装载寄存器,然后开启IWDG计数器,以下示例代码对IWDG进行初始化,配置预分频因子为16,重装载寄存器从最大值(0xFFF)开始计数,最大看门狗超时时间大概为1.6秒,代码如下:

voidIWDG_Init(void)
{
//开启低速时钟,等待时钟稳定
RCC_LSICmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)==RESET);

//设置预分频寄存器
PVU_CheckStatus();
IWDG_WriteAccessCmd(0x5555);
IWDG_SetPrescaler(0x02);//选择对LSI进行16分频

//设置重装载寄存器
RVU_CheckStatus();
IWDG_WriteAccessCmd(0x5555);
IWDG_SetReload(0xfff);//重装载寄存器设置为0xFFF

//将重装载寄存器的值加载到计数器,并开启计数器
IWDG_ReloadCounter();
IWDG_Enable();
}

8.2 重装载计数器(喂狗)

在任何时候向IWDG_KR寄存器写入0xAAAA,就会将重装载寄存器(IWDG_RLR)中的值加载到计数器中,避免产生复位或者中断,可以使用如下库函数:

IWDG_ReloadCounter();

或者直接操作寄存器,但要特别注意,在喂狗后最多需要5个LSI的振荡周期。

IWDG->KR = 0xAAAA;

8.3 开启看门狗中断

如需要开启看门狗中断,在配置IWDG时需要配置IWDG_CR中的IRQ_SEL和IWDG_IGEN寄存器,在开启看门狗之前加入如下代码:

1)配置中断生成寄存器(IWDG_IGEN),并开启看门狗中断

IVU_CheckStatus();
IWDG_WriteAccessCmd(0x5555);
IWDG_SetIGen(0x7FF);//将IWDG_IGEN配置为0x7FF,当计数器到该值时会产生中断
IWDG_EnableIT();

2)使能NVIC和外部中断源

{
EXTI_InitTypeDefEXTI_InitStruct;
NVIC_InitTypeDefNVIC_InitStruct;

RCC_APB1PeriphClockCmd(RCC_APB1ENR_PWR,ENABLE);
//EnabletheIWDGInterrupt
NVIC_InitStruct.NVIC_IRQChannel=WWDG_IWDG_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority=0;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);

RCC_APB2PeriphClockCmd(RCC_APB2RSTR_SYSCFG,ENABLE);
EXTI_StructInit(&EXTI_InitStruct);

EXTI_ClearITPendingBit(EXTI_Line24);
//IWDGmaptoEXTI_Line24
EXTI_InitStruct.EXTI_Line=EXTI_Line24;
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_InitStruct.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStruct);
}

3)编写看门狗中断服务函数,由于和窗口看门狗共用一个中断源,所以库中函数名和窗口看门狗一致。

voidWWDG_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line24)!=RESET)
{
EXTI_ClearITPendingBit(EXTI_Line24);
IWDG_ClearIT();
IWDG_ReloadCounter();//可以在中断中喂狗或者置标志位
}
}

9功能验证

在测试验证程序中在看门狗中断服务函数添加printf("IWDG IRQ Mode ");下载程序可以看到MCU上电完成后会一直循环打印“IWDG IRQ Mode”。

fb4852d2-034f-11ed-ba43-dac502259ad0.png


图3

针对需要短时间低功耗STOP模式唤醒的应用场景,可以使用该方式唤醒,同时针对LSI精度不高的问题,可以通过HSI对LSI进行校准方式,从而获取高精度的LSI时钟源。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 看门狗
    +关注

    关注

    10

    文章

    558

    浏览量

    70691
  • 计数器
    +关注

    关注

    32

    文章

    2249

    浏览量

    94229
  • IWDG
    +关注

    关注

    0

    文章

    21

    浏览量

    5189
  • 独立看门狗
    +关注

    关注

    0

    文章

    24

    浏览量

    3788
  • MM32
    +关注

    关注

    1

    文章

    106

    浏览量

    732

原文标题:灵动微课堂 (第222讲) | MM32F0140学习笔记——独立看门狗(IWDG)

文章出处:【微信号:MindMotion-MMCU,微信公众号:灵动MM32MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    独立看门狗(IWDG)的基础知识

      STM32F10xxx系列内置两个看门狗(独立看门狗和窗口看门狗),提供了更高的安全性、时间的精确性和使用的灵活性。两个
    发表于 10-19 17:10 4150次阅读
    <b class='flag-5'>独立</b><b class='flag-5'>看门狗</b>(IWDG)的基础知识

    STM32中的独立看门狗和窗口看门狗是什么

    在早期的MCU中是没有看门狗这种东西的,所以产品就很容易出现死机,跑飞的情况。为了避免这种情况的出现,后期的MCU都集成了看门狗的功能。但是目前看门狗发展到今天基本上分为两大类:独立
    的头像 发表于 02-20 17:47 2616次阅读
    STM32中的<b class='flag-5'>独立</b><b class='flag-5'>看门狗</b>和窗口<b class='flag-5'>看门狗</b>是什么

    基于MM32F0140开发板的独立看门狗(IWDG)设计笔记

    1、MM32F0140学习笔记——独立看门狗(IWDG)  独立看门狗(IWDG)的设计初衷是为了检测和解决由软件错误所引起的故障,与窗口
    发表于 09-15 16:43

    stm32看门狗时间计算 独立看门狗和窗口看门狗的特性是什么

    本文为您讲解STM看门狗时间计算(时限)与频率计算,独立看门狗和窗口看门狗的特性、区别与联系。
    发表于 10-10 10:41 8715次阅读

    什么是stm32看门狗独立看门狗和窗口看门狗工作原理解析

    stm32有两个看门狗独立看门狗和窗口看门狗,其实两者的功能是类似的,只是喂狗的限制时间不同。 独立
    的头像 发表于 11-06 11:48 2.7w次阅读
    什么是stm32<b class='flag-5'>看门狗</b>?<b class='flag-5'>独立</b><b class='flag-5'>看门狗</b>和窗口<b class='flag-5'>看门狗</b>工作原理解析

    STM32:独立看门狗、窗口看门狗的配置

    STM32单片机的看门狗独立看门狗和窗口看门狗之分,这两者的工作原理却完全不同。
    发表于 02-08 16:15 18次下载
    STM32:<b class='flag-5'>独立</b><b class='flag-5'>看门狗</b>、窗口<b class='flag-5'>看门狗</b>的配置

    STM32中的独立看门狗和窗口看门狗

    一、前言 在早期的MCU中是没有看门狗这种东西的,所以产品就很容易出现死机,跑飞的情况。为了避免这种情况的出现,后期的MCU都集成了看门狗的功能。但是目前看门狗发展到今天基本上分为两大类:独立
    的头像 发表于 12-22 16:58 2019次阅读

    详解独立看门狗的实现原理

    这里以大家熟悉的STM32为例给大家讲解一下独立看门狗的配置以及工作过程。STM32F10xxx内置两个看门狗独立
    发表于 12-22 17:01 3115次阅读

    STM32中的独立看门狗和窗口看门狗

    在早期的MCU中是没有看门狗这种东西的,所以产品就很容易出现死机,跑飞的情况。为了避免这种情况的出现,后期的MCU都集成了看门狗的功能。但是目前看门狗发展到今天基本上分为两大类:独立
    的头像 发表于 01-30 14:38 1293次阅读
    STM32中的<b class='flag-5'>独立</b><b class='flag-5'>看门狗</b>和窗口<b class='flag-5'>看门狗</b>

    MM32F0140学习笔记——CRC

    MM32F0140学习笔记——CRC
    的头像 发表于 11-10 18:27 547次阅读
    <b class='flag-5'>MM32F0140</b>学习笔记——CRC

    MM32F0140学习笔记——窗口看门狗(WWDG)

    MM32F0140学习笔记——窗口看门狗(WWDG)
    的头像 发表于 10-27 09:45 566次阅读
    <b class='flag-5'>MM32F0140</b>学习笔记——窗口<b class='flag-5'>看门狗</b>(WWDG)

    MM32F0140 SPI学习笔记

    MM32F0140 SPI学习笔记
    的头像 发表于 09-26 16:51 549次阅读
    <b class='flag-5'>MM32F0140</b> SPI学习笔记

    MM32F0140 DMA学习笔记

    MM32F0140 DMA 学习笔记
    的头像 发表于 09-18 16:57 655次阅读
    <b class='flag-5'>MM32F0140</b> DMA学习笔记

    MM32F0140 UART学习笔记

    MM32F0140 UART学习笔记
    的头像 发表于 09-26 16:45 718次阅读
    <b class='flag-5'>MM32F0140</b> UART学习笔记

    MM32F0140 GPIO学习笔记

    MM32F0140 GPIO学习笔记
    的头像 发表于 09-26 16:42 504次阅读
    <b class='flag-5'>MM32F0140</b> GPIO学习笔记