查看: 3667|回复: 1

[原创] Kinetis K60系列之WDOG看门狗测试

[复制链接]

该用户从未签到

16

主题

78

帖子

0

注册会员

Rank: 2

积分
178
最后登录
2018-6-1
发表于 2016-9-12 08:45:36 | 显示全部楼层 |阅读模式
看门狗是一种计数器。当计数的值溢出时会自动复位MCU。(需要在溢出前“喂狗”,避免复位)
看门狗机制可以避免程序跑死(跑死时自动复位)

改变看门狗寄存器参数前必须解锁看门狗。freescale kinetis看门狗解锁步骤是向看门狗的解锁寄存器连续写入0XC520和0xD928.两次写入不能超过20个时钟周期。

WDOG看门狗测试1.jpg

注:程序需要烧至flash,否则复位后程序丢失。

初始化看门狗

  1. void WDOG_Init(void)
  2. {
  3.     WDOG_UNLOCK = 0xC520;      
  4.     WDOG_UNLOCK = 0xD928;               //解锁看门狗寄存器(重新写入前必须解锁)两次写入不能超过20个时钟周期
  5.    
  6.     WDOG_PRESC = 0x0700;  //(7+1)分频

  7.     WDOG_TOVALH = 0x0110;    //看门狗超时时间设置为3s
  8.     WDOG_TOVALL = 0x5E90;

  9. }
复制代码
2.jpg
3.jpg
4.jpg

喂狗
  1. void WDOG_Feed(void)
  2. {
  3.     WDOG_REFRESH = 0xA602;
  4.     WDOG_REFRESH = 0xB480;   //喂狗
  5. }
复制代码

5.jpg


关闭和开启看门狗


  1. void WDOG_Close(void)
  2. {
  3.     WDOG_UNLOCK = 0xC520u;
  4.     WDOG_UNLOCK = 0xD928u;
  5.     WDOG_STCTRLH &= ~0x0001; //关闭看门狗 WDOTEN 0
  6. }
  7. void WDOG_Open(void)
  8. {
  9.     WDOG_UNLOCK = 0xC520;
  10.     WDOG_UNLOCK = 0xD928;
  11.     WDOG_STCTRLH |= 0x0001;  //打开看门狗 WDOTEN 1
  12. }
复制代码

所有代码

  1. #include "LED.h"

  2. void WDOG_Init(void);
  3. void WDOG_Feed(void);
  4. void WDOG_Close(void);
  5. void WDOG_Open(void);

  6. void main(void)
  7. {
  8.     DisableInterrupts;
  9.     WDOG_Init();      //初始化看门狗  
  10.     init_LED();      
  11.     EnableInterrupts;
  12.    
  13.     WDOG_Open();     //开启看门狗            

  14.     Delay(1500);
  15.     while(1)
  16.     {
  17.         LED1(0);
  18.         LED2(0);
  19.         LED3(0);
  20.         LED4(0);
  21.         //WDOG_Feed();     //喂狗
  22.     }

  23. }

  24. void WDOG_Init(void)
  25. {
  26.     WDOG_UNLOCK = 0xC520;      
  27.     WDOG_UNLOCK = 0xD928;               //解锁看门狗寄存器(重新写入前必须解锁)两次写入不能超过20个时钟周期
  28.    
  29.     WDOG_PRESC = 0x0700;  //(7+1)分频

  30.     WDOG_TOVALH = 0x0110;    //看门狗超时时间设置为3s
  31.     WDOG_TOVALL = 0x5E90;

  32. }

  33. void WDOG_Feed(void)
  34. {
  35.     WDOG_REFRESH = 0xA602;
  36.     WDOG_REFRESH = 0xB480;   //喂狗
  37. }
  38. void WDOG_Close(void)
  39. {
  40.     WDOG_UNLOCK = 0xC520u;
  41.     WDOG_UNLOCK = 0xD928u;
  42.     WDOG_STCTRLH &= ~0x0001; //关闭看门狗 WDOTEN 0
  43. }
  44. void WDOG_Open(void)
  45. {
  46.     WDOG_UNLOCK = 0xC520;
  47.     WDOG_UNLOCK = 0xD928;
  48.     WDOG_STCTRLH |= 0x0001;  //打开看门狗 WDOTEN 1
  49. }
复制代码

注释掉“喂狗后”LED 1.5秒闪烁(初始化LED为低电平)3秒看门狗复位
喂狗,LED亮1.5后熄灭

07165133-caa593a8bcbc41d69ef4c23c0bc08465.gif.jpg





回复

使用道具 举报

  • TA的每日心情
    开心
    2018-7-4 07:07
  • 签到天数: 24 天

    [LV.4]偶尔看看III

    22

    主题

    513

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2043
    最后登录
    2018-8-15
    发表于 2016-9-18 14:04:40 | 显示全部楼层
    写的非常清晰,之前对这个锁定解锁不明白,看了楼主的帖子才知道原来k60的看门狗寄存器是不能随便修改的。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-25 06:24 , Processed in 0.121448 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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