MSP432学习笔记9:定时器A-----捕获

news2024/12/26 21:16:36

今日得以继续我的MSP432电赛速通之旅~~~

目录

基础知识:

相关库函数:

一般配置步骤:

首先定义一个初始化函数:

1.复用引脚:

2.配置连续计数结构体:

3.初始化定时器连续计数:

4.配置捕获结构体:

5.初始化定时器为捕获:

6.选择模式开始计数:

7.清除中断标志位:

8.开启定时器端口中断:

9.开启总中断:

10.编写 TIMA ISR:

11.主函数捕获的编写:

硬件电路的连接:

实验结果:


基础知识:

MSP432捕获模式是一种可编程的寄存器配置,

在此模式下,MSP432可以在外部事件确切发生的瞬时刻捕获一个定时器的值。

捕获模式可以用于许多应用,例如测量某个事件的时间间隔或周期,

以及检测输入脉冲的上升边、下降边或两种边缘的时间。

在MSP432上,捕获模式与定时器结合使用。

MSP432中的每个定时器都有多个捕获/比较通道可以使用,

每个通道可以独立配置为捕获模式。

在捕获模式下,每个通道可以在定时器上的不同时间点捕获一个定时器的值。

并将其存储在一个捕获寄存器中。

在定时器捕获中,我们只需关心连续计数模式就好了:

连续计数模式就是从零开始计数

直到65535,然后又从0开始计数,如此往复循环。

此处先列出定时器与通道对应引脚

相关库函数:

以下1~7,都定义在库 timer_a.h中:

1.初始化定时器为连续计数模式:

Timer_A_configureContinuousMode(TIMER_Ax,&continuousModeConfig);

2.配置定时器的捕获模式:

Timer_A_initCapture(TIMER_Ax_BASE,&captureModeConfig);

3.选择模式开始计数:

Timer_A_startCounter(TIMER_Ax_BASE,TIMER_A_CONTINUOUS_MODE);

4.清除定时器溢出中断标志位:

Timer_A_clearInterruptFlag(TIMER_Ax_BASE);

5.清除定时器捕获中断标志位:

Timer_A_clearCaptureCompareInterrupt(TIMER_Ax,REGISTER_N);

6.获取定时器溢出中断状态:

Timer_A_getEnabledInterruptStatus(TIMER_Ax_BASE);

7.获取定时器捕获中断状态:

Timer_A_getCaptureCompareEnabledInterruptStatus(TIMER_Ax,REGISTER_N);

8.获取定时器捕获电平状态:

Timer_A_getSynchronizedCaptureCompareInput(TIMER_Ax,REGISTER_N,Setting);

返回值:

TIMER_A_OUTPUTMODE_OUTBITVALUE_LOW

TIMER_A_OUTPUTMODE_OUTBITVALUE_HIGH

以下9~10,定义在了interrupt.h中:

9.开启定时器A端口中断:

Interrupt_enableInterrupt(INT_TAx_N);

10.开启总中断:

Interrupt_enableMaster(void);

一般配置步骤:

0.配置时钟

1.复用引脚

2.配置连续计数结构体

3.初始化定时器连续计数

4.配置捕获结构体

5.初始化定时器为捕获

6.选择模式开始计数

7.清除中断标志位

8.开启定时器端口中断

9.开启总中断

10.编写 TIMA ISR

本次配置TA2 通道1捕获并测量高电平持续时间为实验目标:

对应引脚为P5.6

首先定义一个初始化函数:

用来封装初始化的语句:

void Timer2_Cap_Inint()
{

}

1.复用引脚:

 Tip:   定时器捕获是复用输入,定时器PWM是复用输出:

//1.复用引脚GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,GPIO_PIN6,GPIO_PRIMARY_MODULE_FUNCTION);

2.配置连续计数结构体:

首先在timer_a.h中找到结构体:

 复制内容粘贴在初始化函数中:

 做以下修改:

	//2.配置连续计数结构体
	Timer_A_ContinuousModeConfig continuousModeConfig=
	{
		TIMER_A_CLOCKSOURCE_SMCLK,      //时钟源
        TIMER_A_CLOCKSOURCE_DIVIDER_48, //时钟分频48  分辨力为1us
        TIMER_A_TAIE_INTERRUPT_ENABLE,  //开启定时器溢出中断
		TIMER_A_SKIP_CLEAR              //Skip Clear Counter 
	};

定时器溢出中断要使能开启,因为如果高电平持续时间过长

恰好到定时器溢出中断了才结束,此时的捕获寄存器刚好清零

读取到的捕获值就是0了,算出来的高电平持续时间就是0了

所以要开启溢出中断,每溢出一次就中断记录一次,

最后计算的时候,在把溢出的时间加回去

3.初始化定时器连续计数:

填上定时器A2和结构体地址就行了

//3.初始化定时器连续计数:
Timer_A_configureContinuousMode(TIMER_A2_BASE,&continuousModeConfig);

4.配置捕获结构体:

 

	//4.配置捕获结构体:
	const Timer_A_CaptureModeConfig continuousModeConfig_TA2=
	{
		TIMER_A_CAPTURECOMPARE_REGISTER_1,             //此处改通道引脚	
		TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE,   //上升下降沿捕获
		TIMER_A_CAPTURE_INPUTSELECT_CCIxA,	//CCIxA:外部引脚输入(CCIxB:与内部ACLK连接)
		TIMER_A_CAPTURE_SYNCHRONOUS                    //同步捕获
	};

5.初始化定时器为捕获:

 

	//5.初始化定时器为捕获:
	Timer_A_initCapture(TIMER_A2_BASE,&continuousModeConfig_TA2);

6.选择模式开始计数:

	//6.选择模式开始计数:
	Timer_A_startCounter(TIMER_A2_BASE,TIMER_A_CONTINUOUS_MODE);
	

7.清除中断标志位:

	//7.清除中断标志位:
	Timer_A_clearInterruptFlag(TIMER_A2_BASE);
	Timer_A_clearCaptureCompareInterrupt(TIMER_A2_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1);

8.开启定时器端口中断:

	//8.开启定时器端口中断:
	Interrupt_enableInterrupt(INT_TA2_N);

该函数参数的有效值可以去interrupt.h找到声明:

 我们用的是定时器A2 通道1中断,

通道1、2、3、4都是选择INT_TA2_N这个端口

              只有通道0是选择INT_TA2_0这个端口

9.开启总中断:

主函数初始化区域调用函数开启即可

 

10.编写 TIMA ISR:

中断服务函数,去启动文件寻找函数名并复制:

 粘贴,声明作为新的函数:

开始编写捕获处理:

#define CAP_TIMA_SELECTION TIMER_A2_BASE                         //在这里改定时器
#define CAP_REGISTER_SELECTION TIMER_A_CAPTURECOMPARE_REGISTER_1 //在这里改定时器通道
#define CAP_CCR_NUM 1                                            //在这里改定时器通道
#define CAP_PORT_PIN GPIO_PORT_P5, GPIO_PIN6                     //在这里改复用引脚


uint16_t TIMA2_CAP_STA = 0;
uint16_t TIMA2_CAP_VAL = 0;




//定时器A2 通道1 中断服务函数
void TA2_N_IRQHandler(void)
{
	 //还未成功捕获
    if ((TIMA2_CAP_STA & 0X80) == 0)
    {
			//溢出中断
        if (MAP_Timer_A_getEnabledInterruptStatus(CAP_TIMA_SELECTION))
        {
					 //清除定时器溢出中断标志位
            MAP_Timer_A_clearInterruptFlag(CAP_TIMA_SELECTION);

            
            /*如果在未清除中断位值时,来了一次中断,COV会置位,需要软件复位,
							这里没有官方库函数。具体可以参考技术手册(slau356h.pdf) P790 */
            BITBAND_PERI(TIMER_A_CMSIS(CAP_TIMA_SELECTION)->CCTL[CAP_CCR_NUM], TIMER_A_CCTLN_COV_OFS) = 0;

				    //已经捕获到高电平了 40H = 0x 0100 0000
            if (TIMA2_CAP_STA & 0X40)
            {
							//高电平太长了
                if ((TIMA2_CAP_STA & 0X3F) == 0X3F)
                {
									 //强制标记成功捕获完高电平 80H = 0x1000 0000
                    TIMA2_CAP_STA |= 0X80;
                    TIMA2_CAP_VAL = 0XFFFF;
                }
                else
										//溢出次数加1
                    {TIMA2_CAP_STA++; }
            }
        }
						 //捕获中断
        if (MAP_Timer_A_getCaptureCompareEnabledInterruptStatus(CAP_TIMA_SELECTION, CAP_REGISTER_SELECTION))
        {
					//清除 CCR1 更新中断标志位
            MAP_Timer_A_clearCaptureCompareInterrupt(CAP_TIMA_SELECTION, CAP_REGISTER_SELECTION);

            //判断是否捕获到下降沿
            if (TIMA2_CAP_STA & 0X40 && 
							(MAP_Timer_A_getSynchronizedCaptureCompareInput(
								CAP_TIMA_SELECTION,
                CAP_REGISTER_SELECTION,
								TIMER_A_READ_CAPTURE_COMPARE_INPUT) == TIMER_A_CAPTURECOMPARE_INPUT_LOW))
            {
							 //标记成功捕获完高电平
                TIMA2_CAP_STA |= 0X80;
                TIMA2_CAP_VAL = Timer_A_getCaptureCompareCount(CAP_TIMA_SELECTION, CAP_REGISTER_SELECTION);
            }
						 //还未开始,第一次捕获上升沿
            else 
            {
                TIMA2_CAP_STA = 0;
                TIMA2_CAP_VAL = 0;
                MAP_Timer_A_clearTimer(CAP_TIMA_SELECTION); //清空定时器 重新从0计数
                TIMA2_CAP_STA |= 0X40;                      //标记捕获到了上升沿
            }
        }
    }
}

11.主函数捕获的编写:

 此处按键K1   K2分别是为了将LED点亮和熄灭

点亮时是高电平,以此模拟捕获高电平时长

并将计算好的时长通过串口发送给上位机

#include "sysinit.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "tim32.h"
#include "key.h"

#define CAP_TIMA_SELECTION TIMER_A2_BASE                         //在这里改定时器
#define CAP_REGISTER_SELECTION TIMER_A_CAPTURECOMPARE_REGISTER_1 //在这里改定时器通道
#define CAP_CCR_NUM 1                                            //在这里改定时器通道
#define CAP_PORT_PIN GPIO_PORT_P5, GPIO_PIN6                     //在这里改复用引脚


uint16_t TIMA2_CAP_STA = 0;
uint16_t TIMA2_CAP_VAL = 0;


void TimA2_Cap_Init(void);

int main(void)
{
	   uint8_t key;
    uint32_t temp;
	
	
    SysInit();         // 第3讲 时钟配置
    uart_init(115200); // 第7讲 串口配置
    delay_init();      // 第4讲 滴答延时
		    LED_Init();        //第2讲 GPIO输出
    KEY_Init(0);       //第2讲 GPIO输入
    TimA2_Cap_Init();  //第8讲 定时器A 捕获
		
    printf("Hello,MSP432!\r\n");
    MAP_Interrupt_enableMaster(); // 开启总中断
    while (1)
    {
			        key = KEY_Scan(0);
        if (key == KEY1_PRES)
            LED_RED_On();
        else if (key == KEY2_PRES)
            LED_RED_Off();

        if (TIMA2_CAP_STA & 0X80) //成功捕获到了一次上升沿
        {
            temp = TIMA2_CAP_STA & 0X3F;
            temp *= 65536;                 //溢出时间总和
            temp += TIMA2_CAP_VAL;         //得到总的高电平时间
            printf("HIGH:%dus\r\n", temp); //打印总的高点平时间
            TIMA2_CAP_STA = 0;             //开启下一次捕获
        }
			
    }
}

硬件电路的连接:

别忘了将P1^0与P5^6用杜邦线相连,这样LED亮,

就送来高电平给引脚P5^6测量捕获

 

实验结果:

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/583191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

缺少vcruntime140.dll如何修复?电脑小白也能学会修复vcruntime140.dll教程

Vcruntime140.dll是一个用于微软的Visual C软件的动态链接库文件,DLL的全称是动态连接库(Dynamic Link Library),它是许多不同软件中所共用的文件类型。这个文件被广泛用作其他软件的依赖库(dependency)。每当您尝试运行一个应用程…

大体量数据迁移成难题,亚马逊云科技如何让迁移能效两不误

逼真的人物设定,精美的主题布局,沉浸式的互动体验,交互式的多元场景……一系列虚拟与现实高度契合又相互映射的设定,成就了“元宇宙”游戏世界的无穷魅力。GVERSE开发的Blockman Go平台就是有着相当大体量的UGC(用户生…

优秀的开源测试工具和框架推荐:精选十大神器!

目录 引言 Katalon Studio Selenium Appium JMeter SOAP UI Robot Framework Watir JUnit Robotium Citrus 结语 引言 你是一位测试从业者,时刻关注着最新的测试工具和框架。但在众多的选择面前,你是否感到困惑和无从下手? 别担…

Android音视频开发1:Android Studio安装

1.JDK安装,至少安装JAVA 1.7 对比项目 Android iOS 开发语言 Java Objective-c,Swift 系统开放性 Android源代码开放,开放性更好 封闭操作系统,开放性较差 系统安全性 源代码开放,安全性较差 封闭操作系统&…

电力电子课设|数控产生PWM波|使用51单片机输出占空比可调PWM波(按钮控制、数码管显示)速成教程

我们学校电气专业开始做电力电子的课设了,小组选了一项制作硬件电路的任务,里面有要求采用数控方式实现DC-DC电压变换的输出电压调节,数控在电路中的体现就是用单片机输出可调占空比的PWM作用于IRF520模块,实现电压的变化&#xf…

chatgpt赋能python:Python不等于0:为什么Python成为SEO的热门选择?

Python不等于0:为什么Python成为SEO的热门选择? 如果你正在寻找一门适合SEO的编程语言,Python可能就是你的不二选择。Python在SEO行业越来越流行,因为它具有许多与SEO相关的功能和特点。通过本文,我们将会介绍Python为…

Flutter调优--深入探究MediaQuery引起界面Rebuild的原因及解决办法 | 京东云技术团队

前言 我们可以通过MediaQuery.of(context)方法获取到一些设备和系统的相关信息,比如状态栏的高度、当前是否是黑暗模式等等,使用起来相当方便,但是也要注意可能引起的页面rebuild问题。本文会介绍一个典型的例子,并深入源码来探讨…

chatgpt赋能python:用Python下载MP3的方法

用Python下载MP3的方法 如果你想从互联网上下载MP3,那么你可以使用Python来实现这个任务。在本文中,我们将介绍如何用Python编写程序来下载MP3,同时还将分享一些有用的工具和资源。 Python中使用的库 要下载MP3,你需要使用Pyth…

接口测试简介以及接口测试用例设计思路

接口测试简介 1.什么是接口 接口就是内部模块对模块,外部系统对其他服务提供的一种可调用或者连接的能力的标准,就好比usb接口,他是系统向外接提供的一种用于物理数据传输的一个接口,当然仅仅是一个接口是不能进行传输的&#x…

如何快速入门高性能计算?五个实用学习建议分享

高性能计算 (High-Performance Computing,HPC)是指通过计算机技术实现高速运算,对大规模科学计算、数据分析、复杂制造等领域的研究与应用提供支撑。目前,HPC已经广泛应用于医学、天文、材料科学、地球科学、气象科学、…

【cmake 学习】cmake判断当前所处系统(CMAKE_SYSTEM_NAME)

目录 1、使用内置变量判断 2、使用变量 CMAKE_SYSTEM_NAME 判断 1、使用内置变量判断 cmake 内置了许多用于表示系统的变量,如 UNIX、WIN32、LINUX、IOS等。假设当前系统为Linux系统,那么 LINUX 变量的值为 1。 更多变量可以参考:cmake-v…

最近距离 | EXCEL中批量查找与原点最近距离的目标点

一 需求 企业送餐、物流、通勤、选址等经常会遇到这样的需求,仓储地是固定的,客户下单后由于客户的地址具有随机性,需按照地理位置分布结合仓储位置进行分析,按距离近及远合理分配仓储,以便节省配送成本。 本文就以这…

深度学习AI编译器-MLIR简介

1、什么是MLIR MLIR:Multi-Level Intermediate Representation 多级中间表达 LLVM下的子项目编译器基础框架统一IR格式,提高通用性和可复用性自带Tensor类型,目前主要用于深度学习领域 中间表达 IR(Intermediate Representatio…

Day55【动态规划】392.判断子序列、115.不同的子序列

392.判断子序列 力扣题目链接/文章讲解 视频讲解 本题目可以用双指针法来做 class Solution { public:bool isSubsequence(string s, string t) {// pointer to s, pointer to tint ps 0, pt 0; for (pt 0; pt < t.size(); pt) { // 遍历t&#xff0c;在t中按顺序寻找…

Kali-linux Gerix Wifi Cracker破解无线网络

Gerix Wifi Cracker是另一个aircrack图形用户界面的无线网络破解工具。本节将介绍使用该工具破解无线网络及创建假的接入点。 9.3.1 Gerix破解WEP加密的无线网络 在前面介绍了手动使用Aircrack-ng破解WEP和WPA/WPA2加密的无线网络。为了方便&#xff0c;本小节将介绍使用Geri…

数字图像处理①基于ADMM的全变分去噪算法

文章目录 1. Problem2. 仿真结果3. MATLAB算法4. 源码地址参考文献 1. Problem 在图像处理中&#xff0c;图像信号总会因为各种原因受到噪声的干扰&#xff0c;其中高斯噪声就是典型的干扰类型之一。 针对图像去噪的模型有很多种&#xff0c;其中全变分模型被认为是最有效的模…

北醒Modbus协议在Python下实现功能配置

目录 实验目的测试环境Python库需求Benewake(北醒) TF雷达接口及通讯协议说明接口定义Modbus通信协议说明功能码说明 接线示意图库安装说明例程运行与测试 实验目的 实现485接口系列雷达Modbus协议在Python上实现功能配置。 本例程界面分为主菜单、测距子菜单、配置子菜单&…

社区团购-v.1.6.0更新

likeshop社区团购系统发布新版本1.6.0&#xff0c;主要更新如下&#xff1a; 新增&#xff1a; 小程序-登录引导用户填写头像和昵称 小程序-热更新代码弹窗 后台-正版检测、版本检测 后台-页面装修支持拖拽排序 后台-订单管理增加导出功能 修复&#xff1a; 后台-关联团…

本地化部署AI语言模型RWKV指南,ChatGPT顿时感觉不香了。

之前由于ChatGpt处处受限&#xff0c;又没法注册的同学们有福了&#xff0c;我们可以在自己电脑上本地化部署一套AI语言模型&#xff0c;且对于电脑配置要求也不是非常高&#xff0c;对它就是RWKV。 关于RWKV RWKV是一个开源且允许商用的大语言模型&#xff0c;灵活性很高且极…

Linux之搭建环境

文章目录 1 FileZilla软件2 Linux搭建samba文件共享服务器&#xff0c;实现基于Linux和Windows的共享文件服务2.1 smaba的安装与基本应用2.2 samba的账号权限配置 1 FileZilla软件 在跟着正点原子教程安装后&#xff0c;出现如下问题 解决方法如下 参考文章解决FileZilla连接…