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作为参照

在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

更多资料可以转步我的个人网站 www.eestr.com ( https://www.eestr.com)或者 Github[https://github.com/YGZone], 欢迎访问

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YGZone

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值