📄 wdt_reg.c
字号:
/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File Name: WDT_reg.c
** Last modified Date: 2007-09-17
** Last Version: v1.0
** Description: 程序正常运行时,使得LED3不断地闪烁,并喂狗。当按键按下时,触发GPIO按键
** 中断,处理器进入死循环,看门狗定时器产生第一个超时信号,进入看门狗中断
** 服务程序,LED4不断闪烁,直到看门狗定时器产生第二次超时信号,导致系统复
** 位,系统再次正常运行,LED4不断地闪烁。使用寄存器操作。
**
**--------------------------------------------------------------------------------------------------------
** Created By:
** Created date:
** Version:
** Descriptions:
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
*********************************************************************************************************/
#define HWREG(x) (*((volatile unsigned long *)(x)))
#define HWREGB(x) (*((volatile unsigned char *)(x)))
#define SYSCTL_PERIPH_GPIOB 0x20000002 /* GPIO B在系统控制器中的地址 */
#define SYSCTL_PERIPH_GPIOC 0x20000004 /* GPIO C在系统控制器中的地址 */
#define SYSCTL_PERIPH_GPIOE 0x20000010 /* GPIO E在系统控制器中的地址 */
#define SYSCTL_PERIPH_WDOG 0x00000008 /* 看门狗在系统控制器中的地址 */
#define SYSCTL_RCGC2 0x400fe108 /* 运行模式时钟门控寄存器2 */
#define SYSCTL_RCGC0 0x400fe100 /* 运行模式时钟门控寄存器0 */
#define NVIC_EN0 0xE000E100 /* IRQ 0 到31 设置使能寄存器 */
#define GPIO_PORTB_BASE 0x40005000 /* GPIO B 口的基地址 */
#define GPIO_PORTC_BASE 0x40006000 /* GPIO C 口的基地址 */
#define GPIO_PORTE_BASE 0x40024000 /* GPIO E 口的基地址 */
#define GPIO_O_DIR 0x00000400 /* 数据方向寄存器 */
#define GPIO_O_AFSEL 0x00000420 /* 模式控制寄存器 */
#define GPIO_O_DATA 0x00000000 /* 数据寄存器 */
#define GPIO_O_DEN 0x0000051C /* 数据输入寄存器 */
#define GPIO_O_DR2R 0x00000500 /* GPIO2mA驱动控制 */
#define GPIO_O_PUR 0x00000510 /* GPIO上拉选择寄存器 */
#define GPIO_O_IS 0x00000404 /* 中断感应寄存器 */
#define GPIO_O_IBE 0x00000408 /* 双边沿中断寄存器 */
#define GPIO_O_IEV 0x0000040C /* 中断事件寄存器 */
#define GPIO_O_IM 0x00000410 /* 中断屏蔽寄存器 */
#define WATCHDOG_BASE 0x40000000 /* 看门狗定时器的基地址 */
#define WDT_O_LOAD 0x00000000 /* 看门狗定时器的装载寄存器 */
#define WDT_O_CTL 0x00000008 /* 看门狗定时器的控制寄存器 */
#define WDT_O_LOCK 0x00000C00 /* 看门狗定时器的锁定寄存器 */
#define WDT_O_ICR 0x0000000C /* 看门狗定时器的中断清除寄存器*/
#define WDT_CTL_RESEN 0x00000002 /* 使能看门狗定时器复位输出 */
#define WDT_CTL_INTEN 0x00000001 /* 使能看门狗定时器计数及中断 */
#define WDT_LOCK_LOCKED 0x00000001 /* 锁定看门狗定时器 */
#define WDT_INT_TIMEOUT 0x00000001 /* 看门狗定时器超时 */
#define KEY1 0x00000004 /* 定义KEY1 */
#define LED3 0x00000040 /* 定义LED3 */
#define LED4 0x00000020 /* 定义LED4 */
/*********************************************************************************************************
** Function name: delay
**
** Descriptions: 延时长短由ulTime决定
**
** input parameters: unsigned long ulTime
** output parameters: NONE
**
** Returned value: NONE
**
** Created by: shaoxuefeng
** Created Date: 2007-09-17
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void delay (unsigned long ulTime)
{
while (--ulTime != 0); /*延时数量为ulTime个指令周期 */
}
/*********************************************************************************************************
** Function name: GPIO_PORT_E_ISR
**
** Descriptions: 使处理器进入死循环
**
** input parameters: NONE
** output parameters: NONE
**
** Returned value: NONE
**
** Created by: shaoxuefeng
** Created Date: 2007-09-17
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void GPIO_Port_E_ISR (void)
{
while (1);
}
/*********************************************************************************************************
** Function name: Watchdog_Timer_ISR
**
** Descriptions: 反转LED4
**
** input parameters: NONE
** output parameters: NONE
**
** Returned value: NONE
**
** Created by: shaoxuefeng
** Created Date: 2007-09-17
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void Watchdog_Timer_ISR (void)
{
while (1){
HWREG (GPIO_PORTC_BASE + (GPIO_O_DATA + (LED4<< 2))) =
~HWREG (GPIO_PORTC_BASE + (GPIO_O_DATA + (LED4 << 2))); /* 反转LED4 */
delay (100000);
}
}
/*********************************************************************************************************
** Function name: main
**
** Descriptions: 程序主函数
**
** input parameters: NONE
** output parameters: NONE
**
** Returned value: NONE
**
** Created by: shaoxuefeng
** Created Date: 2007-09-17
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
int main (void)
{
HWREG (SYSCTL_RCGC0) |= SYSCTL_PERIPH_WDOG & 0x0fffffff; /* 使能看门狗定时器 */
HWREG (SYSCTL_RCGC2) |= SYSCTL_PERIPH_GPIOB & 0x0fffffff; /* 使能GPIO B口 */
HWREG (SYSCTL_RCGC2) |= SYSCTL_PERIPH_GPIOC & 0x0fffffff; /* 使能GPIO C口 */
HWREG (SYSCTL_RCGC2) |= SYSCTL_PERIPH_GPIOE & 0x0fffffff; /* 使能GPIO E口 */
delay(4);
HWREG (GPIO_PORTE_BASE + GPIO_O_DIR) &= ~KEY1;
HWREG (GPIO_PORTE_BASE + GPIO_O_AFSEL) &= ~KEY1;
HWREG (GPIO_PORTE_BASE + GPIO_O_DR2R) |= KEY1;
HWREG (GPIO_PORTE_BASE + GPIO_O_DEN) |= KEY1;
HWREG (GPIO_PORTE_BASE + GPIO_O_PUR) |= KEY1; /* 配置PE2为上拉2MA驱动输入 */
HWREG (GPIO_PORTB_BASE + GPIO_O_DIR) |= LED3;
HWREG (GPIO_PORTB_BASE + GPIO_O_AFSEL) &= ~LED3;
HWREG (GPIO_PORTB_BASE + GPIO_O_DR2R) |= LED3;
HWREG (GPIO_PORTB_BASE + GPIO_O_DEN) |= LED3;
HWREG (GPIO_PORTB_BASE + GPIO_O_PUR) |= LED3; /* 配置PB6为上拉2MA驱动数字输出*/
HWREG (GPIO_PORTC_BASE + GPIO_O_DIR) |= LED4;
HWREG (GPIO_PORTC_BASE + GPIO_O_AFSEL) &= ~LED4;
HWREG (GPIO_PORTC_BASE + GPIO_O_DR2R) |= LED4;
HWREG (GPIO_PORTC_BASE + GPIO_O_DEN) |= LED4;
HWREG (GPIO_PORTC_BASE + GPIO_O_PUR) |= LED4; /* 配置PC5为上拉2MA驱动数字输出*/
HWREG (GPIO_PORTE_BASE + GPIO_O_IM) &= ~KEY1;
HWREG (GPIO_PORTE_BASE + GPIO_O_IBE) &= ~KEY1;
HWREG (GPIO_PORTE_BASE + GPIO_O_IS) &= ~KEY1;
HWREG (GPIO_PORTE_BASE + GPIO_O_IEV) &= ~KEY1; /* 设置KEY1中断的触发方式为下降沿
触发*/
HWREG (GPIO_PORTE_BASE + GPIO_O_IM) |= KEY1; /* 使能KEY1中断 */
HWREGB (0xE000E404) = 5 << 5; /* 设定GPIO E中断优先级为低 */
HWREG (NVIC_EN0) |= 1 << 4; /* 使能GPIO E 口中断 */
HWREG (WATCHDOG_BASE + WDT_O_LOCK) = 0x1acce551; /* 设置看门狗定时器解锁 */
HWREG (WATCHDOG_BASE + WDT_O_LOAD) = 6000000; /* 设置看门狗定时器的重载值 */
HWREG (WATCHDOG_BASE + WDT_O_CTL) |= WDT_CTL_RESEN; /* 使能看门狗定时器的复位功能 */
HWREG (WATCHDOG_BASE + WDT_O_CTL) |= WDT_CTL_INTEN; /* 使能看门狗定时器的中断 */
HWREG (WATCHDOG_BASE + WDT_O_LOCK) = WDT_LOCK_LOCKED; /* 使能看门狗定时器的锁定机制 */
HWREGB (0xE000E418) = 4 << 5; /* 设定看门狗中断优先级为高 */
HWREG (NVIC_EN0) |= 1 << 18; /* 使能看梦狗中断 */
while (1){
HWREG (GPIO_PORTB_BASE + (GPIO_O_DATA + (LED3 << 2))) =
~HWREG (GPIO_PORTB_BASE + (GPIO_O_DATA + (LED3 << 2))); /* 反转LED3 */
delay(500000);
HWREG (WATCHDOG_BASE + WDT_O_ICR) = WDT_INT_TIMEOUT; /* 看门狗清中断、喂狗 */
}
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -