STM(X) 输入捕获

2023-11-21 01:30
文章标签 输入 捕获 stm

本文主要是介绍STM(X) 输入捕获,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

硬件连接

外部连接一个按键,上下拉输入决定什么沿触发和电平捕捉

软件实现

extern u8  TIM2CH1_CAPTURE_STA;		//输入捕获状态		    				
extern u16	TIM2CH1_CAPTURE_VAL;	//输入捕获值int main(void){		 u32 temp=0; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2delay_init();	    	 //延时函数初始化	uart_init(9600);	 			//9600	 TIM2_Cap_Init(0XFFFF,72-1);		//以1Mhz的频率计数 while(1){if(TIM2CH1_CAPTURE_STA&0X80)//成功捕获到了一次高电平{temp=TIM2CH1_CAPTURE_STA&0X3F;printf("溢出次数:%d 次\r\n",temp);temp*=65536;					//溢出时间总和temp+=TIM2CH1_CAPTURE_VAL;		//溢出时间加上最后一次的时间printf("HIGH:%d us\r\n",temp);	//打印TIM2CH1_CAPTURE_STA=0;			//置0,开始下一次捕获}}
}
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数//定时器2通道1输入捕获配置TIM_ICInitTypeDef  TIM2_ICInitStructure;void TIM2_Cap_Init(u16 arr,u16 psc)
{	 GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	//使能TIM2时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;  //引脚设置A0(作为输入) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉输入GPIO_Init(GPIOA, &GPIO_InitStructure); //结构体赋值GPIO_ResetBits(GPIOA,GPIO_Pin_0);						 //A0置零//初始化定时器2 TIM2	 TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值 TIM_TimeBaseStructure.TIM_Prescaler =psc; 	//预分频器   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割用于滤波,这里不进行滤波TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //结构体赋值//初始化TIM2输入捕获参数TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //使用定时器2的通道1TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;	//上升沿捕获TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //设置直接映射(映射到本通道,默认)TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;	 //设置多少个事件触发一次,这里设置每次事件都触发TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波TIM_ICInit(TIM2, &TIM2_ICInitStructure);//结果体赋值//中断分组初始化NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级0级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断	TIM_Cmd(TIM2,ENABLE ); 	//使能定时器2}u8  TIM2CH1_CAPTURE_STA=0;	//输入捕获状态		    				
u16	TIM2CH1_CAPTURE_VAL;	  //捕获到下降沿的时候,定时器的值//STA各位描述
//bit7:捕获完成标识(0x80),也就是捕获到了一个高电平的时间
//bit6:捕获到高电平(0x40)
//bit5-0:定时器溢出次数(0x1F)//定时器5中断服务程序	 
void TIM2_IRQHandler(void){// 初始化的时候是上升沿捕获if((TIM2CH1_CAPTURE_STA&0x80)==0){//捕捉未完成if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET){//发生了更新中断(定时器溢出)if(TIM2CH1_CAPTURE_STA&0x40){//已经捕捉到了高电平,也就是在计算高电平时间内发生了定时器溢出if((TIM2CH1_CAPTURE_STA&0x3F)==0x3F){//时间太长,以至于无法计数(溢出位都满了)TIM2CH1_CAPTURE_STA|=0x80;//强制捕获完成TIM2CH1_CAPTURE_VAL=0xFFFF;//最长时间}else{TIM2CH1_CAPTURE_STA++;//没有溢出,定时器溢出次数加1}}}if(TIM_GetITStatus(TIM2,TIM_IT_CC1)!=RESET){//发生了捕获事件(捕捉到一个沿),下面说的是遇到沿的时候如何处理if(TIM2CH1_CAPTURE_STA&0x40){//捕获到了高电平(沿前面的电平状态),捕获到了一个下降沿TIM2CH1_CAPTURE_STA|=0x80;//标记捕获完成(也就是完成了一次测量)TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);//获取定时器的值(也就是定时器最后一次记录的值)TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising);//设置上升沿捕捉,也就是等待再一次捕获}else{//捕捉到了上升沿,也就是第一次捕获,此时定时器清零,进行计数TIM2CH1_CAPTURE_STA=0;TIM2CH1_CAPTURE_VAL=0;TIM_SetCounter(TIM2,0);//定时器清零TIM2CH1_CAPTURE_STA|=0x40;//标记捕获到了上升沿,(电平状态将一直是高电平)TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);//设置为下降沿捕获}}}TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}

这篇关于STM(X) 输入捕获的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/398852

相关文章

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

解决Office Word不能切换中文输入

我们在使用WORD的时可能会经常碰到WORD中无法输入中文的情况。因为,虽然我们安装了搜狗输入法,但是到我们在WORD中使用搜狗的输入法的切换中英文的按键的时候会发现根本没有效果,无法将输入法切换成中文的。下面我就介绍一下如何在WORD中把搜狗输入法切换到中文。

当你输入一个网址后都发生什么

原文:http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/  作为一个软件开发者,你一定会对网络应用如何工作有一个完整的层次化的认知,同样这里也包括这些应用所用到的技术:像浏览器,HTTP,HTML,网络服务器,需求处理等等。 本文将更深入的研究当你输入一个网址的时候,后台到底发生了一件件什么样的事~

在 Qt Creator 中,输入 /** 并按下Enter可以自动生成 Doxygen 风格的注释

在 Qt Creator 中,当你输入 /** 时,确实会自动补全标准的 Doxygen 风格注释。这是因为 Qt Creator 支持 Doxygen 以及类似的文档注释风格,并且提供了代码自动补全功能。 以下是如何在 Qt Creator 中使用和显示这些注释标记的步骤: 1. 自动补全 Doxygen 风格注释 在 Qt Creator 中,你可以这样操作: 在你的代码中,将光标放在

如何使用Selenium捕获控制台日志

Selenium是一个流行的开源工具,用于自动化Web浏览器。其中一个关键功能是能够与浏览器的开发者控制台交互。本文将向您展示如何在Selenium中使用Java获取控制台日志。这些日志对于调试和解决Selenium脚本的问题非常有用。 如何查看任何网页的控制台日志 首先,打开浏览器的开发者控制台。在大多数浏览器中,您可以通过右键点击页面并选择“检查”来做到这一点。我们将在我们的测试网站——h

八、我们应当怎样做需求调研:需求捕获(下)

前面我们讨论了,需求分析工作是一个迭代的过程:需求捕获->需求整理->需求验证->再需求捕获······需求捕获是这个迭代过程的开始,也是整个需求分析工作中最重要的部分。没有捕获哪来后面的整理与验证工作?但是,非常遗憾,按照我以往的经验,需求捕获是我们最薄弱的环节。前面我提到的许许多多项目开发的问题都可以归结为需求分析的问题,而许许多多需求分析的问题又都可以归结为需求捕获不完整的问题。需求捕获是整

七、我们应当怎样做需求调研:需求捕获(上)

前面我们讨论了,需求分析工作是一个迭代的过程:需求捕获->需求整理->需求验证->再需求捕获······需求捕获是这个迭代过程的开始,也是整个需求分析工作中最重要的部分。没有捕获哪来后面的整理与验证工作?但是,非常遗憾,按照我以往的经验,需求捕获是我们最薄弱的环节。前面我提到的许许多多项目开发的问题都可以归结为需求分析的问题,而许许多多需求分析的问题又都可以归结为需求捕获不完整的问题。需求捕获是整

block对变量捕获的方式

之前见很多文章对block捕获变量的方法,会进行诸如此类的描述:“block会捕获被引用的变量, 并对其进行copy操作, 因此, 可能会导致其引用计数加1,如果处理不好, 可能因循环引用导致内存泄漏。” 实际上, 这种说法并不严谨。block对变量的捕获, 根据变量类型的不同,会采用不同的捕获方式。 (1)静态或者全局变量, 在block中直接是指针传递的方式传入block中,对其进行的操作

【Markdown】输入空格方式

文章目录 1.nbsp2. ensp3. emsp4.thinsp5. zwnj6. zwj7. 其它 1.nbsp  为“不换行空格”,全称“No-Break Space”,它是最常见和我们使用最多的空格,大多数的人可能只接触了 ,它是按下space键产生的空格。在HTML中,如果你用空格键产生此空格,空格是不会累加的(只算1个)。要使用html实体表示才可累加,该

兔子--EditText去除下划线和输入字母和数字的限制

在设置密码输入框的时候,只允许输入数字和字母,设置如下属性:  android:digits="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 设置密码不可见(显示小黑点),并去除edittext的获取到焦点时候的下划线, 设置如下: