/*优龙wigger调试器不支持片内Flash调试,故本测试后续待证。
***************************************************************************************************
*** 函 数 名:Main
*** 功能描述:应用程序入口函数
*** 输入输出:
*** 创建日期: by:CANopen
*** 修改日期: by:
***************************************************************************************************
*/
extern int Main(void)
{
int32u tmp;
TargetInit();
UART0_Init(115200);
WDT_Init();
tmp = WDMOD; //;读取看门狗溢出标识位
/*--------------------------------
应用程序代码:下载到Flash中运行,看门狗可以复位,但不能执行else语句,为什么?
只有一种解释::不管是外部复位,还是内部看门狗复位,WDTOF位都会清零!
可是:User Manual上的解释:
When the Watchdog counter underflows, the program counter will start from 0x00000000 as in the case of external reset. The
Watchdog time-out flag (WDTOF) can be examined to determine if the Watchdog has caused the reset condition. The WDTOF
flag must be cleared by software.
而且,下载到Flash中发现,看门狗复位并不像书上说的会检测ISP使能引脚,甚至连Boot0,boot1两个引脚都不会检测;
--------------------------------*/
if((tmp & 0x04) == 0) //;是否看门狗定时器下溢,检查WDOF位,该位须由外部复位或软件清零
{
UART0_TxStr((int8u *)"Normal PowerOn Reset!"); //;上电复位
UART0_TxChar('\n');
}
else
{
UART0_TxStr((int8u *)"WatchDog Reset!!"); //;看门狗复位
UART0_TxChar('\n');
//WDMOD = 0x03; //;复位WDTOF值
WDT_Init(); //;重新启动看门狗
}
while(1);
return 0;
}
上述例程因程序流程编制有误,修改后运行正确。本笔记特修改如下:
/*wigger调试器不支持片内Flash调试,但下载到flash可以看到执行结果。
若在片内RAM中调试本例程,选择全速运行,本例程将启动看门狗,由于无后续喂狗操作,看门狗下溢出导致系统复位;LPC2294不管何种复位都会运行固化在boot快的启动程序,boot块流程检测到WDOF置位,将不会检测ISP使能引脚(P0.14),接着检测Boot0、Boot1两个引脚,若全高则从内部Flash加载启动应用,否则从外部Flash加载应用,片内或片外RAM装载的代码始终得不到运行(将片外RAM地址空间设置为Bank0可以在片外wigger调试本例程)。
***************************************************************************************************
** 模 块 名:Main.c
** 功能描述:看门狗复位测试例程
** 创建日期:2007-4-26 6:26 by:CANopen
** 修改日期:2007-4-26 6:26 by:
***************************************************************************************************
*/
#i nclude "Config.h"
/*
***************************************************************************************************
*** 函 数 名:WDT_Feed
*** 功能描述:喂狗函数
*** 输入输出:
*** 创建日期:2007-4-26 6:26 by:CANopen
*** 修改日期:2007-4-26 6:26 by:
***************************************************************************************************
*/
extern void WDT_Feed(void)
{
WDFEED = 0xaa;
WDFEED = 0x55;
}
/*
***************************************************************************************************
*** 函 数 名:WDT_Init
*** 功能描述:看门狗定时器初始化,兼启动看门狗功能
*** 输入输出:
*** 创建日期:2007-4-26 6:26 by:CANopen
*** 修改日期:2007-4-26 6:26 by:
***************************************************************************************************
*/
extern void WDT_Init(void)
{
WDTC = 0xF0000; //; 计数重装值
WDMOD = 0x03; //; 启用看门狗,中断、复位
WDT_Feed(); //; 喂狗启动看门狗
}
/*
***************************************************************************************************
*** 函 数 名:UART0_Init
*** 功能描述:串口初始化
*** 输入输出:
*** 创建日期:2007-4-22 6:48 by:CANopen
*** 修改日期:2007-4-22 6:48 by:
***************************************************************************************************
*/
void UART0_Init(int32u baud)
{
int32u div;
div = (Fpclk / 16) / baud; //; 设置波特率
U0LCR = 0x80; //; 允许访问分频因子
U0DLM = div / 256;
U0DLL = div % 256;
U0LCR = 0x03; //; 禁止访问分频因子,同时设置数据位8,停止位1,无奇偶校验
U0FCR = 0x81; //; 接受8字节触发RDA中断,FIFO enable
U0IER = 0x01; //; 禁用RDA、THRE、Rx_Line中断
}
/*
***************************************************************************************************
*** 函 数 名:UART0_TxChar
*** 功能描述:发送一个字符
*** 输入输出:
*** 创建日期:2007-4-22 6:49 by:CANopen
*** 修改日期:2007-4-22 6:49 by:
***************************************************************************************************
*/
void UART0_TxChar(int8u dat)
{
while(!(U0LSR & 0x20)); //; 等待U0THR为空
U0THR = dat;
}
/*
***************************************************************************************************
*** 函 数 名:UART0_TxStr
*** 功能描述:发送一个字符串
*** 输入输出:
*** 创建日期:2007-4-22 6:49 by:CANopen
*** 修改日期:2007-4-22 6:49 by:
***************************************************************************************************
*/
void UART0_TxStr(int8u *str)
{
while(*str) UART0_TxChar(*str++);
}
/*
***************************************************************************************************
*** 函 数 名:Main
*** 功能描述:应用程序入口函数
*** 输入输出:
*** 创建日期:2007-4-26 6:27 by:CANopen
*** 修改日期:2007-4-26 6:27 by:
***************************************************************************************************
*/
int main(void)
{
volatile static int32u flag; //;易失性静态变量,检查WDOF位
TargetInit();
UART0_Init(115200);
flag = WDMOD; //; 读取看门狗溢出标识位,必须在看门狗启动前读取
WDT_Init(); //;启动看门狗,兼WDOF位清零
/*--------------------------------
应用程序代码:下载到Flash中运行,打开串口调试助手可以检测硬复位、软复位
!!!注意!!!::只有在硬复位(上电复位、手动复位)发生后WDTOF位才会清零!
见User Manual上的解释:
When the Watchdog counter underflows, the program counter will start from 0x00000000 as in the case of external reset. The
Watchdog time-out flag (WDTOF) can be examined to determine if the Watchdog has caused the reset condition. The WDTOF flag must be cleared by software.
下载到Flash中运行可以证实上点!
看门狗复位不会将WDOF位清零。LPC2294不管何种复位,Boot快程序都将遵照boot流程执行:
当发现WDOF置位(因为只有该位软复位不清零),则不检测ISP使能引脚,遵照复位流程检测Boot0,boot1两个引脚,
若两个引脚全高则内部Flash启动,否则从外部flash bank0(0x80000000)处启动。
--------------------------------*/
if((flag & 0x04) == 0) //;是否看门狗定时器下溢,检查WDOF位,该位须由外部复位或软件清零
{
UART0_TxStr((int8u *)"Normal PowerOn Reset!"); //;上电复位
UART0_TxChar('\n');
}
else
{
UART0_TxStr((int8u *)"WatchDog Reset!!"); //;看门狗复位
UART0_TxChar('\n');
WDT_Init(); //;重新启动看门狗,兼MDOF位清零
}
while(1); //;等待看门狗溢出
return 0;
}
/*
***************************************************************************************************
**** End Of File
***************************************************************************************************
*/