恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记3——看门狗

时间:2024-04-06 15:28:15

KEA128是M0内核的ARM单片机,只有一个看门狗,不像其他ARM单片机,可能有多个看门狗,如STM32F103系列就有2个看门狗,KEA128只有一个,单可配置成两种模式,即独立看门狗模式或窗口模式。

在使用看门狗时,系统上电后对WDOG_CS1、WDOG_CS2,WDOG_TOVAL只能写一次,之后再写就无效了,除非在需要重新写的寄存器之前加上那个解锁序列:WDOG->CNT = 0x20C5,WDOG->CNT = 0x28D9. 所以在对这些寄存器进行写操作时,最好一次性写完。
恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记3——看门狗

//============================================================================
//文件名称: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 

恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记3——看门狗

看门狗操作步骤:

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;
}