基于ARM看门狗程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.
课程结业实验报告
课程名称:嵌入式系统设计
报告题目:基于ARM的看门狗程序设计
专业班级:学号:班1601通信
学生姓名:
指导教师:
20 月年2017 6 日
..
.
看门狗实验
1 实验目的
(1) 了解WATCHDOG的作用;
(2) 掌握WATCHDOG定时器的使用方法。
2 实验内容
(1) 编程添加看门狗功能,观察看门狗作用;
(2) 编程实现看门狗喂狗。
3 实验基础知识
(1) 看门狗功能:嵌入式系统运行时受外部干扰或系统错误,程序有时会出现“跑飞”,导致整个系统瘫痪。为防止这一现象的发生,在对系统稳定性要求较高的场合往往要加入看门狗电路(WATCHDOG)。看门狗的作用是当系统跑飞而进入死循环时,恢复系统的运行。
(2) 看门狗工作原理:设本系统程序完整运转一周的时间是Tp,看门狗定是周期是Ti,Ti>Tp, 在程序运行一周后就修改定时器的计数值,只要程序正常运行,定时器就不会溢出,若由于干扰等原因是系统不能在Tp时刻修改定时器的数值,定时器将在Ti 时刻溢出,引发系统复位,使系统得以重新运行,从而起到监控的作用
在一个完整的嵌入式系统中或单片机小系统中通常都有看门狗定时器,且一般集成在处理器芯片中,看门狗实际上就是一个定时器,知识它在期满后将自动引起系统复位。
(3)看门狗定时器计数值:
输入到计数器的时钟周期t_watchdog =1/(PCLK/Prescaler value + 1)/
Division_factor)
看门狗的定时周期T = WTCNT * t_watchdog
(4)看门狗定时器寄存器
控制寄存器(WTCON)
数据寄存器(WTDAT)
计数器寄存器(WTCNT)
4 实验步骤
..
.
(1) 新建一个工程watchdog,添加相应的文件,并修改watchdog的工程设置;创建watchdog.c并加入到工程watchdog中,部分参考代码如下:
/* functions */
void rtc_tick_isr(void) __attribute__ ((interrupt(IRQ)));;
void rtc_int_isr(void) __attribute__ ((interrupt(IRQ)));;
//设置寄存器参数
#define WDT_ENABLE (0x01<<5)
(0x01<<2) #define WDT_INT_ENABLE
#define WDT_RST_ENABLE (0x01<<0)
#define WDT_CLK_SEL
(0X3 /* 1/128 */
<<3)
#define WDT_PRE_SCALER ((PCLK/1000000-1) <<8) /* 49
void watchdog_init()
{
/* rWTCNT = 8448 * 2;
设置看门狗初始值*/
rWTCON = WDT_ENABLE | WDT_RST_ENABLE | WDT_CLK_SEL | WDT_PRE_SCALER; /* 打开看门狗*/
}
void rtc_set_date(st_date* p_date)
{
rRTCCON = 0x01;
rBCDYEAR = p_date->year;
rBCDMON = p_date->mon;
rBCDDAY = p_date->day;
rBCDDATE = p_date->week_day;
rBCDHOUR = p_date->hour;
rBCDMIN = p_date->min;
rBCDSEC = p_date->sec;
rRTCCON = 0x00;
}
void rtc_get_date(st_date* p_date)
..
.
{…}
void rtc_tick_init( char tick )
{
Irq_Request(IRQ_TICK, rtc_tick_isr);
rRTCCON = 0x0; //No reset[3], Merge BCD counters[2], BCD clock select XTAL[1], RTC Control disable[0]
rTICNT = (tick&0x7f)|0x80; /*TICK 中断使能,周期为(1+tick)/128秒*/
Irq_Enable(IRQ_TICK);
}
void Main(void)
{
int old_index ;
st_date m_date;
*/
/* 配置系统时钟ChangeClockDivider(1,1); // 1:2:4
// FCLK=202.8MHz ChangeMPllValue(0xa1,0x3,0x1);
*/
/* 中断初始化
Isr_Init();
/* 初始化端口*/
Port_Init();
/* 初始化串口*/
Uart_Init(0,115200);
Uart_Select(0);
/* 设置告警的时间及方式,0x41表示使能RTC告警,以及使能秒时钟告警*/ rtc_alarm_set(&m_date, 0x41);
rtc_tick_init(127)
*/
打开看门狗复位功能/*
..
.
watchdog_init();
old_index = led_index;
剐义?尨请在2秒内喂狗,否则系统将在约2秒后复位\n\n);
while(1)
{
if(old_index != led_index) /* 每隔一秒更新一次数据*/
{
rtc_get_date(&m_date);
old_index = led_index;
}
};
}
void rtc_tick_isr(void)
{
Irq_Clear(IRQ_TICK); /* 清除TICK中断*/
*((U8*) 0x10000006) = 0x00;
*(unsigned char*)0x10000004 = seg7table[led_index_x0010_];
led_index++;
/* 喂狗*/