msp432快速入门第七节之定时器中断

(一)定时器基本功能解析

在用户手册中我们可以看到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作为参照

编译下载后板子上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(一亮一灭);

经验分享 程序员 微信小程序 职场和发展