MSP432 定时器A中断

MSP432P401R基础使用

五、定时器A中断

(一)MSP432P401R定时器A资源

MSP432P401R共有4个定时器A,每一个定时器A共有5个通道

在这里插入图片描述

Timer_A的特性包括

  • 具有4种操作模式的异步16位定时/计数器;
  • 可选择和可配置的时钟源;
  • 最多达7个可配置的捕获/比较模块;
  • 具有PWM 功能的可配置输出;
  • 异步输入和输出锁存。

详见技术手册第783页

(二)计数模式

  • 连续计数模式

请添加图片描述

从0开始计数,直到计数到216(65535),然后又从0计数,不断循环,可用于定时器捕获

  • 增计数模式

请添加图片描述

需要设置CCR0比较值寄存器0,CCR0确定定时器周期,可以将CCR0理解为STM32的ARR自动重装载值,定时器中断周期的计算公式也是通用的:Ttimer_a= C l k D i v × ( C C R 0 + 1 ) f   c l k   \quad {ClkDiv×(CCR0+1)\over f~clk~} f clk ClkDiv×(CCR0+1)【时钟分频乘以计数值(CCR0+1)的和除以时钟频率】

==ClkDiv ∈ [1, 8] ∪ {10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64 };==这里与STM32不同,是固定的

  • 增减计数模式

在这里插入图片描述

从0开始计数到CCR0递减为0

(三)库函数

1.初始化定时器模块

Timer_A_configureUpMode(TIMER_Ax_BASE, &upConfig);

2.选择模式开始计数

Timer_A_startCounter(TIMER_Ax_BASE, TIMER_A_UP_MODE);

3.清除比较中断标志位

Timer_A_clearCaptureCompareInterrupt(TIMER_Ax, REGISTER_0);

4.开启定时器A端口中断

Interrupt_enableInterrupt(INT_TAx_0);

5.开启总中断

Interrupt_enableMaster(void);

(四)定时器中断的一般配置

  1. 配置时钟
  2. 配置结构体
  3. 初始化定时器A
  4. 选择模式开始计数
  5. 清除比较中断标志位
  6. 开启定时器端口中断
  7. 开启总中断
  8. 编写TIMA ISR

(五)TIMER_A0定时0.5秒闪灯

timA.h

#ifndef __RNA_TIMA_H
#define __RNA_TIMA_H
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>

void TimA0_Int_Init(uint16_t ccr0, uint16_t psc);

#endif

timA.c

#include "timA.h"

void TimA0_Int_Init(uint16_t ccr0, uint16_t psc)
{
    // 1.增计数模式初始化
    Timer_A_UpModeConfig upConfig;
    upConfig.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;                                      //时钟源
    upConfig.clockSourceDivider = psc;                                                     //时钟分频 范围1-64
    upConfig.timerPeriod = ccr0;                                                           //自动重装载值(ARR)
    upConfig.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;                   //禁用 tim溢出中断
    upConfig.captureCompareInterruptEnable_CCR0_CCIE = TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE; //启用 ccr0更新中断
    upConfig.timerClear = TIMER_A_DO_CLEAR;                                                // Clear value

    // 2.初始化定时器A
    MAP_Timer_A_configureUpMode(TIMER_A0_BASE, &upConfig);

    // 3.选择模式开始计数
    MAP_Timer_A_startCounter(TIMER_A0_BASE, TIMER_A_UP_MODE);

    // 4.清除比较中断标志位
    MAP_Timer_A_clearCaptureCompareInterrupt(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_0);

    // 5.开启串口端口中断
    MAP_Interrupt_enableInterrupt(INT_TA0_0);
}

// 6.编写TIMA ISR
void TA0_0_IRQHandler(void)
{
    MAP_Timer_A_clearCaptureCompareInterrupt(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_0);

    /*开始填充用户代码*/

    MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);

    /*结束填充用户代码*/
}
/*********************************************************************************************************/

main.c

#include "sysinit.h"
#include "usart.h"
#include "timA.h"
#include "usart.h"
#include "led.h"

#define CLKDIV 64   //时钟源分频
#define CCR0 37499  // 比较值0

/*
 * 定时器中断周期:
 *
 * T_timer_a = CLKDIV * (CCR0 + 1) / f_clk 
 *           = 64 * 37500 / 48000000 
 *           = 0.05s = 20Hz
 */
 
int main(void)
{
    SysInit();  			     // 第3讲 时钟配置
	LED_Init();					 // 第2讲 GPIO输出
	TimA0_Int_Init(CCR0,CLKDIV); // 第8讲 TIMA中断
    
    MAP_Interrupt_enableMaster(); // 开启总中断
    while (1)
    {
    }
}
引用\[1\]:在MSP432中,定时器中断函数的编写需要注意清除计数器计数以及中断。如果不清除计数器计数和中断,可能会导致单片机卡死。可以使用Timer_A_clearCaptureCompareInterrupt函数清除中断状态,使用Timer_A_clearTimer函数清除定时器计数。\[1\] 引用\[2\]:在配置定时器之前,需要定义一些参数。比如TIMER_PERIOD表示定时器的周期,upConfig是Timer_A_UpModeConfig类型的结构体,其中包含了定时器的一些配置参数,如时钟源、时钟分频器、定时器周期、是否使能中断等。\[2\] 引用\[3\]:在MSP432的Driver Lib中,有一个打开TimerA中断的例子。这个例子中包含了定时器的初始化、main函数和中断函数。需要注意的是,在TI的中断函数中,没有清除定时器的计数,导致数值一直溢出,会卡死在中断。为了纠正这个错误,可以在中断函数中添加清除计数器的代码。\[3\] 综上所述,编写MSP432定时器中断函数时,需要注意清除计数器计数和中断,以避免单片机卡死。同时,可以参考Driver Lib中的例子来进行编写。 #### 引用[.reference_title] - *1* *2* *3* [msp432快速入门第七节之定时器中断](https://blog.csdn.net/qq_44151690/article/details/119808309)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

命运从未公平

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

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

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

打赏作者

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

抵扣说明:

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

余额充值