打印
[NUC120]

nuc120开发板学习之定时器中断方式实现每秒输出数字加1

[复制链接]
2897|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mtxmxt|  楼主 | 2011-8-16 10:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 缥缈九哥 于 2012-9-14 12:07 编辑

上次用软件延时实现了LED灯的渐亮渐暗,用软件延时的实际用处不大,故开始定时器的学习。准备实现利用定时器中断方式实现每秒输出数字加1。

相关帖子

沙发
mtxmxt|  楼主 | 2011-8-16 10:59 | 只看该作者
上传定时器的学习笔记

定时器学习笔记.rar (245 KB)

使用特权

评论回复
板凳
mtxmxt|  楼主 | 2011-8-16 11:01 | 只看该作者
程序源码

/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
#include <stdio.h>

/*---------------------------------------------------------------------------------------------------------*/
/*  Include hear file                                                                                                          */
/*---------------------------------------------------------------------------------------------------------*/

#include "NUC1xx.h"
#include "DrvGPIO.h"

/*----------------------------------------------------------------------------
  Define variable
  ----------------------------------------------------------------------------*/
        static uint32_t TimerCOUN=0;
/*----------------------------------------------------------------------------
  Function subroutine
  ----------------------------------------------------------------------------*/
void Delay(uint32_t delayCnt)
{
    while(delayCnt--)
    {
        __NOP();
        __NOP();
    }
}
uint32_t GetTDR(void)
{
        return         TIMER0->TDR;
}
/*----------------------------------------------------------------------------
  Interrupt subroutine
  ----------------------------------------------------------------------------*/
void TMR0_IRQHandler(void) // Timer0 interrupt subroutine
{
        TIMER0->TISR.TIF =1;
        TimerCOUN++;          
}
/*----------------------------------------------------------------------------
  MAIN function
  ----------------------------------------------------------------------------*/
int32_t main (void)
{
        uint32_t TEMP=0;

        /* SYSCLK =>12Mhz*/
        UNLOCKREG();
    SYSCLK->PWRCON.XTL12M_EN = 1;
        LOCKREG();
        /*set GPI0 output*/
        DrvGPIO_Open(E_GPA,2, E_IO_OUTPUT);       
        DrvGPIO_Open(E_GPA,3, E_IO_OUTPUT);
        DrvGPIO_Open(E_GPA,4, E_IO_OUTPUT);
        DrvGPIO_Open(E_GPA,5, E_IO_OUTPUT);
  
        NVIC_DisableIRQ(TMR0_IRQn);        //Disable Timer0 interrupt
        outpw(&TIMER0->TCSR ,0 );        //Disable Timer0                              

        /* Step 1. Enable and Select Timer clock source */         
        SYSCLK->CLKSEL1.TMR0_S = 7;        //Select 22Mhz for Timer0 clock source                
    SYSCLK->APBCLK.TMR0_EN =1;        //Enable Timer0 clock source

        /* Step 2. Select Operation mode */       
        TIMER0->TCSR.MODE=1;                //Select periodic mode for operation mode

        /* Step 3. Select Time out period = (Period of timer clock input) * (8-bit Prescale + 1) * (24-bit TCMP)*/
        TIMER0->TCSR.PRESCALE=0;        // Set Prescale [0~255]
        TIMER0->TCMPR = 2765;                // Set TCMPR [0~16777215]
                                                                // (1/22118400)*(0+1)*(2765)= 125.01usec or 7999.42Hz

        /* Step 4. Enable interrupt */
        TIMER0->TCSR.IE = 1;
        TIMER0->TISR.TIF = 1;                //Write 1 to clear for safty               
        NVIC_EnableIRQ(TMR0_IRQn);        //Enable Timer0 Interrupt

        /* Step 5. Enable Timer module */
        TIMER0->TCSR.CRST = 1;                //Reset up counter
        TIMER0->TCSR.CEN = 1;                //Enable Timer0

          TIMER0->TCSR.TDR_EN=1;                // Enable TDR function

        while(1)
        {
                        if (TimerCOUN>8000)         //Wait 1 seconds
                        {
                                TEMP++;
                                 TimerCOUN=0;
                        DrvGPIO_SetPortBits(E_GPA, ~(TEMP<<2));       

                        }
        }
}

使用特权

评论回复
地板
mtxmxt|  楼主 | 2011-8-16 11:02 | 只看该作者
上传工程文件

定时器中断方式实现每秒输出数字加1.rar (548.29 KB)

使用特权

评论回复
5
lixiaoxu2meng| | 2011-8-16 11:03 | 只看该作者
顶一个

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

87

帖子

0

粉丝