版权声明:本文为博主原创文章,未经博主允许不得转载。 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))
<以上代码本人均已测试过,希望能对有需要的人有所帮助,有错误的地方还请多多指教>