请选择 进入手机版 | 继续访问电脑版
查看: 7477|回复: 6

[原创] LPC824 lite入门教程九 WWDT

[复制链接]
  • TA的每日心情
    开心
    2020-6-18 08:45
  • 签到天数: 812 天

    [LV.10]以坛为家III

    66

    主题

    4888

    帖子

    64

    金牌会员

    Rank: 6Rank: 6

    积分
    6142
    最后登录
    2024-3-27
    发表于 2016-11-10 23:53:50 | 显示全部楼层 |阅读模式
    本帖最后由 原来的你 于 2016-11-10 23:57 编辑

    本节我们讲解LPC824的看门狗,LPC824的看门狗有如下特性:
    • 如果在可编程超时期限内未重新载入,则可在内部复位芯片。
    • 可选的窗口化操作要求在最大和最小超时期限之间发生重新载入,两个时限都可设定。
    • 可选警报中断可在看门狗超时之前的可编程时间生成。
    • 带内部固定预分频器的可编程 24 位定时器。
    • 时间周期可选,从 1,024 个看门狗时钟 (TWDCLK × 256 × 4) 到超过 6,700 万个看门狗
    时钟 (TWDCLK × 224 × 4),取 4 个看门狗时钟的位数。
    • “ 安全 ” 看门狗操作。一旦使能,则要求禁用软件复位或看门狗复位。
    • 馈入序列不正确会导致看门狗即时事件 (如使能)。
    • 由于对看门狗重载值的保护为选择性,因此只能在 “ 警报中断 ” 时间后更改该值。
    • 指示看门狗复位的标志。
    • 看门狗时钟 (WDCLK) 源是看门狗振荡器。
    • 看门狗定时器可配置为在深度睡眠模式或掉电模式下运行。
    • 调试模式。
    基本配置:
    配置 WWDT 使用的是下列寄存器:
    • 对寄存器接口供电 ( WWDT PCLK 时钟):在 SYSAHBCLKCTRL 寄存器中,设置
    35 中的位 17。
    • 在 PDRUNCFG 寄存器 ( 54)中使能 WWDT 时钟源 (看门狗振荡器)。它是定时
    器的基础时钟源。
    • 要从 WWDT 中断唤醒,则在 STARTERP1 寄存器 ( 51)中使能用于唤醒的看门狗
    中断。  
    看门狗简介:
    看门狗定时器的作用是,如果微控制器进入错误状态,在可编程时间内将其复位或中断。看
    门狗定时器使能时,如果用户程序未能在预定时间内馈入 (或重新载入)看门狗,则会生
    成看门狗复位。
    编程看门狗窗口时,早期的看门狗馈入也被视为看门狗事件。这可防止有故障的系统仍然馈
    入看门狗的情况。例如,应用程序代码可能在包含看门狗馈入的中断服务中阻塞。这样设置
    窗口可能会导致早期馈入,从而生成看门狗事件,允许系统恢复。
    看门狗包括一个固定的 ( 4 分频)预换算器和一个 24 位计数器,后者在有时钟控制时递
    减。计数器递减的最小起始值是 0xFF。设置低于 0xFF 的值将使 0xFF 被载入计数器。因
    此,看门狗的最小间隔为 (TWDCLK × 256 × 4),最大间隔为 (TWDCLK × 224 × 4),两者都是
    (TWDCLK × 4) 的倍数。使用看门狗时应当采用下列方式:
    • 在 TC 寄存器中设置看门狗定时器恒定的重载值。
    • 在 MOD 寄存器中设置看门狗定时器操作模式。
    • 如果需要窗口化操作,在 WINDOW 寄存器中设置看门狗窗口时间的值。
    • 如果需要警告中断,则在 WARNINT 寄存器中设置看门狗警告中断的值。
    • 将 0xAA 写入 FEED 寄存器,然后写入 0x55,以使能看门狗。
    • 在看门狗计数器达到零之前必须重新馈入看门狗,以防发生看门狗事件。如果窗口值经
    过编程,则还必须在看门狗计数器超过该值后才馈入。
    如果 “ 看门狗定时器 ” 配置为看门狗事件会导致复位且计数器会达到零,则 CPU 将被复位,
    如同外部复位一样,从向量表中载入堆栈指针和程序计数器。看门狗超时标志 (WDTOF) 经
    过检查后可确定看门狗是否导致了复位条件。 WDTOF 标志必须通过软件清零。
    如果看门狗定时器配置为产生警告中断,则在计数器与寄存器定义的值匹配时将出现中断。

    时钟和电源控制
    看门狗定时器块使用两个时钟: PCLK 和 WDCLK。 PCLK 供 APB 访问看门狗寄存器使用,
    由系统时钟生成 (参见3)。 WDCLK 用于看门狗定时器计数,由看门狗振荡器生成。
    两个时钟域之间同步逻辑的工作方式如下:当 MOD 和 TC 寄存器通过 APB 操作更新时,
    新的值将在 WDCLK 时钟域内逻辑的 3 个 WDCLK 周期内生效。
    如果看门狗定时器根据 WDCLK 计数,同步逻辑将首先锁定 WDCLK 上计数器的值,然后
    使其与 PCLK 同步,这样 CPU 就能对 WDTV 寄存器进行读操作。
    注: 由于同步步骤,软件必须在馈入序列和 MOD 寄存器的 WDPROTECT 位使能时刻之间
    添加三个 WDCLK 时钟周期的延迟。延迟长度取决于所选的看门狗时钟 WDCLK。  

    使用 WWDT 锁定特性
    WWDT 支持多种锁定特性,这些特性使能后可确保 WWDT 始终运行:
    禁用 WWDT 时钟源
    更改 WWDT 重载值
    禁用 WWDT 时钟源:
    在睡眠模式、深度睡眠模式或掉电模式下,如果设置 WWDT MOD 寄存器中的位 5,则
    WWDT 时钟源会被锁定,并且无法通过软件或硬件禁用。因此,用户在设置 MOD 寄存器
    中的位 5 之前,必须确保每种电源模式的看门狗振荡器均使能。
    在深度掉电模式下,任何时钟锁定机制均无效,因为此时时钟不工作。但是, PMU 中的额
    外锁定位可设置,以防器件进入深度掉电模式 (参见61)。
    更改 WWDT 重载值:
    如果设置WWDT MOD寄存器中的位4,则只能在计数器低于WDWARNINT和WDWINDOW
    值时才更改看门狗超时值 (TC)。
    重载覆盖锁定机制只能通过任何类型的复位而禁用  

    QQ截图20161110234243.png QQ截图20161110234251.png QQ截图20161110234315.png
    表 51 “ 启动逻辑 1 中断唤醒使能寄存器 ( STARTERP1,地址 0x4004 8214)位说明  

    QQ截图20161110234457.png QQ截图20161110234507.png QQ截图20161110234514.png QQ截图20161110234522.png QQ截图20161110234538.png QQ截图20161110234545.png QQ截图20161110234552.png QQ截图20161110234608.png QQ截图20161110234617.png QQ截图20161110234622.png
    int main(void)
    {
            uint32_t wdtFreq;

            SystemCoreClockUpdate();
            Board_Init();

            /* Freq = 0.6Mhz, divided by 64. WDT_OSC should be 9.375khz */
            Chip_Clock_SetWDTOSC(WDTLFO_OSC_0_60, 64);//设置看门狗时钟源

            /* Enable the power to the WDT */
            Chip_SYSCTL_PowerUp(SYSCTL_SLPWAKE_WDTOSC_PD);//使能看门狗电源

            /* The WDT divides the input frequency into it by 4 */
            wdtFreq = Chip_Clock_GetWDTOSCRate() / 4;//看门狗分频

            Board_LED_Set(0, false);

            /* Initialize WWDT (also enables WWDT clock) */
            Chip_WWDT_Init(LPC_WWDT);//初始化看门狗

            /* Set watchdog feed time constant to approximately 2s
               Set watchdog warning time to 512 ticks after feed time constant
               Set watchdog window time to 3s */
            Chip_WWDT_SetTimeOut(LPC_WWDT, wdtFreq * 2);//设置看门狗问够时间2s
            Chip_WWDT_SetWarning(LPC_WWDT, 512);//设置看门狗警告时间
            Chip_WWDT_SetWindow(LPC_WWDT, wdtFreq * 3);//设置看门狗窗口时间为3s

            /* Configure WWDT to reset on timeout */
            Chip_WWDT_SetOption(LPC_WWDT, WWDT_WDMOD_WDRESET);//配置看门狗超时复位

            /* Clear watchdog warning and timeout interrupts */
            Chip_WWDT_ClearStatusFlag(LPC_WWDT, WWDT_WDMOD_WDTOF | WWDT_WDMOD_WDINT);//清除看门狗警告和超时中断

            /* Clear and enable watchdog interrupt */
            NVIC_ClearPendingIRQ(WDT_IRQn);//清除WDT_IRQn
            NVIC_EnableIRQ(WDT_IRQn);//使能WDT_IRQn

            /* Start watchdog */
            Chip_WWDT_Start(LPC_WWDT);//开启看门狗

            while (1) {
                    __WFI();
            }
    }



    QQ截图20161110233853.png
    QQ截图20161110234243.png
    QQ截图20161110234251.png
    QQ截图20161110234315.png
    开心
    回复

    使用道具 举报

  • TA的每日心情
    难过
    2024-3-21 15:13
  • 签到天数: 41 天

    [LV.5]常住居民I

    32

    主题

    1820

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1785
    最后登录
    2024-3-21
    发表于 2016-11-11 00:20:47 | 显示全部楼层
    学习一下,写的比较详细
    好多年没来了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-1-16 12:20
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    12

    主题

    653

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1667
    最后登录
    2022-5-2
    发表于 2016-11-11 08:16:23 | 显示全部楼层
    写的不错啊,学习了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-23 10:20
  • 签到天数: 45 天

    [LV.5]常住居民I

    4

    主题

    689

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1346
    最后登录
    2019-2-13
    发表于 2016-11-11 08:55:12 | 显示全部楼层
    学习一下
    dfdfdfdfdfdfdfd dsfa222
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2017-1-24 08:47
  • 签到天数: 49 天

    [LV.5]常住居民I

    0

    主题

    524

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1267
    最后登录
    2017-4-19
    发表于 2016-11-11 09:45:16 | 显示全部楼层
    不错                              
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    新手上路

    Rank: 1

    积分
    20
    最后登录
    2021-4-16
    发表于 2018-7-28 18:50:55 | 显示全部楼层
    请问开启看门狗后,程序中如果需要临时关闭看门狗,怎么操作?
    1. void WDTInit (uint16_t uiMs)
    2. {
    3.     /*
    4.      * 配置WDT时钟:div_sel  = 0x04
    5.      *      模拟时钟 Freq    = 4.0 MHz,分频值 DIV = 2 * div_sel + 2 = 10,
    6.      *      WDT频率  WDT_OSC = 0.4 MHz,WDT周期 Twdt_osc = 1 / 400000 (s)
    7.      */
    8.     SYSCON->WDTOSCCTRL     = (0xC << 5) | 0x04;
    9.     SYSCON->PDRUNCFG      &= ~(0x1 << 6);                           /* WDT模块上电                  */
    10.                               
    11.     Enable_Periph_Clock(CLK_WWDT);                                   /* 使能看门狗时钟            */
    12.    
    13.     WWDT->MOD =     (1 << 0) |                                          /* 使能WDT定时器                      */
    14.                     (1 << 1) |                                          /* WDT溢出时复位                */
    15.                     (1 << 4) |                                          /* WDT保护模式                  */
    16.                     (1 << 5);                                           /* WDT锁定(避免掉电WDT时钟)   */
    17.    
    18.     /*
    19.      * WDT提醒喂狗时间计算:
    20.      * T = ( WDT_TC - WDT_WARNINT ) * 4 * Twdt_osc
    21.      * 例程中:
    22.      * T = ( 0x18AFF - 0x3FF ) / 100000 (s) = 1.00096 (s)
    23.      */
    24.     WWDT->TC      = 0x18AFF;                                        /* WDT_TC初值                   */
    25.     WWDT->WARNINT = 0x3FF;                                          /* WDT提醒喂狗值                */
    26.    
    27.     WWDT->FEED    = 0xAA;                                           /* 启动WDT的喂狗时序            */
    28.     WWDT->FEED    = 0x55;
    29.    
    30.     NVIC_EnableIRQ(WDT_IRQn);                                           /* 打开WDT中断                  */
    31. }
    32. /* 用WDTDisable函数关不掉看门狗*/
    33. void WDTDisable(void)
    34. {
    35.    WWDT->MOD &=  ~(1 << 0);
    36.    WWDT->MOD&=~(1<<5);
    37.    SYSCON->PDRUNCFG      |= (0x1 << 6);
    38.    Disable_Periph_Clock(CLK_WWDT);
    39.    NVIC_DisableIRQ(WDT_IRQn);
    40. }
    复制代码
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    3

    帖子

    0

    新手上路

    Rank: 1

    积分
    8
    最后登录
    2022-5-18
    发表于 2022-5-17 22:48:26 | 显示全部楼层
    逗倪豌儿 发表于 2018-7-28 18:50
    请问开启看门狗后,程序中如果需要临时关闭看门狗,怎么操作?

    请问,关闭看门狗问题,是怎么解决的?
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-3-29 19:47 , Processed in 0.137695 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表