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

📄 time_16_count_reg.c

📁 ZLG的EASYARM8962开发板Keil实验例程
💻 C
字号:
/****************************************Copyright (c)****************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http://www.embedtools.com		  
**
**--------------File Info---------------------------------------------------------------------------------
** File Name:               time_16_count_reg.c							   
** Last modified Date:      2007.09.20 
** Last Version:            v1.0										  
** Description:             Stellaris系列单片机定时器0口寄存器操作		 
** 				            使用定时器实现输入边沿计数并产生中断	  
**--------------------------------------------------------------------------------------------------------
** Created By:              Ni Likao							 
** Created date:            2007.09.20 						   
** Version: v1.0									    
** Descriptions:            KEY1输入边沿,由定时器递减计数,	  
**                          当计数值和匹配值相等时,进入中断:LED1的状态翻转。					   
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
*********************************************************************************************************/

#define HWREG(x)		            (*((volatile unsigned long *)(x)))

#define SYSCTL_PERIPH_TIMER0    	0x10010000                          /*  Timer 0 在系统控制器中的地址*/
#define SYSCTL_RCGC1             	0x400fe104                          /*  运行-模式时钟门控控制1      */
#define SYSCTL_RCGC2             	0x400fe108                          /*  运行-模式时钟门控控制2      */
#define SYSCTL_PERIPH_GPIOB	  		0x20000002                          /*  GPIO B在系统控制器中的地址  */
#define SYSCTL_PERIPH_GPIOD	  		0x20000008                          /*  GPIO D在系统控制器中的地址  */                                                                                                        
#define TIMER0_BASE             	0x40030000                          /*  Timer0的基地址              */
#define TIMER_O_CFG             	0x00000000                          /*  GPTM配置寄存器	            */
#define TIMER_O_TAMR            	0x00000004                          /*  TimerA 模式寄存器           */
#define TIMER_O_CTL             	0x0000000C                          /*  GPTM控制寄存器			    */
#define TIMER_O_IMR             	0x00000018                          /*  GPTM中断屏蔽寄存器		    */
#define TIMER_O_ICR             	0x00000024                          /*  GPTM中断清零寄存器		    */
#define TIMER_O_TAILR           	0x00000028                          /*  TimerA 间隔装载寄存器       */
#define TIMER_O_TAMATCHR        	0x00000030                          /*  TimerA 匹配寄存器           */

#define TIMER_A                 	0x000000ff                          /*  Timer A设置的有效位         */
#define TIMER_EVENT_POS_EDGE    	0x00000000                          /*  计数上升沿                  */
#define TIMER_EVENT_NEG_EDGE    	0x00000404                          /*  计数下降沿                  */
#define TIMER_EVENT_BOTH_EDGES  	0x00000C0C                          /*  计数双边沿                  */
#define TIMER_CTL_TAEN          	0x00000001                          /*  TimerA使能                  */
#define TIMER_CAPA_MATCH        	0x00000002                          /*  捕获A匹配中断               */
#define TIMER_CFG_16_BIT_PAIR   	0x04000000                          /*  两个16位定时器              */
#define TIMER_CFG_A_CAP_COUNT   	0x00000003                          /*  定时器A控制                 */
#define TIMER_TAILR_TAILRL          0x0000FFFF                          /*  16位屏蔽值                  */

#define INT_GPIOA                   16                                  /*  GPIO Port A中断号           */
#define INT_TIMER0A                 35                                  /*  定时器0A中断号              */
#define NVIC_EN0                    0xe000e100                          /*  中断使能寄存器              */

#define GPIO_O_DR2R                 0x00000500                          /*  选择2ma驱动电流             */
#define GPIO_O_ODR             	    0x0000050C                          /*  开漏选择寄存器              */
#define GPIO_O_PUR                  0x00000510                          /*  上拉电阻使能寄存器          */
#define GPIO_O_DEN                  0x0000051C                          /*  数字输入使能寄存器          */
#define GPIO_O_DIR				    0x00000400                          /*  数据方向寄存器	            */
#define GPIO_O_AFSEL                0x00000420                          /*  模式控制寄存器              */
#define GPIO_O_DATA                 0x00000000                          /*  数据寄存器                  */
#define GPIO_PORTB_BASE             0x40005000                          /*  GPIO B 口的基地址           */
#define GPIO_PORTD_BASE             0x40007000                          /*  GPIO D 口的基地址           */
#define LED1                        0x00000040                          /*  定义LED1:PB6                */
#define KEY1			            0X00000010                          /*  定义KEY1:PD4		        */
													   
/*********************************************************************************************************
** Function name:           CPUcpsie	   
** Descriptions:            使能总中断               
** input parameters:        无
** output parameters:       无      
** Returned value:          无	 
** Created By:              Ni Likao 倪力考
** Created date:            2007.09.17
**--------------------------------------------------------------------------------------------------------
** Modified by:            
** Modified date:           
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
__asm void  CPUcpsie (void)
{
    CPSIE   I
    BX LR
}

/*********************************************************************************************************
** Function name:           Timer0A_ISR	  
** Descriptions:            定时器0中断处理程序。工作在16位输入边沿计数模式。			 
**                          说明:用KEIL软件时,在Startup.S中添加该中断函数名		  
** input parameters:        无。	   
** output parameters:       无。	 
** Returned value:          无
** Created By:              Ni Likao 倪力考
** Created date:            2007.09.20
**--------------------------------------------------------------------------------------------------------
** Modified by:            
** Modified date:           
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void Timer0A_ISR (void)
{
    HWREG(TIMER0_BASE + TIMER_O_ICR) = TIMER_CAPA_MATCH; 			    /*  清除定时器0中断             */
    HWREG(TIMER0_BASE + TIMER_O_TAILR) = TIMER_TAILR_TAILRL & 0x0a;	    /*  设置定时器的初值            */
    HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (LED1 << 2))) = 
	     (HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (LED1 << 2))) ^ LED1);
			                                                            /*  翻转GPIO PD7 端口           */
    HWREG(TIMER0_BASE + TIMER_O_CTL) |= TIMER_A & (TIMER_CTL_TAEN);     /*  使能定时器0                 */
}

/*********************************************************************************************************
** Function name:           main	   
** Descriptions:            该范例程序演示了如何使用定时器的16位输入边沿计数模式。定时器0A被设置为下降沿			  
**                          计数模式。每个中断处理器在每一次中断时都翻转一次相应的GPIO(PD4端口);同时,
**                          LED指示灯会指示每次中断。
**                          在本范例中,定时器0被设置为16位的可编程输入边沿计数模式.
** input parameters:        无
** output parameters:       无      
** Returned value:          无	 
** Created By:              Ni Likao 倪力考
** Created date:            2007.09.20
**--------------------------------------------------------------------------------------------------------
** Modified by:            
** Modified date:           
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
int  main (void)
{                 
    unsigned char i;
    HWREG(SYSCTL_RCGC1) |= SYSCTL_PERIPH_TIMER0 & 0x0fffffff;	        /*  使能定时器0外设             */
    HWREG(SYSCTL_RCGC2) |= SYSCTL_PERIPH_GPIOB & 0x0fffffff;	        /*  使能GPIO外设                */
    HWREG(SYSCTL_RCGC2) |= SYSCTL_PERIPH_GPIOD & 0x0fffffff;	        /*  使能GPIO外设                */
    for (i = 10; i > 0; i--) {
        ;
    }
    CPUcpsie();												            /*  使能全局中断                */
    /* 
     *  设置连接LED1的PD7为输出   
     */
    HWREG(GPIO_PORTB_BASE + GPIO_O_DIR) |= LED1;				        /*  PB6为输出口                 */
    HWREG(GPIO_PORTB_BASE + GPIO_O_AFSEL) &= ~LED1;			            /*  PB6为GPIO功能               */
    HWREG(GPIO_PORTB_BASE + GPIO_O_DR2R) |= LED1;						/*  PB6的驱动电流为2mA          */ 
    HWREG(GPIO_PORTB_BASE + GPIO_O_ODR) |= LED1;                        /*  设置PB6为PULL_PUSH模式      */ 
    HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (LED1 << 2))) = ~LED1;	    /*  点亮LED1                    */
    /*  
     *  设置连接KEY1的PD4为输入    
     */
    HWREG(GPIO_PORTD_BASE + GPIO_O_ODR) &= ~KEY1;                       /*  PD4为输入口                 */
    HWREG(GPIO_PORTD_BASE + GPIO_O_AFSEL) |= KEY1;                      /*  PD4为CCP0输入               */
    HWREG(GPIO_PORTD_BASE + GPIO_O_DEN) |= KEY1;				        /*  数字输入使能                */
    HWREG(GPIO_PORTD_BASE + GPIO_O_PUR) |= KEY1;				        /*  上拉选择	                */

    HWREG(TIMER0_BASE + TIMER_O_CTL) &= ~(TIMER_CTL_TAEN);	            /*  禁止定时器                  */
    HWREG(TIMER0_BASE + TIMER_O_CFG) |= TIMER_CFG_16_BIT_PAIR>>24;      /*  GPTM配置为:16位定时器配置   */
 
    HWREG(TIMER0_BASE + TIMER_O_TAMR) |= TIMER_CFG_A_CAP_COUNT & 255;   /*  设置为捕获模式              */
    HWREG(TIMER0_BASE + TIMER_O_CTL) |= TIMER_EVENT_NEG_EDGE;           /*  设置为下降沿                */
    HWREG(TIMER0_BASE + TIMER_O_TAILR) = TIMER_TAILR_TAILRL & 10;       /*  设置定时器匹配初值为10      */
    HWREG(TIMER0_BASE + TIMER_O_TAMATCHR) = 6;                          /*  设置定时器匹配值为6         */
    HWREG(TIMER0_BASE + TIMER_O_IMR) |= TIMER_CAPA_MATCH;               /*  设置定时器为捕获匹配中断    */ 
    HWREG(TIMER0_BASE + TIMER_O_CTL) |= (TIMER_A & TIMER_CTL_TAEN);     /*  使能定时器0                 */
    HWREG(NVIC_EN0) |= 1<<(INT_TIMER0A - INT_GPIOA);			        /*  使能Timer0A中断(中断号为19) */
    while (1) {
        ;
    }
}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -