• 基于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


  • 相关阅读:
    [BZOJ 1012][JSOI2008]最大数maxnumber(线段树)
    [BZOJ 1011][HNOI2008]遥远的行星(奇技淫巧)
    [BZOJ 1010][HNOI2008]玩具装箱toy(斜率优化Dp)
    [HDU 3507]Print Article(斜率优化Dp)
    [BZOJ 1006][HNOI2008]神奇的国度(MCS弦图的染色)
    [ZOJ 1015]Fishing Net(MCS弦图的判定)
    进程的状态及转换
    程序、进程、线程的概念与比较
    ES6 模块化规范
    DNS域名解析过程(详细)
  • 原文地址:https://www.cnblogs.com/pangblog/p/3325025.html
Copyright © 2020-2023  润新知