📄 watchdog.c
字号:
/***********************************************Copyright (c)*********************************************
** Guangzou ZLG-MCU Development Co.,LTD.
**
** http://www.zlgmcu.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: WatchDog.c
** Last modified Date: 2007-10-15
** Last Version: 1.0
** Descriptions: WatchDog函数实现,采用设备描述符来操作
**
**--------------------------------------------------------------------------------------------------------
** Created by: wengshujie
** Created date: 2007-10-15
** Version: 1.0
** Descriptions: 无
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date:
** Version:
** Descriptions:
**
*********************************************************************************************************/
#include "Config.h"
#include "WatchDogPrivate.h"
#include "WatchDog.h"
/*********************************************************************************************************
定义操作WATCHDOG器件的结构体
*********************************************************************************************************/
static __WATCHDOG_INFO __GWdtinfoDate;
/*********************************************************************************************************
** Function name: __wdtInit
** Descriptions: Wdt初始化程序(非字符串型),该函数需要被封装一层的,如果设置参数的时间超过
** 10000ms,则程序设置为100ms
** Input parameters: uiId 器件子设备号,只能输入0
** uiWdtTimerOut 看门狗溢出时间值,以毫秒为单位,输入范围为1~10000ms
** pRsv 保留参数
** Output parameters: NONE
** Returned value: OPERATE_FAIL 初始化失败
** OPERATE_SUCCESS 初始化成功
*********************************************************************************************************/
static int __wdtInit (uint32 uiId,
uint32 uiWdtTimerOut,
void *pRsv)
{
volatile uint32 *puiAddrBase;
volatile uint32 uiOffBase;
if (uiId >= __WD_MAX_NUM) {
return OPERATE_FAIL;
}
if (uiWdtTimerOut > 10000) { /* 参数过滤 */
uiWdtTimerOut = 100;
}
__GWdtinfoDate.puiAddrBase = (uint32*)WDG_BASE_ADDR;
__GWdtinfoDate.uiOffBase = 0;
puiAddrBase = __GWdtinfoDate.puiAddrBase; /* 获取结构体参数 */
uiOffBase = __GWdtinfoDate.uiOffBase;
puiAddrBase[__B_WD_MOD << uiOffBase] = 0x03; /* 设置看门狗模式,中断且复位 */
/* 装载看门狗定时常数 */
puiAddrBase[__B_WD_TC << uiOffBase] = uiWdtTimerOut * (Fpclk / (4 * 1000));
IRQDisable(); /* 关中断 */
puiAddrBase[__B_WD_FEED << uiOffBase] = 0xaa; /* 喂狗 */
puiAddrBase[__B_WD_FEED << uiOffBase] = 0x55;
IRQEnable(); /* 开中断 */
return OPERATE_SUCCESS;
}
/*********************************************************************************************************
** Function name: wdtInit
** Descriptions: 初始化看门狗,初始化完毕后将立即运行
** Input parameters: uiId 器件子设备号,只能输入0,因为看门狗只有一个
** pcArg 参数输入字符串,输入参数格式为:关键字0=值0[空格]关键字1=值1[空格]......
** 关键字:WdtTimerOut:看门狗溢出时间值,以毫秒为单位,输入范围为1~10000ms
** pRsv 保留参数
** Output parameters: NONE
** Returned value: OPERATE_FAIL 初始化失败
** OPERATE_SUCCESS 初始化成功
** Example: char cWdtarg[ ] = " WdtTimerOut=10 ";
** WdtInit( 0, cWdtarg, NULL );
** Notice: 本API函数是在FPCLK=11059200Hz的频率下运行得到的看门狗溢出时间值
*********************************************************************************************************/
int32 wdtInit (uint32 uiId,
char *pcArg,
void *pRsv)
{
uint32 uiParm[1]={-1};
if (uiId < __WD_MAX_NUM) {
ImpCmd(Tab_WDT, pcArg, uiParm); /* 解析字符串参数 */
return __wdtInit(uiId, uiParm[0], pRsv); /* 初始化部件 */
}
return OPERATE_FAIL;
}
/*********************************************************************************************************
** Function name: wdtFeed
** Descriptions: 喂狗
** Input parameters: uiId 器件子设备号,只能输入0,因为看门狗只有一个
** pRsv 保留参数
** Output parameters: NONE
** Returned value: OPERATE_FAIL 喂狗失败
** OPERATE_SUCCESS 喂狗成功
*********************************************************************************************************/
int32 wdtFeed (uint32 uiId, void *pRsv)
{
volatile uint32 *puiAddrBase;
volatile uint32 uiOffBase;
if (uiId >= __WD_MAX_NUM) {
return OPERATE_FAIL;
}
__GWdtinfoDate.puiAddrBase = (uint32*)WDG_BASE_ADDR;
__GWdtinfoDate.uiOffBase = 0;
puiAddrBase = __GWdtinfoDate.puiAddrBase; /* 获取结构体参数 */
uiOffBase = __GWdtinfoDate.uiOffBase;
IRQDisable(); /* 关中断 */
puiAddrBase[__B_WD_FEED << uiOffBase] = 0xaa; /* 喂狗 */
puiAddrBase[__B_WD_FEED << uiOffBase] = 0x55;
IRQEnable(); /* 开中断 */
return OPERATE_FAIL;
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -