型号:MSP432P401r
今日得以继续我的MSP432电赛速通学习之路......
今日学习的是定时器A中断!
目录
基础工程在此下载:
更改后的实验演示工程在此下载:
定时器A基础介绍:
Timer_A的特性包括:
Timer_A有三种计数模式:
增计数模式:
编辑
连续计数模式:
增减计数模式:
相关库函数:
定时器中断的一般配置步骤:
0.配置时钟:
1.配置结构体:
2.初始化定时器A:
3.选择模式开始计数:
4.清除比较中断标志位:
5.开启定时器端口中断:
6.开启总中断:
7.编写TIMA ISR:
8.别忘记了调用函数初始化与头文件等:
9.实际功能的添加:
10.上板测试视频:
基础工程在此下载:
这是基础空项目工程,没改过!!!是让大家下了跟着配置学习用的。
https://download.csdn.net/download/qq_64257614/87781382?spm=1001.2014.3001.5503
更改后的实验演示工程在此下载:
此工程已经调试更改好,给照着做却没实现的人对照用
https://download.csdn.net/download/qq_64257614/87813737?spm=1001.2014.3001.5503
定时器A基础介绍:
MSP432P401r有四个定时器A,每个都有5个通道,
Timer_A的特性包括:
1.具有4种操作模式的异步16位定时器/计数器。
2.可选择和可配置的时钟源。
3.最多达七个可配置的捕获/比较模块。
4.异步输入和输出锁存。
Timer_A有三种计数模式:
增计数模式:
需要设置CCR0(比较值寄存器0)用于确定定时器周期,类似于“自动重装载值”
周期=时钟分频*(CCR0+1)/时钟频率
连续计数模式:
连续计数模式会从0开始计数,直到计数到2^16=65535
然后又会从0开始计数,不断如此来循环
这种模式可以用于定时器捕获
增减计数模式:
相关库函数:
以下库函数在头文件 timer_a.h 中
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);
以下库函数在头文件 interrupt.h 中:
4.开启定时器A端口中断:
Interrupt_enableInterrupt(INT_TAx_0);
5.开启总中断:
Interrupt_enableMaster(void);
定时器中断的一般配置步骤:
0.配置时钟
1.配置结构体
2.初始化定时器A
3.选择模式开始计数
4.清除比较中断标志位
5.开启定时器端口中断
6.开启总中断
7.编写TIMA ISR
0.配置时钟:
此步已经初始化好,不需要更改。
1.配置结构体:
我喜欢将初始化操作都封装在一个子函数,
然后在主函数初始化区调用它,这样十分简洁明了!
我们发现,增计数模式结构体的定义在 timer_a.h中:
它的附近也定义了其他俩种计数方式的结构体:
我们将结构体的内容全部复制过来:
然后粘贴在初始化函数 对其做好一些相应的更改:
我们手动转到 timer_a.h
发现 ACLK 与 SMCLK 都可以作为时钟源:
还发现了时钟分频是有限制的,只支持以下几个分频:
到这里结构体的配置和介绍就完成了
2.初始化定时器A:
我们在初始化完结构体后,紧跟着就写下这句来初始化定时器A:
填上对应的定时器,
以及刚才配置好的结构体 upConfig 的地址
//初始化定时器A
Timer_A_configureUpMode(TIMER_A0_BASE,&upConfig);
3.选择模式开始计数:
参数填写对应的定时器和计数模式
//选择模式开始计数
Timer_A_startCounter(TIMER_A0_BASE,TIMER_A_UP_MODE);
4.清除比较中断标志位:
填上对应的定时器以及通道
此处填写的是通道0
//清除比较中断标志位:
Timer_A_clearCaptureCompareInterrupt(TIMER_A0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_0);
5.开启定时器端口中断:
//开启定时器端口中断:
Interrupt_enableInterrupt(INT_TA0_0);
此函数的有效值还需我们转到interrupt.h的声明来查看:
我们用到的这个是定时器A0,通道0中断
6.开启总中断:
//开启总中断
Interrupt_enableMaster();
7.编写TIMA ISR:
此项中断服务函数的编写,需要我们先转到启动文件:
选择对应定时器A0 通道0中断的名称,并复制
将其粘贴在主文件开始编写,第一句要清除中断标志位
接下来可自由发挥了!
8.别忘记了调用函数初始化与头文件等:
做完这些后可以先编译,此时编译可能会像如下一样报错:
这其实是在俩个地方重复声明了同一个名称的函数,
这俩地方是 主文件与 此工程提供的额外的 timerA.h
这个函数是 void TA0_0_IRQHandler(void)
我们只需打开timerA.c 删去 它即可:
9.实际功能的添加:
在定时器中断服务函数添加实际功能十分简单,
此处添加一个简单的彩灯点灯闪烁:
// 中断频率计算: 64*(37499+1)/48000000=0.05 s
void TA0_0_IRQHandler(void)
{
//清除比较中断标志位:
Timer_A_clearCaptureCompareInterrupt(TIMER_A0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_0);
// GPIO_toggleOutputOnPin(GPIO_PORT_P1,GPIO_PIN0);
i++;j++;k++;
if(i==50) {i=0; LED_W_On();} //2.5s亮一次白灯
if(j==100) {j=0; LED_Y_On();} //5s亮一次黄灯
}
10.上板测试视频:
MSP432学习笔记7:定时器A中断点亮彩灯