⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wdt_reg.c

📁 easyARM8962 看门狗操作实验源码
💻 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 + -