• (转)CortexM3 (NXP LPC1788)之WDT窗口看门狗定时器


    看门狗定时器的用途是在微控制器进入错误状态后的一段合理时间内将其复位。看门狗被是能后,如果用户没有在预先设定的时间内喂狗,那么会产生一个看门狗事件。

            看门狗定时器的寄存器有看门狗定时器常数计数器WDTC,每当在喂狗寄存器WDFEED中写入喂狗序列,WDTC中的值就会被写入看门狗定时计数器WDTV,WDTV中的值在看门狗时钟的驱动下递减。我们可以通过设置看门狗定时器报警中断寄存器WDWARNINT寄存器,当WDWARNINT中的值和WDTV中的值匹配时,可以形成中断。最重要的还有看门狗模式寄存器WDMOD,它控制着看门狗的使能,复位,更新模式以及超时标识和中断标志。此外还有一个看门狗定时器窗口寄存器WDWINDOW,它决定了喂狗过程中允许的最大的WDTV。

            看门狗的时钟有一个专用的振荡器,提供了500KHZ的时钟,该时钟通过4分频,提供DWTV计数。因此在下面的程序中给WDTC赋值1000000,则看门狗计数的周期为 (1/500KHZ)*1000000*4 = 8S .所以看门狗中断每8秒产生一次。程序配置看门狗超时不复位,进入超时中断以后软件清除中断标志和超时标识。

    注意:为了程序的简洁,省去了之前介绍了的系统时钟配置和串口的配置。具体的信息可查询之前的文章。

    1. #include "LPC1788_REG.h" 
    2. #include "uart.h" 
    3.  
    4. #define rWDMOD  (*(volatile unsigned*)0x40000000) 
    5. #define rWDTC   (*(volatile unsigned*)0x40000004) 
    6. #define rWDFEED (*(volatile unsigned*)0x40000008) 
    7. #define rWDTV   (*(volatile unsigned*)0x4000000C) 
    8. #define rWDWARNINT  (*(volatile unsigned*)0x40000014) 
    9. #define rWDWINDOW   (*(volatile unsigned*)0x40000018) 
    10.  
    11. char str[]={"WDT_IRQ occur.\r\n"}; 
    12.  
    13. void WDT_IRQHandler(void
    14.     rICER0 |= 0x1; 
    15.     Uart2SendS(str); 
    16.     rWDMOD &= ~(0x1<<3|0x1<<2);  
    17.      
    18.     rWDTC = 1000000; 
    19.     rWDMOD |= 0x1; 
    20.     rWDFEED = 0xAA; 
    21.     rWDFEED = 0x55; 
    22.  
    23.     rISER0 |= 0x1; 
    24.  
    25. int main(void
    26.     unsigned int i,j; 
    27.      
    28.     rFIO1DIR |= (1<<18); //GPIO1.18 -> OUTPUT 
    29.     Init_Uart2(); 
    30.      
    31.  
    32.     rWDTC = 1000000; 
    33.      
    34.     rWDMOD |= 0x1; 
    35.     rWDFEED = 0xAA; 
    36.     rWDFEED = 0x55; 
    37.      
    38.     rISER0 |= 0x1; 
    39.      
    40.     while(1) 
    41.     { 
    42.         rFIO1PIN |= 0x1<<18; 
    43.         for(i=0; i<10000; i++) 
    44.             for(j=0; j<1000; j++); 
    45. //      rWDFEED = 0xAA; 
    46. //      rWDFEED = 0x55; 
    47.          
    48.         rFIO1PIN &= ~(0x1<<18); 
    49.         for(i=0; i<10000; i++) 
    50.             for(j=0; j<1000; j++); 
    51.     } 
    #include "LPC1788_REG.h"
    #include "uart.h"
    
    #define rWDMOD	(*(volatile unsigned*)0x40000000)
    #define rWDTC	(*(volatile unsigned*)0x40000004)
    #define rWDFEED	(*(volatile unsigned*)0x40000008)
    #define rWDTV	(*(volatile unsigned*)0x4000000C)
    #define rWDWARNINT	(*(volatile unsigned*)0x40000014)
    #define rWDWINDOW	(*(volatile unsigned*)0x40000018)
    
    char str[]={"WDT_IRQ occur.\r\n"};
    
    void WDT_IRQHandler(void)
    {
        rICER0 |= 0x1;
        Uart2SendS(str);
        rWDMOD &= ~(0x1<<3|0x1<<2); 
        
        rWDTC = 1000000;
        rWDMOD |= 0x1;
        rWDFEED = 0xAA;
        rWDFEED = 0x55;
    
        rISER0 |= 0x1;
    }
    
    int main(void)
    {
        unsigned int i,j;
        
        rFIO1DIR |= (1<<18); //GPIO1.18 -> OUTPUT
    	Init_Uart2();
        
    
        rWDTC = 1000000;
        
        rWDMOD |= 0x1;
        rWDFEED = 0xAA;
        rWDFEED = 0x55;
        
        rISER0 |= 0x1;
        
        while(1)
        {
            rFIO1PIN |= 0x1<<18;
            for(i=0; i<10000; i++)
                for(j=0; j<1000; j++);
    //      rWDFEED = 0xAA;
    //      rWDFEED = 0x55;
            
            rFIO1PIN &= ~(0x1<<18);
            for(i=0; i<10000; i++)
                for(j=0; j<1000; j++);
        }
    }
    

    如果将程序中红色的两句喂狗屏蔽,则程序每8S产生一次看门狗超时中断,并且LED灯闪烁。串口打印信息如下。 WDT_IRQ

    如果打开rWDFEED = 0xAA; rWDFEED = 0x55两句代码,由于有喂狗,所以程序不会进入超时中断,串口也就不会有打印信息。
  • 相关阅读:
    java 对象属性复制,将一个对象的属性值赋值给另一个对象, 属性名需要相同
    文件上传设置上传文件大小
    layui form.on('select(xxx)',function(){});绑定失败
    列表显示, 内容过长省略显示, 鼠标停留在内容上显示全部内容
    mybatis : ERROR. token : COMMA, pos : 373
    js判断手机系统
    vue v-nav指令属性列表
    第五节 tensorboard可视化
    第四节 生成随机张量和张量合并
    第三节 张量
  • 原文地址:https://www.cnblogs.com/tdyizhen1314/p/2704596.html
Copyright © 2020-2023  润新知