共2条
1/1 1 跳转至页
2114 2114看门狗问题,大家帮我测试一下这个程序
问
存在的问题:是不是外部中断影响看门狗?我现在一旦有外部中断发生,程序就
重启。
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或一个特殊的地方吧。你隔长一点喂就没问题了。
重启。
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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |