增计数模式
用户手册464页
设置捕获比较寄存器 CCR0 的值,定时器增计数到 CCR0 的值时,下一个时钟周期的上升沿到来时会清零,重新计数。这种模式下会发生两种中断
一种是计数值达到 CCR0 时产生 CCR0 中断,另一种是计数值变成 0 时产生定时器中断,由 TAxIV 代理请求。
使用 CCR0 中断
#include "driverlib.h"
#define FRE_DCO 6400 //DCO的频率,单位为KHZ
#define TPR 10000 //定时器的计数周期
//******************************************************************************
//!
//! Empty Project that includes driverlib
//!
//******************************************************************************
void main (void)
{
WDT_A_hold(WDT_A_BASE); //关闭看门狗
PMM_setVCore(3); //提高二次侧电压
UCS_initClockSignal(UCS_FLLREF,UCS_REFOCLK_SELECT,0);//设置FLL的参考时钟信号为REFCLK,1分频
UCS_initFLLSettle(FRE_DCO,FRE_DCO/(32768/1000));//初始化DCO
UCS_initClockSignal(UCS_SMCLK,UCS_DCOCLKDIV_SELECT,0);//选择SMCLK的时钟源为DCOCLKDIV
Timer_A_initUpModeParam upParam={0};
upParam.clockSource=TIMER_A_CLOCKSOURCE_SMCLK;//选择定时器A时钟信号为SMCLK
upParam.timerPeriod=TPR;//设置计数周期
upParam.clockSourceDivider=TIMER_A_CLOCKSOURCE_DIVIDER_64;//定时器对时钟信号64分频
upParam.captureCompareInterruptEnable_CCR0_CCIE=TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE;//使能CCR0中断
upParam.timerClear=TIMER_A_DO_CLEAR;//把定时器的定时计数器,分频计数器的计数值清零
upParam.startTimer=true;//开始时起动定时器
Timer_A_initUpMode(TIMER_A0_BASE,&upParam);//初始化定时器为增计数模式
GPIO_setAsOutputPin(GPIO_PORT_P1,GPIO_PIN0);
volatile uint32_t freS=UCS_getSMCLK();
volatile uint32_t freM=UCS_getMCLK();
__bis_SR_register(GIE);
while(1);
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR (void)
{
__delay_cycles(20);
GPIO_toggleOutputOnPin(GPIO_PORT_P1,GPIO_PIN0);
}
使用定时器中断
#include "driverlib.h"
#define FRE_DCO 6400 //DCO的频率,单位为KHZ
#define TPR 10000 //定时器的计数周期
//******************************************************************************
//!
//! Empty Project that includes driverlib
//!
//******************************************************************************
void main (void)
{
WDT_A_hold(WDT_A_BASE); //关闭看门狗
PMM_setVCore(3); //提高二次侧电压
UCS_initClockSignal(UCS_FLLREF,UCS_REFOCLK_SELECT,0);//设置FLL的参考时钟信号为REFCLK,1分频
UCS_initFLLSettle(FRE_DCO,FRE_DCO/(32768/1000));//初始化DCO
UCS_initClockSignal(UCS_SMCLK,UCS_DCOCLKDIV_SELECT,0);//选择SMCLK的时钟源为DCOCLKDIV
Timer_A_initUpModeParam upParam={0};
upParam.clockSource=TIMER_A_CLOCKSOURCE_SMCLK;//选择定时器A时钟信号为SMCLK
upParam.timerPeriod=TPR;//设置计数周期
upParam.clockSourceDivider=TIMER_A_CLOCKSOURCE_DIVIDER_64;//定时器对时钟信号64分频
upParam.timerInterruptEnable_TAIE=TIMER_A_TAIE_INTERRUPT_ENABLE;//使能定时器中断
upParam.timerClear=TIMER_A_DO_CLEAR;//把定时器的定时计数器,分频计数器的计数值清零
upParam.startTimer=true;//开始时起动定时器
Timer_A_initUpMode(TIMER_A0_BASE,&upParam);//初始化定时器为增计数模式
GPIO_setAsOutputPin(GPIO_PORT_P1,GPIO_PIN0);
volatile uint32_t freS=UCS_getSMCLK();
volatile uint32_t freM=UCS_getMCLK();
__bis_SR_register(GIE);
while(1);
}
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR (void)
{
switch(TA0IV)
{
case TA0IV_TAIFG:
{
__delay_cycles(20);
GPIO_toggleOutputOnPin(GPIO_PORT_P1,GPIO_PIN0);
};
default: break;
}
}
其中 TA0IV_TAIFG 表示定时器中断标志位 TAIFG 的中断。在头文件中定义如下
/* T0A5IV Definitions */
#define TA0IV_NONE (0x0000) /* No Interrupt pending */
#define TA0IV_TACCR1 (0x0002) /* TA0CCR1_CCIFG */
#define TA0IV_TACCR2 (0x0004) /* TA0CCR2_CCIFG */
#define TA0IV_TACCR3 (0x0006) /* TA0CCR3_CCIFG */
#define TA0IV_TACCR4 (0x0008) /* TA0CCR4_CCIFG */
#define TA0IV_5 (0x000A) /* Reserved */
#define TA0IV_6 (0x000C) /* Reserved */
#define TA0IV_TAIFG (0x000E) /* TA0IFG */