通过数据手册可知,RD8T36P48芯片时钟频率32MHZ,具有5个16位定时器。
首先通过EasyCodeCube选择建立空模板的工程之后,通过keil打开工程进行代码完善。
定时器0基本配置:
void Timer_init()
{
TMOD|=0x01; //选择定时器0模式1
TMCON=0x01; //选择时钟频率(是否/12,当前选择32MHZ)
TL0=(65536-32000)%256;//1ms
TH0=(65536-32000)/256;
ET0=1;//使能Timer0中断
TR0=1;//开启定时器0
EA=1;//开启总中断
}
配置完成之后,中断服务函数在SC_it.c 函数中,可以找到void Timer0Interrupt() interrupt 1 中断服务函数入口。
void Timer0Interrupt() interrupt 1
{
static int count=0;
TL0 = (65536 - 32000) % 256;
TH0 = (65536 - 32000) / 256;
count++;
if(count==1000) //1s定时
{
count=0;
GPIO_TogglePin(GPIO0, GPIO_PIN_0);//翻转P00(先初始化强推挽模式)
}
}
最后可以在拓展板上实现周期2S的LED0闪烁。
定时器1配置:
在定时器0的基础上更改:
TMOD|=0x10; //定时器1模式1
TMCON=0x02;//选择时钟32MHZ
定时器2配置:
定时器2配置有些不同。具体操作如下:
void Timer2_init()
{
TXINX=0x02;//TimerX寄存器组指向T2
TXCON=0x04;//开启定时器2(主要设置TRX位)
TXMOD|=0x80;//设置时钟(32MHZ)
TXMOD&=0xFE;//递增计数模式
TLX=(65536-32000)%256;//初始值
THX=(65536-32000)/256;//1ms
RCAPXH=(65536-32000)/256;//重装载寄存器值
RCAPXL=(65536-32000)%256;
ET2=1;//开启Timer2中断
EA=1;
}
在SC_it.c中找到void Timer2Interrupt() interrupt 5 中断服务函数进行相关配置
static int count=0;
count++;
TFX=0;//需要清除挂起的溢出标志位
if(count==1000)//1s定时
{
count=0;
GPIO_TogglePin(GPIO0, GPIO_PIN_0);
}
在主函数中初始化之后,即可实现用定时器2对LED0的1s闪烁功能。
定时器3以及定时器4操作需要更改TXINX值指向相关寄存器组,这里就不多加赘述了。