• <i id="jb6ye"><bdo id="jb6ye"></bdo></i>
    1. <b id="jb6ye"><bdo id="jb6ye"><tr id="jb6ye"></tr></bdo></b><tt id="jb6ye"><tr id="jb6ye"><dfn id="jb6ye"></dfn></tr></tt><track id="jb6ye"><big id="jb6ye"></big></track>
    2. 专注电子技术学习与研究
      当前位置:单片机教程网 >> 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)
        {};
      }
      关闭窗口
      68日本xxxxxxxxx,水萝拉日语中字在线,德国videos高清,欧美色图片 网站地图