(一)定时器基本功能解析
在用户手册中我们可以看到MSP432P401R的两种定时器,分别是Timer32定时器和TAx定时器,在此依次对其进行介绍,最后使用TA定时器进行工程实战。
(1)TA定时器
Usermanual中的介绍为:
解释为:TimerA定时器是一个16位的定时计数器,每个定时器有7路比较寄存器,支持捕获,比较,定时,PWM等模式,支持中断,可在中断中判断7路比较寄存器中哪个产生中断。
主要寄存器就是配置寄存器,CNT计数器,频率基准,CCR各路比较值寄存器等等,这些寄存器一般是Timer外设通用的。
(2)Timer32定时器
首先看Usermanula的介绍:
解释为:Timer32是一个可以分割为两个16位定时/计数器的定时器,可以在计数/定时值达到预定时产生中断。
从用户手册中的介绍得知这个Timer32定时计数器是一个32/16的定时计数器,功能比较单一,在后边的例子中不使用他进行定时计数。
(二)TimerA的定时器中断Demo
按照一般的配置流程,Timer的配置一般有如下几步,此步骤可适用于任何单片机:
(1)初始化引脚状态,配置时钟频率,分频系数,定时计数器模式,计数值,中断状态
(2)初始化中断状态,配置好中断函数,开启总中断;
(3)在中断函数中清除中断标志,清除Timer的数值(有些可以自动清除)
(1)以Demo作为参照
在Driver Lib中打开TimerA的中断例子,如下:
中文翻译为: Timer A 溢出中断例程
打开keil工程,在main函数上方有如下说明:
显然这又是一个点灯工程。
然后下边就是初始化,main函数以及中断函数,在此直接略过,值得关注的是TI的中断函数如下;
编译下载后板子上LED不会闪烁,原因是TI的中断函数出现问题,工程师在写这个例子没有想到清除中断后需要清除Timer的计数,导致数值一直溢出,会卡死在中断,下边我写的工程中会纠正这个错误
(2)Timer中断延时闪烁LED例程
首先需要初始化Timer,参照TI驱动工程:
在此之前需要初始化总线频率如下:
/*
MCLK = 48MHz
ACLK = 32.768KHz
HSMCLK = 24MHz
SMCLK = 12MHz
BCLK = 32.768KHz
*/
然后首先需要配置定时器:
/* Application Defines */
#define TIMER_PERIOD 25000
/* Timer_A UpMode Configuration Parameter */
const Timer_A_UpModeConfig upConfig =
{
TIMER_A_CLOCKSOURCE_SMCLK, // SMCLK Clock Source
TIMER_A_CLOCKSOURCE_DIVIDER_48, // SMCLK/48 = 250KHz 1/250000 = 0.000004s = 0.004ms = 4us
TIMER_PERIOD, // 25000 tick period = 100ms
TIMER_A_TAIE_INTERRUPT_DISABLE, // Disable Timer interrupt
TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE , // Enable CCR0 interrupt
TIMER_A_DO_CLEAR // Clear value
};
在这里我们使用SMCLK作为时钟频率,然后计算好延时时间即可,计算方法在注释中已经给出:
然后在总线频率初始化完成后配置定时器Timer A,我使用定时器A3进行配置:
//配置定时器TIMER_A0
Timer_A_configureUpMode(TIMER_A3_BASE,&upConfig);
//开中断 使能定时器
//Interrupt_enableSleepOnIsrExit();//退出中断进入低功耗模式 没必要
Interrupt_enableInterrupt(INT_TA3_0);
Timer_A_startCounter(TIMER_A3_BASE, TIMER_A_UP_MODE);
// //开中断控制器
Interrupt_enableMaster();
注册中断函数:
/* Timer A3 IRQ Hander */
void TA3_0_IRQHandler(void)
{
LED_TOGGLE;
Timer_A_clearCaptureCompareInterrupt(TIMER_A3_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_0);//清除中断状态
Timer_A_clearTimer(TIMER_A3_BASE);//清除定时器计数
}
在中断函数中必须清除计数器计数以及中断,否则会导致单片机卡死,使用上边的函数即可
编译下载即可;
在while中没有程序,这个例子运行在中断状态下,下载后可以看到LED的闪烁频率为200ms(一亮一灭);
克隆空白工程请使用 git , 如果你觉得还不错欢迎点亮 star !
git clone https://github.com/YGZone/Design-a-car-with-MSP432P401R.git