WDT看门狗实验:
实验内容:
编程实现看门狗功能,观察看门狗作用
编程实现看门狗喂狗
实验目的:
了解看门狗的目的,掌握看门狗的使用方法
实验平台:
FS_6818开发平台,Ubuntu,secureCRT。
概念:
WatchDog Timer (WDT):看门狗定时器。
看门狗用于监测处理器是否由于噪音或者外部干扰造成CPU死机。
如果CPU死机,看门狗可以产生复位信号让CPU重启。
定时去喂狗,看门狗认为CPU工作正常
超过预定的时间,不喂狗,看门狗认为CPU死机,此时会产生一个复位信号。
WDT实验没有外部硬件电路,因此不需要分析电路图。
2. 分析芯片手册
WTCON:看门狗定时器控制寄存器
3. 编写代码
main.c
#include "led.h"
#include "pwm.h"
#include "delay.h"
#include "uart0.h"
#include "wdt.h"
int main()
{
hal_led_init();
// hal_pwm_init();
hal_uart_init();
hal_wdt_init();
Tri_String("WDT Test\n");
while(1)
{
// 喂狗或不喂狗
WTCNT = 4687 * 10;
// Tri_Byte(Recv_Byte()+1);
// printf("pwm test!\n");
// led_flash(500);
// hal_pwm_switch(299, 149, ON);
// delay_ms(1000);
// hal_pwm_switch(299, 149, OFF);
// delay_ms(1000);
}
return 0;
}
wdt.c
#include "wdt.h"
void hal_wdt_init(void)
{
// 4.9.4.2 IP_RESET_REFISTER0/1/2
unsigned int *ip_reset1 = (unsigned int *)0xC0012004;
*ip_reset1 = *ip_reset1 & (~(0x3 << 26));
*ip_reset1 = *ip_reset1 | (0x3 << 26);
// 1. 设置1级分频值
WTCON &= (~(0xFF << 8));
WTCON |= (249 << 8);
// 2. 设置二级分频值
WTCON |= (0x3 << 3);
// 3. 设置喂狗的时间间隔
WTCNT = 4687 * 5;
// 4. 使能看门狗复位信号产生器
WTCON |= (1 << 2);
// 5. 使能看门狗定时器
WTCON |= (1 << 5);
}
wdt.h
#ifndef __WDT_H__
#define __WDT_H__
/*************** WDT ***************/
#define WTCON __REG(0xC0019000)
#define WTDAT __REG(0xC0019004)
#define WTCNT __REG(0xC0019008)
#define WTCLRINT __REG(0xC001900C)
void hal_wdt_init(void);
#endif //__WDT_H__