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);
(四)定时器中断的一般配置
- 配置时钟
- 配置结构体
- 初始化定时器A
- 选择模式开始计数
- 清除比较中断标志位
- 开启定时器端口中断
- 开启总中断
- 编写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)
{
}
}