这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 2114 2114看门狗问题,大家帮我测试一下这个程序

共2条 1/1 1 跳转至

2114 2114看门狗问题,大家帮我测试一下这个程序

院士
2006-09-17 18:14:16     打赏
2114 2114看门狗问题,大家帮我测试一下这个程序



关键词: 看门狗     问题     大家     帮我     测试     一下     这个     程序    

院士
2006-12-22 22:43:00     打赏
2楼
问 存在的问题:是不是外部中断影响看门狗?我现在一旦有外部中断发生,程序就
重启。

1,   按下KEY1 程序会重新启动,打印出Do your best!

2,   禁止看门狗之后,程序运行正常,按下KEY1 会打印出00



(用2100的开发板,按下KEY1是表示有外部中断。)

测试的时候别忘了修改 startup.s 文件中的
;设置系统模式堆栈
        ;MSR     CPSR_c, #0xdf
        MSR     CPSR_c, #0x5f
        LDR     SP, =StackUsr
来容许中断。





#include "config.h"


#define  CR       0x0D
#define  UART_BPS 115200

#define RUN                1 //定义键值
#define SET_TIME           2
#define MANUAL_OPERATION   3

#define MAIN_VALVE         4
#define RAIN_DEALY         5
#define WATER_BUDGET       6
#define SOAK_SETTING       7

#define ANY_CYCLE          8
#define WEEK_CYCLE         9
#define MONTH_CYCLE        10

#define START_TIME         11
#define PERSIST_TIME       12

#define ARROW_UP           13
#define ARROW_DOWN         14
#define SWITCH_F           15
#define STATION_NUM        16

#define K1    (1<<16)    //key1 连接P1.16,为0时是gpio
#define K2    (1<<17)    //key1 连接P1.17
#define K3    (1<<18)    //key1 连接P1.18
#define K4    (1<<19)    //key1 连接P1.19
#define K5    (1<<29)    //key1 连接P1.20
#define K6    (1<<21)    //key1 连接P1.21
#define K7    (1<<22)    //key1 连接P1.22
#define K8    (1<<23)    //key1 连接P1.23
#define K9    (1<<24)    //key1 连接P1.24
#define K10   (1<<25)    //key1 连接P1.25

#define K11   (1<<10)    //key1 连接P0.10
#define K12   (1<<11)    //key1 连接P0.11
#define KEY1  (1<<12)    //key1 连接P1.12
#define KEY2  (1<<13)    //key1 连接P1.13
#define KEY3  (1<<15)    //key1 连接P1.15
#define KEY4  (1<<17)    //key1 连接P1.17

uint8 KeyValue,FlagKeyPressed;

/******************************************
* 名称    :  void  Rst_Wdt(void)
* 功能描述:  看门狗喂狗操作
* 输入参量:  无
* 输出参量:  无
* 调用子程:  无
* 使用方法:
--------------—*/
void  Feed_Dog(void)
{
   //uint8 i;
   WDFEED = 0xAA;
   //i++;
   WDFEED = 0x55;
   //i=0;

}


/******************************************
* 名称    :  void DelayNS(uint32 dly)
* 功能描述:  延时程序
* 输入参量:
* 输出参量:
* 调用子程:
* 使用方法:
--------------—*/
void DelayNS(uint32 dly)
{
    uint32 i;
    Feed_Dog();
    for(;dly>0;dly--)
        for(i=0;i<50000;i++);
        Feed_Dog();
}

/******************************************
* 名称    :  int Putchar (int ch)   
* 功能描述:  发送一个字符
* 输入参量:  无
* 输出参量:  无
* 调用子程:  无
* 使用方法:
--------------—*/
char Putchar (char ch)  
{                 
  if (ch == '\n')  
  {
    while (!(U0LSR & 0x40));
    U0THR = CR;                      /* output CR */
  }
  while (!(U0LSR & 0x40));
  return (U0THR = ch);
}



/******************************************
* 名称    :  void Puthexbyte(int hex)  
* 功能描述:  将数据用16进制的格式表示
             例如数据puthexbyte(0x16)将向串口送出0x31  0x36,如果用串口工具的文本模式将看到"16"
* 输入参量:  无
* 输出参量:  无
* 调用子程:  无
* 使用方法:
--------------—*/
void Puthexbyte(char hex)
{  
     char i;
    i=(hex>>4);
    if (i<=9)  Putchar(0x30+i);
        else Putchar (0x37+i);
    i=(hex&0x0F);    
    if (i<=9)  Putchar(0x30+i);
        else Putchar (0x37+i);
}

/******************************************
* 名称    :  void Prints (uint8 *p)  
* 功能描述:  打印一串字符
* 输入参量:  无
* 输出参量:  无
* 调用子程:  无
* 使用方法:
--------------—*/
void Prints (char *p) {                    /* Write string */
  while (*p)
  {
    Putchar (*p++);
  }
}




/******************************************
* 名称    :  void Watchdog_Init(void)
* 功能描述:  看门狗部分的初始化
* 输入参量:  无
* 输出参量:  无
* 调用子程:  无
* 使用方法:
--------------—*/
void Watchdog_Init(void)
{
     //WDTC = 0x5F0000;                        // 设置WDTC,喂狗重装值
     WDTC = 0x2000000;                        // 设置WDTC,喂狗重装值
   WDMOD = 0x03;                            // 设置并启动WDT
   Feed_Dog();                                // 进行喂狗操作
              
}



/******************************************
* 名称    :  void __irq  IRQ_Eint0(void)
* 功能描述:  在中断函数中处理按键,判断键值
* 输入参量:  无
* 输出参量:  无
* 调用子程:  无
* 使用方法:  最后将脉冲的数据输出到全局变量
--------------—*/
void __irq  IRQ_Eint0(void)
{    
    FlagKeyPressed=1;                 //通知程序有按键按下
    Puthexbyte(KeyValue);//////////////////////////////////////////////////////////////////
    EXTINT|=0x01;                     //清除中断标志
    VICVectAddr=0x00;                 //向量中断结束                  
}


void Key_Init(void)
{
                                          //将根按键相关的管脚设置为普通io口,并且为输入
    PINSEL2&=(0xFFFFFFFF-(1<<3));         //第3位,该位为0时,P1:25:16用作GPIO。该位为1时,P1.25:16用作一个跟踪端口。
    PINSEL0&=(0xFFFFFFFF-(1<<20));        //k11 连接P0.10,设置为gpio
    PINSEL0&=(0xFFFFFFFF-(1<<21));
    PINSEL0&=(0xFFFFFFFF-(1<<22));        //k12 连接P0.11,设置为gpio
    PINSEL0&=(0xFFFFFFFF-(1<<23));
    PINSEL0&=(0xFFFFFFFF-(1<<24));        //key1 连接P0.12,设置为gpio
    PINSEL0&=(0xFFFFFFFF-(1<<25));
    PINSEL0&=(0xFFFFFFFF-(1<<26));        //key2 连接P0.13,设置为gpio
    PINSEL0&=(0xFFFFFFFF-(1<<27));
    PINSEL0&=(0xFFFFFFFF-(1<<30));        //key3 连接P0.15,设置为gpio
    PINSEL0&=(0xFFFFFFFF-(1<<31));
    PINSEL1&=(0xFFFFFFFF-(1<<2));         //key4 连接P0.17,设置为gpio
    PINSEL1&=(0xFFFFFFFF-(1<<3));
    IO0DIR&=(0xFFFFFFFF-K11);
    IO0DIR&=(0xFFFFFFFF-K12);
    IO0DIR&=(0xFFFFFFFF-KEY1);
    IO0DIR&=(0xFFFFFFFF-KEY2);
    IO0DIR&=(0xFFFFFFFF-KEY3);
    IO0DIR&=(0xFFFFFFFF-KEY4);

    
    PINSEL1|=(1<<0);                      //设置管脚连接,p0.16设置为eint0                        
    PINSEL1&=(0xFFFFFFFF-(1<<1));         //01
    
    EXTMODE=0x0F;                         //外部中断设置为边沿出发方式
    
    EXTPOLAR=0x0F;                        //设置为上升沿触发外部中断
    
    VICVectCntl1|=0x20|14;                //分配EINT0中断到向量中断1
    VICVectAddr1=(int)IRQ_Eint0;          //设置中断服务程序地址
    EXTINT|=0x01;                         //清除EINT0中断标志
    VICIntEnable|=(1<<14);                //使能EINT0中断  
    
    FlagKeyPressed=0;                     //有按键按下的标志清为0
}



void Serial_Init (void)  
{               
    uint16 Fdiv;
    U0LCR=0x83;                     //10000011   8位长度,能访问除数锁存,dlab=1,可以设置波特率
    Fdiv=(Fpclk/16)/UART_BPS;
    U0DLM=Fdiv/256;
    U0DLL=Fdiv%256;
    U0LCR=0x03;                     //禁止修改波特率??   
    
    PINSEL0|=(1<<0);                //uart0管脚连接模块,相应的位要变成01
    PINSEL0&=(0xFFFFFFFF-(1<<1));
    PINSEL0|=(1<<2);                //uart0管脚连接模块,相应的位要变成01     
    PINSEL0&=(0xFFFFFFFF-(1<<3));
    Prints("Do your best!\r\n");
}


void DelayNS11(uint32 dly)
{
    uint32 i;
    //Feed_Dog();
    for(;dly>0;dly--)
        for(i=0;i<50000;i++);
        //Feed_Dog();
}
   
int main(void)
{
   uint8 i;
   Serial_Init();                                 //串口调试的初始化
   Watchdog_Init();                             //看门狗初始化
   Key_Init();                                    //按键输入的初始化

   Feed_Dog();
   DelayNS(10);
   Feed_Dog();
  
   
  

   while(1)  //这个函数可以延时6秒不复位
   {

     // Prints("hi");
      Feed_Dog();
   }
   return(0);
}
   
    1: 我也遇到这种问题,后来发现是这个原因喂狗不能太快,这个可能是philips的一个bug或一个特殊的地方吧。你隔长一点喂就没问题了。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]