ARM-TIMER使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/J_1234567890/article/details/51045859

使用TIMER的寄存器配置

void Timer_Init(Timer_Base_TypeDef timer_base)
{
    U8 timerx = timer_base.timerx;
    //Timer input clock Frequency = PCLK / {prescaler value+1} / {divider value}
    //{prescaler value} = 0~255
    //{divider value} = 2, 4, 8, 16

    /*根据选择的timer0~4进行不同bit位的预分频设置*/
    if (timer_base.timerx == TIMER0 || timer_base.timerx == TIMER1)
    {//TCFG0-bit[7,0]for Timer 0 and 1.
        TCFG0 &= ~0xff;
        TCFG0 |= timer_base.prescaler;
    }
    else if (timer_base.timerx == TIMER2 \
             || timer_base.timerx == TIMER3 \
             || timer_base.timerx == TIMER4 )
    {//TCFG0-bit[15,8]for Timer 2 and 3 and 4.
        TCFG0 &= ~0xff00;
        TCFG0 |= (timer_base.prescaler << 8);
    }

    /*配置分频系数*/
    //timer_base.timerx在这里用于控制多少位
    TCFG1 &= ~(0xf << (timer_base.timerx * 4));
    TCFG1 |= (timer_base.mux << (timer_base.timerx * 4));

    /*定时器的初值配置*/
    switch(timerx)
    {
        case TIMER0:
            TCNTB0 = timer_base.timer_count ;
            break;
        case TIMER1:
            TCNTB1 = timer_base.timer_count ;
            break;
        case TIMER2:
            TCNTB2 = timer_base.timer_count ;
            break;
        case TIMER3:
            TCNTB3 = timer_base.timer_count ;
            break;
        case TIMER4:
            TCNTB4 = timer_base.timer_count ;
            break;
        default:
            ;
    } 

    /*配置自动重载功能TCON[3],[11],[15],[19],[22]*/
    if(timer_base.timerx == TIMER0)
    {
        TCON &= ~(1<<3);
        TCON |= (timer_base.isAutoload<<3);

        /*开启定时器*/ 
        TCON |= (1<<1);//update
        TCON |= (1<<0);//start
        TCON &= ~(1<<1);//clear
    }
    else if(timer_base.timerx == TIMER4)
    {
        TCON &= ~(1<<22);
        TCON |= (timer_base.isAutoload<<22);

        /*开启定时器*/ 
        TCON |= (1<<21);//update
        TCON |= (1<<20);//start
        TCON &= ~(1<<21);//clear
    }
    else
    {
        TCON &= ~(1<<(timer_base.timerx*4+7));
        TCON |= (timer_base.isAutoload<<(timer_base.timerx*4+7));

        /*开启定时器*/ 
        TCON |= (1<<(timer_base.timerx*4+5));//update
        TCON |= (1<<(timer_base.timerx*4+4));//start
        TCON &= ~(1<<(timer_base.timerx*4+5));//clear
    }
}

void Timer_SetCount(Timerx_TypeDef timerx,U16 count)
{
    /*定时器计数值更新*/
    switch(timerx)
    {
        case TIMER0:
            TCNTB0 = count;
            break;
        case TIMER1:
            TCNTB1 = count;
            break;
        case TIMER2:
            TCNTB2 = count;
            break;
        case TIMER3:
            TCNTB3 = count;
            break;
        case TIMER4:
            TCNTB4 = count;
            break;
        default:
            ;
    } 
}

U16 Timer_GetCount(Timerx_TypeDef timerx)
{
    /*获取当前的计数值*/
    U16 count;
    switch(timerx)
    {
        case TIMER0:
             count = TCNTO0;
            break;
        case TIMER1:
             count = TCNTO1;
            break;
        case TIMER2:
             count = TCNTO2;
            break;
        case TIMER3:
             count = TCNTO3;
            break;
        case TIMER4:
             count = TCNTO4;
            break;
        default:
            ;
    }  
  return count;  
}

头文件定义

#define Timer_Prescaler_Typedef U8  //预分频变量
#define AUTO_LOAD_ENABLE   1        //自动重载使能
#define AUTO_LOAD_DISABLE  0

/*timer0~4*/
typedef enum
{
    TIMER0 = 0,
    TIMER1,
    TIMER2,
    TIMER3,
    TIMER4
}Timerx_TypeDef;

/*定时器分频系数*/
typedef enum
{
    TIM_MUX_2 = 0,
    TIM_MUX_4,
    TIM_MUX_8,
    TIM_MUX_16    
}Timer_MUX_TypeDef;

/*封装成结构体,提高代码移植性*/
typedef struct
{
    Timerx_TypeDef timerx;
    Timer_Prescaler_Typedef prescaler;
    Timer_MUX_TypeDef mux;
    U16 timer_count;
    U8 isAutoload;
}Timer_Base_TypeDef;

extern void Timer_Init(Timer_Base_TypeDef timer_base);
extern void Timer_SetCount(Timerx_TypeDef timerx,U16 count);
extern U16 Timer_GetCount(Timerx_TypeDef timerx);
extern void Timer_msDelay(U32 ms);

寄存器定义

/*TIMER*/
#define TCFG0           (*(volatile unsigned *)(0x51000000))
#define TCFG1           (*(volatile unsigned *)(0x51000004))
#define TCON            (*(volatile unsigned *)(0x51000008))
#define TCNTB0          (*(volatile unsigned *)(0x5100000C))    
#define TCMPB0          (*(volatile unsigned *)(0x51000010))
#define TCNTO0          (*(volatile unsigned *)(0x51000014))
#define TCNTB1          (*(volatile unsigned *)(0x51000018))    
#define TCMPB1          (*(volatile unsigned *)(0x5100001C))
#define TCNTO1          (*(volatile unsigned *)(0x51000020))    
#define TCNTB2          (*(volatile unsigned *)(0x51000024))    
#define TCMPB2          (*(volatile unsigned *)(0x51000028))
#define TCNTO2          (*(volatile unsigned *)(0x5100002C)) 
#define TCNTB3          (*(volatile unsigned *)(0x51000030))    
#define TCMPB3          (*(volatile unsigned *)(0x51000034))
#define TCNTO3          (*(volatile unsigned *)(0x51000038))        
#define TCNTB4          (*(volatile unsigned *)(0x5100003C))    
#define TCNTO4          (*(volatile unsigned *)(0x51000040))  

<以上代码本人均已测试过,希望能对有需要的人有所帮助,有错误的地方还请多多指教>

猜你喜欢

转载自blog.csdn.net/J_1234567890/article/details/51045859
今日推荐