专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

ARM LPC2103定时器中断方式寄存器设置

作者:huqin   来源:本站原创   点击数:  更新时间:2014年09月02日   【字体:

定时器查询方式定时器初始化:

 

1、设置定时器分频数,为(x+1)分频

2、匹配通道X中断并复位TxTC

3、比较值(1S定时值)

4、启动并复位TxTC

 

如:

       T1PR = 99;                             // 设置定时器0分频为100分频,得110592Hz

       T1MCR = 0x03;                        // 匹配通道0匹配中断并复位T0TC

       T1MR0 = 110592/2;                 // 比较值(1S定时值)

       T1TCR = 0x03;                        // 启动并复位T0TC

       T1TCR = 0x01;

 

 

   研究了好长一段时间,LPC210X的定时器,查询方式定时很简单如上面,但中断方式要操作好多寄存器,太麻烦,一直是一头雾水。好不容易理出了思路,现将一段例程粘贴备忘。

 
#include <intrinsics.h>
#include <stdio.h>
#include <iolpc2103.h>
// OSC [Hz]
#define FOSC            11059200UL
// Core clk [Hz]
#define FCCLK           FOSC
// Per clk [Hz]
#define PCCLK           (FOSC/4)
// Timer tick per second
#define TICK_PER_SEC    (4UL)
#define TIM_PER_S(Val)  (PCCLK/Val)
#define MAX_TICK_PER    TIM_PER_S(20)
#define MIN_TICK_PER    TIM_PER_S(5)
// Timer Delta period [ms]
#define DELTA_PER       (50UL)
#define TIM_DPER        ((PCCLK*DELTA_PER)/1000UL)
#define LED_MASK        1<<18
/*************************************************************************
 * 函数名称:irq_handler
 * 入口参数:无
 * 返回参数:无
 * 描    述:IRQ handler
 *************************************************************************/
#pragma vector=IRQV
__irq __arm void irq_handler (void)
{
void (*interrupt_function)();
unsigned int vector;
  vector = VICVectAddr;     //获得中断向量
  interrupt_function = (void(*)())vector;
  if(interrupt_function != NULL)
  {
    interrupt_function();  //调用中断指向的函数
  }
  else
  {
    VICVectAddr = 0;      //清除在VIC中的中断
  }
}
/*************************************************************************
* 函数名称: Timer0Handler
 * 入口参数: 无
 * 返回参数: 无
 * 说    明: Timer 0 handler  
*************************************************************************/
void Timer0Handler (void)
{
  // clear interrupt flag
  T0IR_bit.MR0INT = 1;
  // Change patern
  if ((IOSET & LED_MASK) == 0)
    IOSET = LED_MASK;      //关闭LED
  else
    IOCLR = LED_MASK;
  //pNextPattern = pNextPattern->pNextPattern;        //调整当前的链表
  VICVectAddr = 0;
}
/*************************************************************************
 * 函数名称: VicInit
 * 入口参数: 无
 * 返回参数: 无
 * 说    明: Init VIC module
 *************************************************************************/
void VicInit (void)
{
  // Assign all interrupt chanels to IRQ
  VICIntSelect  =  0;
  // Diasable all interrupts
  VICIntEnClear = 0xFFFFFFFF;
  // Clear all software interrutps
  VICSoftIntClear = 0xFFFFFFFF;
  // VIC registers can be accessed in User or privileged mode
  VICProtection = 0;
  // Clear interrupt
  VICVectAddr = 0;
  // Clear address of the Interrupt Service routine (ISR) for non-vectored IRQs.
  VICDefVectAddr = 0;
  // Clear address of the Interrupt Service routine (ISR) for vectored IRQs.
  VICVectAddr0  = VICVectAddr1  = VICVectAddr2  = VICVectAddr3  =\
  VICVectAddr4  = VICVectAddr5  = VICVectAddr6  = VICVectAddr7  =\
  VICVectAddr8  = VICVectAddr9  = VICVectAddr10 = VICVectAddr11 =\
  VICVectAddr12 = VICVectAddr13 = VICVectAddr14 = VICVectAddr15 = 0;
  // Disable all vectored IRQ slots
  VICVectCntl0  = VICVectCntl1  = VICVectCntl2  = VICVectCntl3  =\
  VICVectCntl4  = VICVectCntl5  = VICVectCntl6  = VICVectCntl7  =\
  VICVectCntl8  = VICVectCntl9  = VICVectCntl10 = VICVectCntl11 =\
  VICVectCntl12 = VICVectCntl13 = VICVectCntl14 = VICVectCntl15 = 0;
}
/*************************************************************************
 * 函数名称: Init_timer0
 * 入口参数: 无
 * 返回参数: 无
 * 说    明: Init tiner0
 *************************************************************************/
void Init_timer0(void)
{
/*
  // Init timer
  // Reset and stop timer0
  T0TCR = 2;
  // Set timer counters mode - clock by PCLK
  T0CTCR = 0;
  // Set timer prescaler
  T0PR  = 0;
  // Set timer period
  T0MR0 = PCCLK/TICK_PER_SEC;
  // Set mack action - interrupt by MACH0 enable, reset counter
  T0MCR = 3;
  // No external action
  T0EMR = 0;
 */
  T0TCR = 2;
  T0CTCR = 0;
  T0PR = 0;
  T0MR0 = PCCLK/TICK_PER_SEC;
  T0MCR = 3;
  T0EMR = 0;
 
  // Assign to IRQ
  VICIntSelect_bit.TIMER0 = 0;
  // Set interrupt slots
  VICVectAddr0 = (unsigned int) Timer0Handler;
  VICVectCntl0_bit.NUMBER = VIC_TIMER0;
  VICVectCntl0_bit.ENABLED = 1;
  // Timer 0 interrupt enable
  VICIntEnable_bit.TIMER0 = 1;
  // Enable timer0
  T0TCR = 1;
}
/*************************************************************************
 * 函数名称: Init_Gpio
 * 入口参数: 无
 * 返回参数: 无
 * 说    明: Init GPIO
 *************************************************************************/
void Init_Gpio(void)
{
    // Init GPIO
  PINSEL0 = PINSEL1 = 0;
  // Disable fast IO
  SCS_bit.GPIO0M = 0;
 
  // Set pins connect to LEDs as outputs
  IODIR = LED_MASK;
  // All LEDs off
  IOCLR = LED_MASK;
}
/*************************************************************************
 * 函数名称: Init_pll
 * 入口参数: 无
 * 返回参数: 无
 * 说    明: Init PLL
 *************************************************************************/
void Init_pll(void)
{
  // Disable PLL
  PLLCON = 0;
  // Write Feed
  PLLFEED = 0xAA;
  PLLFEED = 0x55;
  // Set periphery divider /4
  APBDIV_bit.APBDIV  = 0;
  // Set MAM fully enable
  MAMCR_bit.MODECTRL = 0;
  MAMTIM_bit.CYCLES  = 3;
  MAMCR_bit.MODECTRL = 2;
}
/*************************************************************************
 * 函数名称: main
 * 入口参数: 无
 * 返回参数: 无
 * 描    述: main
 *************************************************************************/
void main(void)
{
  Init_pll();
  // Memory map init flash memory is maped on 0 address
#ifdef FLASH
  MEMMAP_bit.MAP = 1;
#else
  MEMMAP_bit.MAP = 2;
#endif
  __disable_interrupt();
  VicInit();
  Init_Gpio();
  Init_timer0();
  __enable_interrupt();
  while(1)
  {};
}
关闭窗口