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

    文章

    540

    浏览量

    70253
  • 计数器
    +关注

    关注

    32

    文章

    2121

    浏览量

    92952
  • IWDG
    +关注

    关注

    0

    文章

    21

    浏览量

    5136
  • 独立看门狗
    +关注

    关注

    0

    文章

    23

    浏览量

    3648
  • MM32
    +关注

    关注

    1

    文章

    104

    浏览量

    573

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

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

收藏 人收藏

    评论

    相关推荐

    MM32 独立看门狗与窗口看门狗

    本帖最后由 MMCU5721167 于 2017-11-9 16:34 编辑 来源 灵动MM32MM32有两看门狗独立看门狗(IWDG)和窗口
    发表于 11-09 16:12

    MM32独立看门狗(IWDG)

    来源 灵动MM32一、IWDG简介MM32 MCU内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门设备(独立
    发表于 03-29 17:28

    独立看门狗的原理是什么?如何去使用独立看门狗

    为什么需要看门狗独立看门狗的原理是什么?独立看门狗的特点有哪些?如何去使用独立
    发表于 07-26 13:59

    独立看门狗的使用

    0、独立看门狗的使用独立看门狗基于低速内部RC振荡器(LSI)运行。若LSI运行正常,当主程序发生错误时,无法重置看门狗计数器,
    发表于 08-02 10:31

    独立看门狗( IWDG)和窗口看门狗( WWDG)

    一个热爱代码的工程师,唯有凭借双手不断敲打,才可以快速提升实力!本文谨以记录,日后相忘时再作复习,代码没有贵贱,既来之则安之。 STM32F1内部自带了 2 个看门狗独立看门狗( I
    发表于 08-02 10:55

    灵动MM32F103 待机模式 后独立看门狗不能唤醒。独立看门狗单独测试可以正常工作

    灵动MM32F103 待机模式 后独立看门狗不能唤醒。独立看门狗单独测试可以正常工作。有那位兄弟知道什么原因啊?
    发表于 08-16 16:17

    STM32F4的独立看门狗有哪些应用

    STM32F4的独立看门狗有哪几个相关寄存器?STM32F4的独立看门狗有哪些应用?怎样去编写S
    发表于 09-06 06:22

    STM32F767的独立看门狗与窗口看门狗简析

    STM32F767独立看门狗的相关寄存器有哪些?如何去使用STM32F767的独立看门狗?怎样去
    发表于 09-07 07:34

    独立看门狗与窗口看门狗介绍

    嵌入式工程师成长之路(八)之两只看门狗独立看门狗与窗口看门狗第一部分:stm32。STM32 内部自带了 2 个看门狗
    发表于 12-07 10:41

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

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

    MCU独立看门狗与窗口看门狗的区别

      早期的MCU没有看门狗,就容易引起有些产品死机了不能重启工作。为了避免这个问题,后期的MCU在内部集成了看门狗的功能。  为了满足更多使用场景,现在很多MCU都集成了两个看门狗独立
    发表于 03-17 16:30

    MM32F0140 产品手册(中文版)

    MM32F0140 产品手册(中文版)
    发表于 02-22 18:45 0次下载
    <b class='flag-5'>MM32F0140</b> 产品手册(中文版)

    MM32F0140学习笔记——CRC

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

    MM32F0140 FlexCAN一致性测试 (2)

    MM32F0140 FlexCAN一致性测试 (2)
    的头像 发表于 11-10 18:23 377次阅读
    <b class='flag-5'>MM32F0140</b> FlexCAN一致性测试 (2)

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

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