📄 wdg.c
字号:
/****************************************Copyright (c)**************************************************
**
**
** 杭州央海软件科技有限公司
**
** http://www.armgcc.com
**
**--------------文件信息--------------------------------------------------------------------------------
** 文 件 名: wdg.c
** 创 建 人: 罗辉联
** 创建日期: 2006年5月10日
** 描 述: 该文件包含了WDG相关功能函数
**
**--------------历史版本--------------------------------------------------------------------------------
** 创 建 人: 罗辉联
** 版 本: V1.0
** 日 期: 2006年5月10日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "wdg.h"
#include "eic.h"
#if EN_ARM_WDG > 0 //决定是否编译该文件
#ifndef abs
#define abs(x) ((x)>0 ? (x) : -(x))
#endif
/******************************************* 全局变量定义 ***********************************************/
/******************************************* 局部函数声明 ***********************************************/
/*********************************************************************************************************
** 函数名称: wdg_init
** 功能描述: watchdog 初始化,系统复位时间大约0.8ms
**
** 参 数: None
**
** 返 回 值: None
**
** 作 者: 罗辉联
** 日 期: 2006年6月21日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗辉联
** 日 期: 2006年6月21日
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void wdg_init(void)
{
WDG_Disable();
WDG_ECITConfig(DISABLE); /* 关闭计数结束中断 */
WDG_CounterfConfig(DISABLE);/* 停止定时器计数 */
WDG_ECFlagClear(); /* 清楚中断状态 */
}
/*********************************************************************************************************
;** 函数名称: WDG_WatchdogStart
;** 功能描述: 使用WDG的看门狗功能,根据装载的计数值设置复位门限
;**
;** 参 数: reset_time:看门狗复位时间值
;**
;** 返 回 值: 无
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void WDG_WatchdogStart(UWORD32 reset_time)
{
WDG_ECITConfig(DISABLE); /* 关闭计数结束中断 */
WDG_CounterfConfig(DISABLE); /* 停止定时器计数 */
WDG_PeriodValueConfig(reset_time); /* 看门狗复位时间设置 */
WDG_ECFlagClear(); /* 清楚中断状态 */
WDG_Enable();
}
/*********************************************************************************************************
;** 函数名称: WDG_TimerStart
;** 功能描述: 使用WDG的定时器功能,根据装载的计数值立即启动定时器
;**
;** 参 数: 无
;**
;** 返 回 值: 无
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void WDG_TMStart(UWORD32 time)
{
//set prescale and reload counter value
WDG_PeriodValueConfig(time);
WDG_ECFlagClear(); //clear the status of wdg_timer interrupt ,
WDG_ECITConfig(ENABLE); //enable the interrupt
WDG_CounterfConfig(ENABLE); //start timer,disable WDG.
IRQ_PriorityConfig(WDG_IRQ,6);
IRQ_ONEITConfig(WDG_IRQ, ENABLE);
}
/*********************************************************************************************************
;** 函数名称: WDG_TMStop
;** 功能描述: 停止WDG的定时器
;**
;** 参 数: 无
;**
;** 返 回 值: 无
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void WDG_TMStop(void)
{
WDG_PrescalerConfig(0x0000); //根据具体应用设置值
WDG_CounterReloadUpdate(0x00ff);//set the wdg unit prescale ,0xff means the max value;
WDG_ECFlagClear(); //clear the status of wdg_timer interrupt ,
WDG_ECITConfig(DISABLE); //Disable the interrupt
WDG_CounterfConfig(DISABLE); //stop timer,disable WDG.
}
/*********************************************************************************************************
;** 函数名称: WDG_FindFactors
;** 功能描述: Search for the best (a,b) values that fit n = a*b with the following constraints: 1<=a<=256, 1<=b<=65536
;**
;** 参 数: n: the number to decompose
;** a: a pointer to the first factor
;** b: a pointer to the second factor
;**
;** 返 回 值: 无
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
static void WDG_FindFactors(UWORD32 n, UWORD16 *a, UWORD32 *b)
{
UWORD32 b0;
UWORD16 a0;
WORD32 err, err_min=n;
*a = a0 = ((n-1)/65536ul) + 1;
*b = b0 = n / *a;
for (; *a <= 256; (*a)++)
{
*b = n / *a;
err = (WORD32)*a * (WORD32)*b - (WORD32)n;
if (abs(err) > (*a / 2))
{
(*b)++;
err = (WORD32)*a * (WORD32)*b - (WORD32)n;
}
if (abs(err) < abs(err_min))
{
err_min = err;
a0 = *a;
b0 = *b;
if (err == 0) break;
}
}
*a = a0;
*b = b0;
}
/*********************************************************************************************************
;** 函数名称: WDG_PeriodValueConfig
;** 功能描述: 根据定时时间设置prescaler和counter reload 值
;**
;** 参 数: time:需要的时间计数us为单位
;**
;** 返 回 值: 无
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void WDG_PeriodValueConfig (UWORD32 time)
{
UWORD16 a;
UWORD32 n, b;
n = time * (RCCU_AnyClockObtain(RCCU_PCLK) / 1000000);
WDG_FindFactors(n, &a, &b);
WDG_PR = a - 1;
WDG_VR = b - 1;
//uart_printf("RCCU_AnyClockObtain = %d",RCCU_AnyClockObtain(RCCU_PCLK));
//uart_printf("a = %d",a);
//uart_printf("b = %d",b);
}
#endif //EN_ARM_WDG > 0
/****************************************end of file*******************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -