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

📄 time_16_count_reg.c

📁 EasyARM615的KEIL下的调试程序,包含IO口,串口,SPI口等
💻 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-04-25 
** Last Version: v1.0
** Description: Stellaris系列单片机定时器0口寄存器操作
** 				使用定时器实现输入边沿计数并产生中断
**------------------------------------------------------------------------------------------------------
** Created By: Pan Yi Fei
** Created date: 2007-04-25 
** 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

/*使能全局中断*/
__asm void  CPUcpsie(void)
{
	  CPSIE   I
	  BX LR
}

//-----------------------------------------------------------------------------------------------------------------------
// 函数名称  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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -