一:定时器基础知识
包含2路可编程的32位/16位计数器,即TIMERO/TIMER1,为用户提供便捷的定时计数功能。
二:定时器的基本特征
可配置32位/16位向下计数器。
每个定时器都有独立预分频器。
提供单次触发,周期计数,连续计数三种计数操作模式。
支持芯片从睡眠模式唤醒。
三:功能描述:
3.1 单次触发模式
如果定时器工作在单次触发模式,使能定时器后,计数器从加载寄存器加载初值,向下计数,当计数器递减到O时,停止工作,同时产生中断。若要再次启动单次触发模式,需清零TMROS位,再置位TMROS位。(再次启动单次触发模式时,需注意TMROS位清零时,保持为0的时间须大于一个定时器计数时钟周期)
3.2 周期计数模式
如果定时器工作在周期计数模式,使能定时器后,计数器从加载寄存器加载初值,向下计数,当计数器递减到0时,计数器从加载寄存器加载初值,并继续计数,同时产生中断。
3.3连续计数模式
如果定时器工作在连续计数模式,使能定时器后,计数器从加载寄存器加载初值,向下计数,当计数器递减到O时,计数器加载最大值作为初值,并继续计数,同时产生中断。
3.4 延迟加载功能
当数据写入延迟加载寄存器时,数据在下一个TIMERCLK上升沿写入加载寄存器,若计数器已经开始计数,则会等待当前周期计数为0,再从加载寄存器中加载初值。四:软件代码
void TMR0_Period_Count_Config(void)
{
/*
(1)设置Timer0 的时钟
*/
CGC_PER11PeriphClockCmd(CGC_PER11Periph_TIMER01,ENABLE);/*打开Timer0的时钟*/
TMR_ConfigClk(TMR0,TMR_CLK_DIV_256); /*Timer0设置时钟分频为 1分频*/
/*
(2)设置Timer0 运行模式
*/
TMR_ConfigRunMode(TMR0,TMR_COUNT_PERIOD_MODE, TMR_BIT_16_MODE); /*设置Timer0为16位周期计数模式*/
TMR_DisableOneShotMode(TMR0); /*关闭单次模式*/
/*
(3)设置Timer0 运行周期
*/
TMR_SetPeriod(TMR0,24999); /* 4800*Fclk*/
/*
(4)设置Timer0 中断
*/
TMR_EnableOverflowInt(TMR0);
NVIC_EnableIRQ(TIMER0_IRQn);
/*
(5)设置Timer0 中断优先级
*/
NVIC_SetPriority(TIMER0_IRQn,3);
/*
(5)开启Timer0
*/
TMR_Start(TMR0);
}这里初始化定时器0,实现1S中断进入一次中断,然后在中断中实现LED的电平翻转;void TIMER0_IRQHandler(void)
{
if(TMR_GetOverflowIntFlag(TMR0))
{
PORT_ToggleBit(PORT0,PIN5);
PORT_ToggleBit(PORT0,PIN6);
TMR_ClearOverflowIntFlag(TMR0);
}
}这里使用官方的例程,实现定时器的初始化配置还是蛮方便的,不过就是定时器的分频系数太少,想要实现更多的计时周期,还是需要配置分频系数进行配合
我要赚赏金
