载入中......

 
LPC2294-看门狗调式
[ 2007-4-23 7:23:00 | By: CANopen ]
 
/*优龙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
***************************************************************************************************
*/
 
发表评论:
载入中......

载入中......
时 间 记 忆
载入中......
最 新 评 论
载入中......

专 题 分 类
载入中......
最 新 日 志
载入中......
最 新 留 言
载入中......
搜 索
用 户 登 录
载入中......
友 情 连 接
博 客 信 息
载入中......