time_16_count_reg.c

来自「EasyARM615在IAR上的实验源代码」· C语言 代码 · 共 130 行

C
130
字号
/****************************************Copyright (c)**************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http://www.embedtools.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name:           time_16_count_reg.c
** Last modified Date:  2008.01.18 
** Last Version:        v1.0
** Description:         Stellaris系列单片机定时器0口寄存器操作
** 				        使用定时器实现输入边沿计数并产生中断
**------------------------------------------------------------------------------------------------------
** Created By:          Kang qinhua
** Created date:        2008.01.18
** 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                          // 运行-模式时钟门控控制12
#define SYSCTL_PERIPH_GPIOD	  		0x20000008                          // GPIO C 在系统控制器中的地址

#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_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_PORTD_BASE        	    0x40007000                          // GPIO C 口的基地址

#define LED1			            0x00000080                          // 定义LED1:PD7
#define KEY1			            0X00000010                          // 定义KEY1:PD4

/*使能全局中断*/
void  CPUcpsie(void)
{
    __asm(
        "cpsie   i  \n"
    );
}

//-----------------------------------------------------------------------------------------------------------------------
// 函数名称  Timer0A_ISR
// 函数功能  定时器0中断处理程序。工作在16位输入边沿计数模式。
// 说明:用KEIL软件时,在Startup.S中添加该中断函数名
// 输入参数  无。
// 输出参数  无。
//-----------------------------------------------------------------------------------------------------------------------
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_PORTD_BASE + (GPIO_O_DATA + (LED1 << 2))) = 
			(HWREG(GPIO_PORTD_BASE + (GPIO_O_DATA + (LED1 << 2))) ^ LED1);
                                                       				    // 翻转GPIO PD7 端口。
    HWREG(TIMER0_BASE + TIMER_O_CTL) |= TIMER_A & (TIMER_CTL_TAEN);     // 使能定时器0。    
}

//-----------------------------------------------------------------------------------------------------------------------
// 该范例程序演示了如何使用定时器的16位输入边沿计数模式。定时器0A被设置为下降沿
// 计数模式。每个中断处理器在每一次中断时都翻转一次相应的GPIO(PD4端口);
// 同时,LED指示灯会指示每次中断。
// 在本范例中,定时器0被设置为16位的可编程输入边沿计数模式.
//-----------------------------------------------------------------------------------------------------------------------
int  main(void)
{                 
  //使能定时器0外设
  HWREG(SYSCTL_RCGC1) |= SYSCTL_PERIPH_TIMER0 & 0x0fffffff;	            //使能定时器0外设	 
  // 使能GPIO PD口
  HWREG(SYSCTL_RCGC2) |= SYSCTL_PERIPH_GPIOD & 0x0fffffff;	            //使能GPIO外设
  CPUcpsie();                                                           // 使能全局中断 
  // 设置连接LED1的PD7为输出
  HWREG(GPIO_PORTD_BASE + GPIO_O_DIR) |= LED1;                          //PD7为输出口		
  HWREG(GPIO_PORTD_BASE + GPIO_O_AFSEL) &= ~LED1;                       //PD7为GPIO功能
  HWREG(GPIO_PORTD_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;                          //上拉选择
  //Timer0B中断配置	  
  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);
} 

⌨️ 快捷键说明

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