zoukankan      html  css  js  c++  java
  • 基于mini2440的看门狗(裸机)

    在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称"看门狗",s3c2440中也集成了看门狗,在受到干扰或者系统错误时是芯片复位。s3c2440的看门狗有两个特点:1、提供16bit的时间间隔的中断。2、128个PCLK的周期复位信号。看门狗的结构:


    看门狗定时器频率计算如下:


    分频值从0到2的8次方减1,分频系数可选:16、32、64、128。s3c2440看门狗操作需要三个寄存器:WTCON、WTDAT、WTCNT。分别是看门狗控制、限时、计数。在启动时候WTDAT不会自动装载到WTCNT,所以初始化时一定要写定时值到WTCNT中。

    测试程序:

    测试中我们将分频值设置为249,分频系数设置为16。可计算看门狗时间间隔t_watchdog为0.00008s,设置4秒中断一次的话那么WTDAT的值应设置为50000。每次中断蜂鸣器响起,并用串口显示相关信息。程序如下:

    主程序部分:

    #define  GLOBAL_CLK 1
    
    #include<string.h>
    #include "def.h"
    #include "option.h"
    #include "2440addr.h"
    #include "profile.h"
    #include "mmu.h"
    
    extern void watchdog_set(unsigned int wtcnt);
    extern void feed_watchdog(unsigned int wtcnt);
    extern unsigned char watchdog_flag;
    
    void delay(int num)
    {
    	int i, j, k;
    	for(i=0;i<num;i++)
    		for(j=0;j<1000;j++)
    			for(k=0;k<1000;k++);
    }
    
    void Main(void)
    {
    	
    	rGPBCON = (1<<0);//GPIOB[0]设为输出
        rGPBDAT = (0<<0);//关闭蜂鸣器
    	
    	MMU_Init();//地址的重映射
    	watchdog_set(50000);
    	
    	while (1){
    		if (1 == watchdog_flag){
    			rGPBDAT = 1;//打开蜂鸣器
    			delay(50);
    			Uart_Printf("
    watchdog on
    ");
    		}
    
    		watchdog_flag = 0;
    		rGPBDAT = 0;//关闭蜂鸣器
    	}
    }
    


    看门狗部分:

    #include "2440addr.h"
    
    unsigned char watchdog_flag = 0;//看门狗中断标志
    void __irq watchdog_interrupt(void);
    
    /*看门狗初始化*/
    void watchdog_set(unsigned int wtcnt)
    {
    	/*开始时不自动装载因此需先设置计数值*/
    	rWTDAT = wtcnt;
    	rWTCNT = wtcnt;
    	
    	/*使用中断但不复位CPU*/
    	rWTCON |= (249<<8 | 1<<5 | 1<<2 | 0);
    
    	rINTSUBMSK &= ~(1<<13);//允许看门狗中断
    	rINTMSK &= ~(1<<9);
    	
    	/*设置中断向量*/
    	pISR_WDT_AC97 = (unsigned)watchdog_interrupt;
    }
    
    /*喂狗操作*/
    void feed_watchdog(unsigned int wtcnt)
    {
    	rWTCNT = wtcnt;
    }
    
    /*看门狗中断服务函数*/
    void __irq watchdog_interrupt(void)
    {
    	rSUBSRCPND |= 1<<13;//清除中断
    	rSRCPND |= 1<<9;
    	rINTPND |= 1<<9;
    	watchdog_flag = 1;//设置用户中断标志
    }


    运行结果:


    源代码地址:http://download.csdn.net/detail/a16839678/6272069


  • 相关阅读:
    LeetCode Single Number
    Leetcode Populating Next Right Pointers in Each Node
    LeetCode Permutations
    Leetcode Sum Root to Leaf Numbers
    LeetCode Candy
    LeetCode Sort List
    LeetCode Remove Duplicates from Sorted List II
    LeetCode Remove Duplicates from Sorted List
    spring MVC HandlerInterceptorAdapter
    yum
  • 原文地址:https://www.cnblogs.com/pangblog/p/3325025.html
Copyright © 2011-2022 走看看