KEA128是M0内核的ARM单片机,只有一个看门狗,不像其他ARM单片机,可能有多个看门狗,如STM32F103系列就有2个看门狗,KEA128只有一个,单可配置成两种模式,即独立看门狗模式或窗口模式。
在使用看门狗时,系统上电后对WDOG_CS1、WDOG_CS2,WDOG_TOVAL只能写一次,之后再写就无效了,除非在需要重新写的寄存器之前加上那个解锁序列:WDOG->CNT = 0x20C5,WDOG->CNT = 0x28D9. 所以在对这些寄存器进行写操作时,最好一次性写完。
//============================================================================
//文件名称:wdog.h
//功能概要:KEA128 看门狗驱动程序头文件
//版权所有:苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)
//版本更新:2015-05-11 V1.0 初始版本
//=================苏州大学飞思卡尔嵌入式中心2015=========================
#ifndef __WDOG_H__
#define __WDOG_H__
//1 头文件
#include "common.h"
//=================接口函数声明===========================================
//=========================================================================
//函数名称:wdog_init
//功能概要:初始化看门狗模块
//参数说明:无
//函数返回:无
//=========================================================================
void wdog_init(void);
//=========================================================================
//函数名称:wdog_disable
//功能概要:关闭看门狗模块
//参数说明:无
//函数返回:无
//=========================================================================
void wdog_disable(void);
//=========================================================================
//函数名称:wdog_enable
//功能概要:启动看门狗
//参数说明:无
//函数返回:无
//=========================================================================
void wdog_enable(void);
//=========================================================================
//函数名称:wdog_feed
//功能概要:复位看门狗定时器,喂狗
//参数说明:无
//函数返回:无
//=========================================================================
void wdog_feed(void);
//=========================================================================
//函数名称:wdog_enable_int
//功能概要:启动看门狗中断
//参数说明:无
//函数返回:无
//=========================================================================
void wdog_enable_int(void);
//=========================================================================
//函数名称:wdog_disable_int
//功能概要:关闭看门狗中断
//参数说明:无
//函数返回:无
//=========================================================================
void wdog_disable_int(void);
#endif
看门狗操作步骤:
1.取消写保护,解锁看门狗保护
2.确定时钟(KEA128只需确定时钟,其他芯片看情况)
3.设置看门狗重载值,确定溢出时间
4.使能看门狗,设置何种模式下使能看门狗
5,在应用程序开始处要初始化看门狗,在程序容易跑飞的地方设置看门狗
//========================================================================
//文件名称:wdog.c
//功能概要:KEA128看门狗驱动程序程序源文件
//=================苏州大学飞思卡尔嵌入式中心2015==========================
#include "wdog.h" //包含wdog.h头文件
#include "uart.h"
//=================内部函数声明===========================================
//=========================================================================
//函数名称:wdog_unlock
//功能概要:解锁看门狗
//参数说明:无
//函数返回:无
//=========================================================================
static void wdog_unlock(void);
//=================接口函数实现===========================================
//=========================================================================
//函数名称:wdog_init
//功能概要:初始化看门狗模块
//参数说明:无
//函数返回:无
//=========================================================================
void wdog_init()
{
//给看门狗模块解锁,以便写寄存器
wdog_unlock();
//看门狗超时时间设置为1s,0x03e8=1000
WDOG_TOVALL = 0xE8;
WDOG_TOVALH = 0x03;
//使用1KHz时钟源
//00 总线时钟。01 1 KHz内部低功耗振荡器(LPOCLK)。10 32KHz内部振荡器(ICSIRCLK)。11 外部时钟源
WDOG_CS2 = WDOG_CS2_CLK(1);
//开启看门狗,允许解锁从而更新寄存器,开启停止模式和等待模式
WDOG_CS1 = WDOG_CS1_EN_MASK|WDOG_CS1_UPDATE_MASK
|WDOG_CS1_STOP_MASK|WDOG_CS1_WAIT_MASK;
}
//=========================================================================
//函数名称:wdog_disable
//功能概要:关闭看门狗模块
//参数说明:无
//函数返回:无
//=========================================================================
void wdog_disable(void)
{
//给看门狗模块解锁,以便写寄存器
wdog_unlock();
//关闭看门狗
WDOG_CS1 &= ~WDOG_CS1_EN_MASK;
}
//=========================================================================
//函数名称:wdog_enable
//功能概要:启动看门狗
//参数说明:无
//函数返回:无
//=========================================================================
void wdog_enable(void)
{
//给看门狗模块解锁,以便写寄存器
wdog_unlock();
//开启看门狗
WDOG_CS1 |= WDOG_CS1_EN_MASK;
}
//=========================================================================
//函数名称:wdog_feed
//功能概要:喂狗,清看门狗计数器
//参数说明:无
//函数返回:无
//=========================================================================
void wdog_feed()
{
DISABLE_INTERRUPTS;
//刷新序列
WDOG_CNT = 0x02A6;
WDOG_CNT = 0x80B4;
ENABLE_INTERRUPTS;
}
//=========================================================================
//函数名称:wdog_enable_int
//功能概要:启动看门狗中断
//参数说明:无
//函数返回:无
//=========================================================================
void wdog_enable_int()
{
//给看门狗模块解锁,以便写寄存器
wdog_unlock();
//开看门狗中断
WDOG_CS1 |= WDOG_CS1_INT_MASK;
//启动IRQ中断
NVIC_EnableIRQ(WDOG_IRQn);//28
}
//=========================================================================
//函数名称:wdog_disable_int
//功能概要:关闭看门狗中断,操作WDOG控制和状态寄存器1,WDOG_CS1
//参数说明:无
//函数返回:无
//=========================================================================
void wdog_disable_int()
{
//给看门狗模块解锁,以便写寄存器
wdog_unlock();
//开看门狗中断
WDOG_CS1 &= ~WDOG_CS1_INT_MASK;
}
//=================内部函数实现===========================================
//=========================================================================
//函数名称:wdog_unlock
//功能概要:解锁看门狗
//参数说明:无
//函数返回:无
//=========================================================================
static void wdog_unlock()
{
/* 注意: 不要单步调试此程序!!! ,否则会引起CPU复位*/
//关总中断
DISABLE_INTERRUPTS;
//写解锁寄存器
WDOG_CNT = 0x20C5;
//完成解锁
WDOG_CNT = 0x28D9;
//开总中断
ENABLE_INTERRUPTS;
}