ARM-TIMER使用

使用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))  

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值