原创 55AA+外部看门狗的检测方法技巧和代码注解

2009-1-18 21:27 5537 4 4 分类: MCU/ 嵌入式

更多讨论见: http://bbs.21ic.com/club/bbs/list.asp?boardid=11&t=3212332


hotpower 发表于 2009-1-16 20:04 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖


楼主: 55AA+外部看门狗的检测方法技巧和代码注解


volatile unsigned int SystemRamTest;

void SystemInit(void)
{
  PortInit();
  TimerInit();
//.......
  WdtTest();//测试外部看门狗
}

void PortInit()
{
  P0 = 0xff;
  P1 = 0xff;
  P2 = 0xff;
  P3 = 0xff;
}

void WdtTest()
{
  WdtClr();//喂外狗
  if (SystemRamTest != 0x55aa)
  {//上电复位可认为SystemRamTest是随机且不可能为0x55aa(概率几乎为0)
    LedInit(1);//上电复位,初始化Led全亮,这样在外狗坏时常亮!!!
    Delay100mS();//这里要用软件延时,因为这里还未开中断
    XBYTE[0x0200] = 0x77;//复位DSP
    XBYTE[0x1000] = 0x04;//写板型,上报PC
    SystemCommand = 0;//复位系统命令,但只有在上电时1次复位
    SystemRamTest = 0x55aa;//设置上电复位结束及RAM测试标志
    while(1);//等待外部看门狗复位,测试外部看门狗喂狗硬件引脚
  }
  else
  {//外部看门狗复位测试通过,外狗器件完好
    LedInit(0);//软件或看门狗复位,初始化Led全灭,外狗好时Led闪烁1次!!!
  }
}

void main()
{
  IE = 0;//关中断
  _start_();//启动时执行2次RETI
  SystemInit();
  while(1)
  {
    EA = 1;//开中断
    WdtClr();//喂狗
    TaskMain();//主任务
    PCON |= IDL_;//进入空闲状态
  }
}

本贴由菜农提供"技巧"答谢诸位"狗友"~~~,转贴请注明出处(雁塔菜地)
HotPower@126.com 2009.1.16 于雁塔菜地

catwill 发表于 2009-1-16 20:30 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

2楼: 有些不懂,请教大虾


_start_();//启动时执行2次RETI    ??

    XBYTE[0x0200] = 0x77;//复位DSP  ??
    XBYTE[0x1000] = 0x04;//写板型,上报PC  ??
    SystemCommand = 0;//复位系统命令,但只有在上电时1次复位  ??

菜鸟蠢钝,参透不得,希望大虾赐教。

hotpower 发表于 2009-1-16 20:33 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

3楼: 参见<Keil C51红杏出墙记>


 

Keil C51红杏出墙记


catwill 发表于 2009-1-16 20:47 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

4楼: 看“红杏出墙”很晕倒啊


小鸟不懂汇编,不过看了您的hotIns.h好像是用C51来“模拟”汇编??
还有,“中断隐身”的概念小鸟不懂,好像机器码都上来了??
可能我对RETI的理解不够深刻吧!
还有hotIns.h里也没有对_start_();的声明吧?

    XBYTE[0x0200] = 0x77;//复位DSP  ??
    XBYTE[0x1000] = 0x04;//写板型,上报PC  ??
    SystemCommand = 0;//复位系统命令,但只有在上电时1次复位  ??
这3句还是不懂……
请赐教。

hotpower 发表于 2009-1-16 21:03 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

6楼: 实际是非常广泛应用的一句~~~


这是村里的程序片段摘要~~~

1.
XBYTE[0x0200] = 0x77;//复位DSP  ??

它是51通过双口RAM与DSP通讯的代码.
51上电时通知DSP进行软件复位.

DSP指令:
command = FLASH[worknum] >> 8;//取命令
switch(command)
{
  case 0x77:
       if (worknum == 0)
       {
         SWI_Reset();//复位DSP
       }
       break;
//.....
}

2.
XBYTE[0x1000] = 0x04;//写板型,上报PC  ??

它是51(发送)通过CPLD与工控(PC)单板通讯的代码.

3.
SystemCommand = 0;//复位系统命令,但只有在上电时1次复位  ??

它是51(接收)通过CPLD与工控(PC)单板通讯的代码.
接收数据在SystemCommand中.
而且只能在51上电时初始化为0一次.

这种应用非常广泛~~~



Keil C51复位后不改写RAM内容的方法


hotpower 发表于 2009-1-16 21:55 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

10楼: _start_();和2次RETI的问题



_start_();实际是"汇编数组"~~~


2次RETI的真正目的是:
保证清除2级"隐身"的中断优先级状态触发器~~~


/*------------------------------------------------------------------------------------------*/
#define _intjmp_(ADDR) DPTR = (void *)ADDR;_icall_(__reset_code__) //中断隐身函数_intjmp_()声明
#define _reset_() DPTR = __reset_code__ + 5;_icall_(__reset_code__) //软复位函数_reset_()声明
#define _start_() _icall_(__reset_code__ + 4);_icall_(__reset_code__ + 4); //软启动函数_start_()声明
#ifndef __reset__code__
  #define __reset__code__
  _db_(__reset_code__, "\xc0\x82\xc0\x83\x32\xe4\xc0\xe0\xc0\xe0\x32");//装载数据DB 0xc0..0x32
#endif
/*--------------------------------------------------------------------------------------------
装载代码   __reset_code__: PUSH  DPL;//非典的软复位函数入口(执行2次RETI)
                           PUSH  DPH
                             RETI;//_intjmp_()函数调用到此为止中断退出并跳入子程序隐身(让出中断)
                           CLR   A;//经典的软复位函数入口(执行1次RETI)
                           PUSH  ACC
                           PUSH  ACC
                           RETI;//_reset_()函数调用从此处跳入0x0000开始执行
/*------------------------------------------------------------------------------------------*/


MCS-51系统软复位的深入研究


 



catwill 发表于 2009-1-16 22:03 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

11楼: 呵呵,大虾透露了很多“高深武功”啊


可惜我功力尚浅,还不能理解,不过都记下了,以后慢慢参透。

还有借问一句:内部硬件WDT与外部独立WDT不一样吗?
为什么应用少呢?

我用C8051F一般就省去了外部的WDT,因为3V的器件不好找
我这里小地方,不好买。

真诚的希望您去新手园地指导一下小鸟们接地的问题!

hotpower 发表于 2009-1-16 22:15 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

12楼: 家花(内狗)不如野花(外狗)香,可路边的野花你末要采~~~


内狗一般在上电和复位时是默认关闭的.
外狗一般在管脚悬空时认为关闭,有电平信号(固定或脉冲)是开启的.

故一般外狗的喂狗引脚都上拉电阻,即不可关闭.

所以一般在高可靠应用上都是三狗(内狗,外狗,野狗(软狗))联合应用~~~

 



古道热肠 发表于 2009-1-17 10:27 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

16楼: 哈哈,有趣


不怕一万,就怕万一.
{//上电复位可认为SystemRamTest是随机且不可能为0x55aa}
万一上电时SRAM中就是55AA,您就无法复位DSP,写板型了.
要再上加强筋!


hotpower 发表于 2009-1-17 11:34 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

17楼: 关于55AA的上电概率问题


菜农首次使用55AA可能要追述到1983年左右,主要启蒙于硬盘主引导扇区的55AA.

在一个16年至今的产品中,数万台55AA出现的概率俺没见一次.

在32位ARM中俺喜欢55AA55AA, 在8/16位的MCU/DSP中俺一般使用55AA.

在一些系统中也使用长整型进行RAM上电测试.

新的MCU/ARM/DSP都配备的硬件看门狗和复位标志,但俺还是喜欢用55AA~~~

本主帖主要是一种基本应用方法及实现,真的系统要比其更可靠和复杂.

在有内狗的MCU中,实际还需外狗的冗余保护,它实际是由两层55AA保护的.

所以上电RAM出现55AA的概率几乎为零,何况工控环境几乎都是永不停机的...


hotpower 发表于 2009-1-17 15:53 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

20楼: 硬件看门狗的功能测试对批量产品很有用


尤其是外部看门狗,如813,706,1232等众多硬件看门狗芯片。
以及如74hc123等TTL芯片搭成的外狗更为重要。

因为外狗有喂狗信号引脚,它存在有连接问题,而复位脚也是如此。

这2线有1条出问题都不可,当然还有外狗的电源引脚和外围器件问题。

假若认为外狗都是好的,不附加任何检测程序及手段,那么外狗不起

作用也是从表面看不出来的。

如本主贴一样,施加检测程序后,程序上电时:

若外狗坏,某个LED常亮,如运行灯(假设正常运行时1S闪烁)
若外狗好且无喂狗信号,则LED快闪(复位期间LED灭,测试时亮)

都正常时,LED按1S规律闪烁。

故此方法从1只LED即可检测(看出)外狗是否正常。
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条