MSP432学习笔记7:定时器A中断

型号: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个通道,

MSP432学习笔记7:定时器A中断_第1张图片

 Timer_A的特性包括:

1.具有4种操作模式的异步16位定时器/计数器。

2.可选择和可配置的时钟源。

3.最多达七个可配置的捕获/比较模块。

4.异步输入和输出锁存。

Timer_A有三种计数模式:

增计数模式:

需要设置CCR0(比较值寄存器0)用于确定定时器周期,类似于“自动重装载值”

周期=时钟分频*(CCR0+1)/时钟频率

MSP432学习笔记7:定时器A中断_第2张图片

 连续计数模式:

连续计数模式会从0开始计数,直到计数到2^16=65535

然后又会从0开始计数,不断如此来循环

这种模式可以用于定时器捕获

MSP432学习笔记7:定时器A中断_第3张图片

 增减计数模式:

MSP432学习笔记7:定时器A中断_第4张图片

 

相关库函数:

以下库函数在头文件  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中:

它的附近也定义了其他俩种计数方式的结构体:

MSP432学习笔记7:定时器A中断_第5张图片

 我们将结构体的内容全部复制过来:

MSP432学习笔记7:定时器A中断_第6张图片

然后粘贴在初始化函数 对其做好一些相应的更改:

MSP432学习笔记7:定时器A中断_第7张图片

我们手动转到 timer_a.h

发现 ACLK 与 SMCLK 都可以作为时钟源

MSP432学习笔记7:定时器A中断_第8张图片

 还发现了时钟分频是有限制的,只支持以下几个分频:

MSP432学习笔记7:定时器A中断_第9张图片

到这里结构体的配置和介绍就完成了

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中断

MSP432学习笔记7:定时器A中断_第10张图片

 

6.开启总中断:

	//开启总中断
	Interrupt_enableMaster();
	

 

7.编写TIMA ISR:

此项中断服务函数的编写,需要我们先转到启动文件:

MSP432学习笔记7:定时器A中断_第11张图片

 选择对应定时器A0   通道0中断的名称,并复制

将其粘贴在主文件开始编写,第一句要清除中断标志位

接下来可自由发挥了!

 

MSP432学习笔记7:定时器A中断_第12张图片

 

8.别忘记了调用函数初始化与头文件等:

MSP432学习笔记7:定时器A中断_第13张图片

 做完这些后可以先编译,此时编译可能会像如下一样报错:

 这其实是在俩个地方重复声明了同一个名称的函数,

这俩地方是 主文件与 此工程提供的额外的  timerA.h

这个函数是  void TA0_0_IRQHandler(void)

我们只需打开timerA.c  删去 它即可:

MSP432学习笔记7:定时器A中断_第14张图片

 

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中断点亮彩灯

你可能感兴趣的:(MSP432学习笔记,学习,嵌入式硬件)