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

📄 time320s_per_reg.c

📁 EasyARM615在IAR上的实验源代码
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http://www.embedtools.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name:           time32os_per_reg.c
** Last modified Date:  2008.01.18 
** Last Version:        v1.0
** Description:         Stellaris系列单片机的定时器的相关寄存器操作例程
**                      在本范例中,定时器0被设置为32位的可编程周期触发模式。
** 
**------------------------------------------------------------------------------------------------------
** Created By:          Kang qinhua
** Created date:        2008.01.18 
** Version:             v1.0
** Descriptions:        定时器被设置为每秒产生2次中断,
**                      每个中断处理器在每一次中断时都翻转一次相应的GPIO端口
**
**------------------------------------------------------------------------------------------------------
** 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 D 在系统控制器中的地址

#define TIMER_CFG_32_BIT_OS      0x00000001  	// 32-bit one-shot timer
#define TIMER0_BASE              0x40030000  	// Timer0的基地址
#define TIMER_O_CTL              0x0000000C  	// GPTM控制寄存器
#define TIMER_O_CFG              0x00000000  	// GPTM配置寄存器
#define TIMER_O_TAMR             0x00000004  	// GPTM TimeA模式寄存器
#define TIMER_O_IMR              0x00000018  	// GPTM中断屏蔽寄存器
#define TIMER_O_ICR              0x00000024  	// GPTM中断清零寄存器
#define TIMER_O_TAILR            0x00000028  	// TimerA 间隔装载复位值

#define TIMER_CFG_32_BIT_PER    0x00000002  	// 32位周期触发模式
#define TIMER_CTL_TAEN          0x00000001  	// TimerA 使能
#define TIMER_A                 0x000000ff  	// Timer A设置的有效位
#define TIMER_TIMA_TIMEOUT     	0x00000001  	// TimerA 超时中断
#define TIMER_INT_DATA          15000000    	// TimerA定时初始值

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

#define GPIO_O_DIR				0x00000400		// 数据方向寄存器
#define GPIO_O_AFSEL			0x00000420		// 模式控制寄存器
#define GPIO_O_DATA				0x00000000		// 数据寄存器
#define GPIO_PORTD_BASE			0x40007000		// GPIO D 口的基地址
#define PINS1					0x00000080		// 定义LED1

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

//-----------------------------------------------------------------------------------------------------------------------
// 函数名称  Timer0A_ISR
// 函数功能  定时器0中断处理程序。工作在32位周期触发模式下。
// 说明  用KEIL软件时,在Startup.S中添加该中断函数名
// 输入参数  无。
// 输出参数  无。
//-----------------------------------------------------------------------------------------------------------------------
void Timer0A_ISR(void)
{
    HWREG(TIMER0_BASE + TIMER_O_ICR) = TIMER_TIMA_TIMEOUT; 	// 清除定时器0中断。

    HWREG(GPIO_PORTD_BASE + (GPIO_O_DATA + (PINS1 << 2))) = 
				(HWREG(GPIO_PORTD_BASE + (GPIO_O_DATA + (PINS1 << 2))) ^ PINS1);
                                                          	// 翻转GPIO D7 端口。
    HWREG(TIMER0_BASE + TIMER_O_CTL) |= TIMER_A & (TIMER_CTL_TAEN);
 															// 使能定时器0。
}

//-----------------------------------------------------------------------------------------------------------------------
// 该范例程序演示了如何使用定时器产生周期性中断。定时器设置为每秒产生两次中断;
// 每个中断处理器在每一次中断时都翻转一次相应的GPIO(D7端口);
// 同时,LED指示灯会指示每次中断以及中断的速率。
// 在本范例中,定时器0被设置为32位的可编程周期触发模式
//-----------------------------------------------------------------------------------------------------------------------
int  main(void)
{                 
  //使能定时器0外设
  HWREG(SYSCTL_RCGC1) |= SYSCTL_PERIPH_TIMER0 & 0x0fffffff;

  // 使能GPIO PD口
  HWREG(SYSCTL_RCGC2) |= SYSCTL_PERIPH_GPIOD & 0x0fffffff;	//使能GPIO外设

  // 设置连接LED1的PD7为输出
  HWREG(GPIO_PORTD_BASE + GPIO_O_DIR) |= PINS1;				// 设置连接LED1的PD7为输出
  HWREG(GPIO_PORTD_BASE + GPIO_O_AFSEL) &= ~PINS1;			//PD7为GPIO功能
  HWREG(GPIO_PORTD_BASE + (GPIO_O_DATA + (PINS1 << 2))) = ~PINS1;	//点亮LED1

  //Timer0中断配置
  HWREG(TIMER0_BASE + TIMER_O_CTL) &= ~(TIMER_CTL_TAEN );	//向GPTM中配置0
  HWREG(TIMER0_BASE + TIMER_O_CFG) = TIMER_CFG_32_BIT_OS >> 24;	
															//GPTM配置为:32位定时器配置
  HWREG(TIMER0_BASE + TIMER_O_TAMR) = TIMER_CFG_32_BIT_PER & 255;	
															//设置为周期触发模式
  HWREG(TIMER0_BASE + TIMER_O_TAILR) = TIMER_INT_DATA/4;	//设置定时器的初值
  HWREG(TIMER0_BASE + TIMER_O_IMR) |= TIMER_TIMA_TIMEOUT;	
  															// 设置定时器为溢出中断。
  HWREG(TIMER0_BASE + TIMER_O_CTL) |= TIMER_A & (TIMER_CTL_TAEN);	
															// 使能定时器0
  HWREG(NVIC_EN0) = 1<<(INT_TIMER0A-INT_GPIOA);				//使能Timer0a中断(中断号为19)
  CPUcpsie();												//使能全局中断 
  while(1);
//  return 0;
}

⌨️ 快捷键说明

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