stm32f103 tim3 tim3 捕获 什么意思

查看: 595|回复: 14
tim3的通道3和4具不具有捕获功能
主题帖子精华
中级会员, 积分 326, 距离下一级还需 174 积分
在线时间3 小时
tim3的通道3和4具不具有捕获功能,为什么我使用tim3的通道3和4的时候,改出来的超声波就有问题。tim3的1和2通道就正确的。。。我翻了一下手册,上面也没有找到、求助原子哥
回复【4楼】yy叶之舞是秋的讯息:
---------------------------------
不好意思,我记错了,STM32F103的通道3和4应该有捕获功能,可以参考“stm32中文参考手册”的14.4.7和14.4.8这两个寄存器
弹起华丽的乐章 撕下最后的伪装
主题帖子精华
金牌会员, 积分 2170, 距离下一级还需 830 积分
在线时间371 小时
回复【4楼】yy叶之舞是秋的讯息:
---------------------------------
不好意思,我记错了,STM32F103的通道3和4应该有捕获功能,可以参考“stm32中文参考手册”的14.4.7和14.4.8这两个寄存器
思想很重要,无论做人还是编程!
主题帖子精华
金牌会员, 积分 2170, 距离下一级还需 830 积分
在线时间371 小时
不具有,貌似只有通道1和2有捕获功能,编程手册上有
思想很重要,无论做人还是编程!
主题帖子精华
中级会员, 积分 326, 距离下一级还需 174 积分
在线时间3 小时
回复【2楼】小温:
---------------------------------
可否发一个那个手册给我看看呢。O(∩_∩)O谢谢。。。我的qq
弹起华丽的乐章 撕下最后的伪装
主题帖子精华
中级会员, 积分 326, 距离下一级还需 174 积分
在线时间3 小时
回复【2楼】小温:
---------------------------------
求分享
弹起华丽的乐章 撕下最后的伪装
主题帖子精华
中级会员, 积分 326, 距离下一级还需 174 积分
在线时间3 小时
回复【5楼】小温:
---------------------------------
你把你说的那个编程手册发给我吧
弹起华丽的乐章 撕下最后的伪装
主题帖子精华
金牌会员, 积分 1063, 距离下一级还需 1937 积分
在线时间102 小时
RM中没有特殊说明,可以暂时认为是支持的
I See Fire.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.
主题帖子精华
金牌会员, 积分 2170, 距离下一级还需 830 积分
在线时间371 小时
回复【6楼】yy叶之舞是秋的讯息:
---------------------------------
原子的mini板配套资料有
思想很重要,无论做人还是编程!
主题帖子精华
中级会员, 积分 229, 距离下一级还需 271 积分
在线时间81 小时
应该是支持的,我用TIM4和TIM5的1234的通道来实现超声波测距都没有问题
主题帖子精华
中级会员, 积分 326, 距离下一级还需 174 积分
在线时间3 小时
回复【9楼】[content]:
---------------------------------
tim4&的1234没问题、我一测试tim3的通道4就出问题了
弹起华丽的乐章 撕下最后的伪装
主题帖子精华
中级会员, 积分 326, 距离下一级还需 174 积分
在线时间3 小时
回复【7楼】emWin:
---------------------------------
我就是试了不行,不晓得是不是不支持
弹起华丽的乐章 撕下最后的伪装
主题帖子精华
中级会员, 积分 326, 距离下一级还需 174 积分
在线时间3 小时
回复【8楼】小温:
---------------------------------
好吧。我买的不是mini版。我去下载看看
弹起华丽的乐章 撕下最后的伪装
主题帖子精华
金牌会员, 积分 1063, 距离下一级还需 1937 积分
在线时间102 小时
我能想到的关联:1、复用冲突&2、引脚重映射
I See Fire.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.
主题帖子精华
中级会员, 积分 326, 距离下一级还需 174 积分
在线时间3 小时
回复【13楼】emWin:
---------------------------------
嗯。我再看看
弹起华丽的乐章 撕下最后的伪装
主题帖子精华
中级会员, 积分 326, 距离下一级还需 174 积分
在线时间3 小时
回复【13楼】emWin:
---------------------------------
你说得对
弹起华丽的乐章 撕下最后的伪装
Powered bystm32f103 tim3_etr完成高频信号的频率计算
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
stm32f103 tim3_etr完成高频信号的频率计算
&学习stm32已经有一段时间了,接到第一个项目的时候是关于stm32f051的ad配置和da配置,本科时候连51都没接触过的人一上来就是32位单片机,着实让我蛋疼菊紧的很。还好慢慢的啃了中文手册和网上的一些例程,总算是完成的功能。这些个有时间再整理上传吧、
之后又弄了些103的东西,今天主要整理一下在进行信号频率计算的时候遇到的一些问题和解决办法,以便日后查看。也希望给碰到类似问题的童鞋一些启发。
实验要求:使用tim3_etr实现对高频脉冲的频率检测
硬件要求:stm32f103为核心,频率输入管脚为PD2(uart5_rx/t3_etr)
刚拿到这个实验的时候我连tim3是什么东西都不知道,然后查阅手册对tim3的了解如下:(个人见解)
1.timx可以定时,可以进行输入捕获,输入捕获可以测频率可测脉冲宽度,这就是这个实验要用到的功能
2.timx_CCR1 捕获/比较使能寄存器是一个比较重要的寄存器,该寄存器用来存储捕获发生时TIMx_CNT值,我们从TIMx_CCR1中就可以读出通道一捕获发生时刻的TIMx_CNT的值,通过两次捕获(上升沿一次,下降沿一次)的差值,就可以计算出高电平脉冲的宽度,f=1/脉宽。不过貌似这只适用于低频脉冲。我没有用这种方法。
3.TIMx_etr 是外部触发的第二种模式,主要用于脉冲计数。我们要用的就是他
大体了解之后就开始在网上找各种代码来看,大同小异,不过不修改的话都不太能直接用。测频率无非就是两个值,一个是基准时间t,一个是脉冲个数n。f = n/t 就OK了
现在要解决的问题,就是如何测量脉冲个数的问题。每一个TIM都一个自己的计数器,和一个自己的预装载寄存器ARR.这里既然这是为了计数,那么设置ARR的值为0xFFFF,最大值。
配置代码如下所示
& TIM_DeInit(TIM3);
& TIM_TimeBaseStructure.TIM_Period =0xFFFF;//当计数器从0记到FFF为一个周期,自动装载寄存器ARR中的值
& TIM_TimeBaseStructure.TIM_Prescaler = 0X00;&
& TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;//设置时钟系数 不分频
& TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
& TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // Time base configuration
& TIM_ITRxExternalClockConfig(TIM3,TIM_TS_ETRF); //配置外部触发,否则不会计数
& TIM_ETRClockMode2Config(TIM3, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted, 0);
& TIM_SetCounter(TIM3, 0); &//设置计数器为0
& TIM_Cmd(TIM3, ENABLE);
至此tim3_etr配置完毕。
接下来要解决的问题是如何进行10ms精确定时。使用tim2实现,配置如下
void Tim2_Config(){
& & & & TIM_TimeBaseInitTypeDef & TIM2_TimeBaseS
& & & & NVIC_InitTypeDef NVIC_InitS
& & & & RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
& & & & TIM_DeInit(TIM2);
& TIM2_TimeBaseStructure.TIM_Period =10000;
& TIM2_TimeBaseStructure.TIM_Prescaler = 71;&
& TIM2_TimeBaseStructure.TIM_ClockDivision = 0x0;//&E&&O&A&E&&O&O&I&&E& ²&&&O&AE&
& TIM2_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//&I&&E&I¼&AE&E&&A&&E½
& TIM_TimeBaseInit(TIM2, &TIM2_TimeBaseStructure); // Time base configuration
& & & & TIM_ClearFlag(TIM2,TIM_FLAG_Update);//&C&³&&&Ð&A&&&O¾&I&
& & & & TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );&
& & & & NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
& NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
& NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
& NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
& NVIC_Init(&NVIC_InitStructure);
& & & & TIM_Cmd(TIM2, ENABLE); & & & & & & & &
中断函数配置如下
void TIM2_IRQHandler(void) &&
& & & & if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)&
& & & & & & & & TIM_ClearITPendingBit(TIM2, TIM_IT_Update );
& & & & & & & & Frequency_value = TIM_GetCounter(TIM3)*10/0.01/1000;//单位khz
& & & & & & & & TIM_SetCounter(TIM3, 0); &
通过串口发送出去,串口发送配置如下
void uart_Init(void){
& & & & GPIO_InitTypeDef &GPIO_InitS
& USART_InitTypeDef USART_InitS & & & & & & &
& RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
& RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );
& & & & & & & & & & & & & & & & &&
& GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10; & & & & & & & &&
& GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;&
& GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;&
& GPIO_Init(GPIOA, &GPIO_InitStructure); & & & &
& USART_InitStructure.USART_BaudRate = 115200;
& USART_InitStructure.USART_WordLength = USART_WordLength_8b;
& USART_InitStructure.USART_StopBits = USART_StopBits_1;
& USART_InitStructure.USART_Parity = USART_Parity_No;
& USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N
& USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
& USART_Init(USART1, &USART_InitStructure);&
& USART_Cmd(USART1, ENABLE);
int fputc(int ch, FILE *f){
& & & & USART_SendData(USART1, (unsigned char) ch); &&
& & & & //while (!(USART1-&SR & USART_FLAG_TXE)); &&
& & & & while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET); & & &&
& & & & return (ch); &&
void UART_send_byte(uint8_t byte)&
while(!((USART1-&SR)&(1&&7)));
USART1-&DR= & & & &
} & & & & & & & &
void UART_Send(uint8_t *Buffer, uint32_t Length)
& & & & & & &TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE ); //此处一定要有否则串口会发送错误
& & & & while(Length != 0)
& & & & & & & & while(!((USART1-&SR)&(1&&7)));//&&E&&&&&E&I&I&
& & & & & & & & USART1-&DR= *B
& & & & & & & & Buffer++;
& & & & & & & & Length--;
& & & & & & &TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );&
至此,实验结束。验证通过
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网 51hei.com , All Rights Reservedstm32的PWM输入捕获模式
一、概念理解
PWM输入捕获模式是输入捕获模式的特例,自己理解如下
1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1 IC2一组,IC3
IC4一组。并且可是设置管脚和寄存器的对应关系。
2. 同一个TIx输入映射了两个ICx信号。
3. 这两个ICx信号分别在相反的极性边沿有效。
4. 两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。
当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个PWM周期(即连续的两个上升沿或下降沿)”,它等于包含TIM时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。
6. 同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信号的计数个数m,即(即高电平的周期或低电平的周期)
7. 由此可以计算出PWM的时钟周期和占空比了
frequency=f(TIM时钟频率)/n。
cycle=(高电平计数个数/n),
若m为高电平计数个数,则duty cycle=m/n
若m为低电平计数个数,则duty cycle=(n-m)/n
注:因为计数器为16位,所以一个周期最多计数65535个,所以测得的 最小频率= TIM时钟频率/65535。
二、程序设计与分析
程序概述:选择TIM3作为PWM输入捕获。IC2设置为上升沿,并设置为有效的触发输入信号。所以IC2的捕获寄存器捕获PWM周期,
&&&&&&&&&&&&&&&&&&
IC1的捕获寄存器捕获PWM的高电平周期。
2.程序代码如下:
& RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,
ENABLE);&&&&&
//时钟配置
& RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,
& GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_7;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//GPIO配置
& PIO_InitStructure.GPIO_Mode =
GPIO_Mode_IN_FLOATING;
& GPIO_InitStructure.GPIO_Speed =
GPIO_Speed_50MHz;
& GPIO_Init(GPIOA,
&GPIO_InitStructure);
& NVIC_InitStructure.NVIC_IRQChannel =
TIM3_IRQn;&&&&&&&&&&&&&&&&&&&&&//NVIC配置&
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
& NVIC_InitStructure.NVIC_IRQChannelSubPriority =
& NVIC_InitStructure.NVIC_IRQChannelCmd =
NVIC_Init(&NVIC_InitStructure);
& TIM_ICInitStructure.TIM_Channel =
TIM_Channel_2;&&&&&&&&&&&&&&&&&&
//通道选择
& TIM_ICInitStructure.TIM_ICPolarity =
TIM_ICPolarity_R&&&&&&
//上升沿触发
& TIM_ICInitStructure.TIM_ICSelection =
TIM_ICSelection_DirectTI;&&&
//管脚与寄存器对应关系
& TIM_ICInitStructure.TIM_ICPrescaler =
TIM_ICPSC_DIV1;&&&&&&&&&&&//输入预分频。意思是控制在多少个输入周期做一次捕获,如果
//输入的信号频率没有变,测得的周期也不会变。比如选择4分频,则每四个输入周期才做一次捕获,这样在输入信号变化不频繁的情况下,
//可以减少软件被不断中断的次数。
& TIM_ICInitStructure.TIM_ICFilter =
0x0;&&&&&&&&&&&&&&&&&&&&&&&&&&&
//滤波设置,经历几个周期跳变认定波形稳定0x0~0xF
& TIM_PWMIConfig(TIM3,
&TIM_ICInitStructure);&&&&&&&&&&&&&&&&
//根据参数配置TIM外设信息
& TIM_SelectInputTrigger(TIM3,
TIM_TS_TI2FP2);&&&&&&&&&&&&&&&
//选择IC2为始终触发源
& TIM_SelectSlaveMode(TIM3,
TIM_SlaveMode_Reset);//TIM从模式:触发信号的上升沿重新初始化计数器和触发寄存器的更新事件
& TIM_SelectMasterSlaveMode(TIM3,
TIM_MasterSlaveMode_Enable); //启动定时器的被动触发
& TIM_Cmd(TIM3,
ENABLE);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//启动TIM2
& TIM_ITConfig(TIM3, TIM_IT_CC2,
ENABLE);&&&&
//打开中断&
中断处理函数
void TIM3_IRQHandler(void)
& TIM_ClearITPendingBit(TIM3,
TIM_IT_CC2);&&&&&&&&&&&&&&&
//清楚TIM的中断待处理位
& IC2Value =
TIM_GetCapture2(TIM3);&&&&&&&&&&&&&&&&&&&&&&&&
//读取IC2捕获寄存器的值,即为PWM周期的计数值
& if (IC2Value != 0)
&&& DutyCycle =
(TIM_GetCapture1(TIM3) * 100) /
IC2V&&&&&&&&
//读取IC1捕获寄存器的值,并计算占空比
&&& Frequency =
IC2V&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//计算PWM频率。
&&& DutyCycle =
&&& Frequency =
注(一):若想改变测量的PWM频率范围,可将TIM时钟频率做分频处理
&TIM_TimeBaseStructure.TIM_Period =
&&&//周期0~FFFF
&&TIM_TimeBaseStructure.TIM_Prescaler
& //时钟分频,分频数为5+1即6分频
&&TIM_TimeBaseStructure.TIM_ClockDivision
= 0;& &//时钟分割
&&TIM_TimeBaseStructure.TIM_CounterMode
= TIM_CounterMode_Up;//模式
&&TIM_TimeBaseInit(TIM2,
&TIM_TimeBaseStructure);//基本初始化
注注(二):定时器TIM的倍频器X1或X2。在APB分频为1时,倍频值为1,否则为2。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。10325人阅读
裸板 stm32(15)
输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能。STM32 的输入捕获,简单地说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)中。
1. 相关寄存器介绍
1) 捕获/比较模式寄存器 (TIMx_CCMRx)
当在输入捕获模式下使用的时候,对应上图的第二行描述,从图中可以看出,TIMx_CCMR1 明显是针对 2 个通道的配置,低八位[7:0]用于捕获/比较通道 1 的控制,而高八位[15:8]则用于捕获/比较通道 2 的控制。同理,CCMR2 这个寄存器用来控制通道 3 和通道 4。今天的实验,我们用到的是 TIM5 的捕获/比较通道 1。
(1)CC1S[1:0],这两个位用于 CCR1 的通道配置,这里我们设置 CC1S[1:0]=01,也就是配置 IC1 映射在 TI1 上。如果不理解没有关系,看图就知道了。
从图中可以知道,IC1有三个输入源,分别是TI1,TI2,TRC。
TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; 这是通过库函数配置,映射到TI1。
头文件(stm32f10x_tim.h)定义如下:
#define TIM_ICSelection_DirectTI
((uint16_t)0x0001)
#define TIM_ICSelection_IndirectTI
((uint16_t)0x0002)
#define TIM_ICSelection_TRC
((uint16_t)0x0003)
(2)IC1F[3:0]
表格中的f_ck_int 是定时器的输入频率(TIMxCLK),f_dts 则是根据 TIMx_CR1 的 CKD[1:0]来确定。
上图就是TIMx_CR1寄存器。
#define TIM_CKD_DIV1
((uint16_t)0x0000)
#define TIM_CKD_DIV2
((uint16_t)0x0100)
#define TIM_CKD_DIV4
((uint16_t)0x0200)
假定选IC1F[3:0]=0101,即采样频率为fDTS/2, N=8;
选CKD[1:0]=01,即 tDTS = 2 × tCK_INT;并假定 fCK_INT=72MHz。
这时可以算出,采样频率为72MHz/2/2=18MHz.
1/(18MHz)*8 = 0.4444us = 444.4ns.
因为N=8,所以滤波器可以滤除掉输入端小于444.4ns的脉冲。
“数字滤波器由一个事件计数器组成,它记录到N个事件后会产生一个输出的跳变”,这句话可以这样理解:
当滤波器连续采样到N个有效电平时,就输出这个有效电平。
当滤波器没有连续采样到N个有效电平时,再从0开始计数,输出一直保持上一次输出的有效电平。
例如:滤波器上一次输出是高电平,本次连续采样到(N-1)个高电平,但第N个是个低电平,那么滤波器仍然保持上次输出的高电平,并重新开始计数,记录1次低电平,如果其后采样的(N-1)个也是低电平,此时滤波才输出低电平,于是一个下降沿才出现在IC1上。
(3)IC1PSC[1:0]
这里的“事件”指的是上升沿或者下降沿,具体是哪个由TIMx_CCER寄存器的CCxP位决定。
2)捕获/比较使能寄存器:TIMx_CCER
所以,要使能输入捕获,必须设置 CC1E=1,而 CC1P 则根据自己的需要来配置(捕获发生在上升沿还是下降沿)。
3) DMA/中断使能寄存器(TIMx_DIER)
在实验中,我们需要允许位0和位1的中断。
#define TIM_IT_Update
((uint16_t)0x0001)
#define TIM_IT_CC1
((uint16_t)0x0002)
#define TIM_IT_CC2
((uint16_t)0x0004)
#define TIM_IT_CC3
((uint16_t)0x0008)
#define TIM_IT_CC4
((uint16_t)0x0010)
对应的库函数是:TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);
4) 捕获/比较寄存器 (TIMx_CCRx)
该寄存器用来存储捕获发生时,TIMx_CNT的值,我们从 TIMx_CCR1 就可以读出通道 1 捕获发生时刻的 TIMx_CNT 值,通过两次捕获(一次上升沿捕获,一次下降沿捕获)的差值,就可以计算出高电平脉冲的宽度。
2. 实验设计
通过TIM3产生一路PWM(从PB5输出),把PB5连接到PA0上,PA0和 TIM5_CH1是同一个管脚。利用TIM5_CH1的输入捕获功能,测量出PWM的宽度。
3. 参考代码
//TIM5_CH1输入捕获配置
void TIM5_Cap_Init(u16 arr,u16 psc)
TIM_ICInitTypeDef
TIM5_ICInitS
TIM_TimeBaseInitTypeDef
TIM_TimeBaseS
NVIC_InitTypeDef NVIC_InitS
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能TIM5时钟
//TIM5的配置
TIM_TimeBaseStructure.TIM_Period =
//重装载值
TIM_TimeBaseStructure.TIM_Prescaler =
//分频系数
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//tDTS = tCK_INT
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//向上计数
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
//TIM5输入捕获配置
TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //我们用通道1
TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_R //上升沿捕获
TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1
TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
//无预分频器
TIM5_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 ,无滤波器
TIM_ICInit(TIM5, &TIM5_ICInitStructure);
//中断优先级配置
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//打开更新中断和捕获中断
TIM_Cmd(TIM5,ENABLE );
//使能定时器5
}#define START
#define WAIT_RISING
#define WAIT_FALLING
u16 TIM5CH1_CAPTURE_VAL; //输入捕获值
u32 a[500] = {0};
//存放电平宽度
u32 i = 0; //数组下标
u8 overflow = 0;
//记录定时器更新中断的次数
u8 state = START;
//定时器5中断服务程序
void TIM5_IRQHandler(void)
if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获事件
if(state == START)
//初始状态
overflow = 0;
TIM_SetCounter(TIM5,0);
state = WAIT_FALLING;
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);
//设置为下降沿捕获
else if(state == WAIT_RISING)
//等待上升沿
TIM5CH1_CAPTURE_VAL = TIM_GetCapture1(TIM5);
a[i++] = TIM5CH1_CAPTURE_VAL + overflow*65536;
overflow = 0;
TIM_SetCounter(TIM5,0);
state = WAIT_FALLING;
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //设置为下降沿捕获
else // wait falling
TIM5CH1_CAPTURE_VAL = TIM_GetCapture1(TIM5);
a[i++] = TIM5CH1_CAPTURE_VAL + overflow*65536;
overflow = 0;
TIM_SetCounter(TIM5,0);
state = WAIT_RISING;
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置为上升沿捕获
TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断
int main(void)
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//中断优先级分组
TIM3_PWM_Init(999,71); // 72/(71+1)=1MHz, T=1us*(999+1) = 1ms
TIM_SetCompare2(TIM3,650);
TIM5_Cap_Init(0XFFFF,71); //以1MHz频率计数
}4.实验结果
PWM 高电平= 350us, 低电平=650us
2) 得出的数组
高电平:347us, 低电平 647us
结论:实验OK
文章:48篇
阅读:78731用STM32定时器捕获做脉冲输入计数,一定要用ETR管脚嘛,其他的比如TIM_CH0可以吗_百度知道
用STM32定时器捕获做脉冲输入计数,一定要用ETR管脚嘛,其他的比如TIM_CH0可以吗
要计算规定时间内有多少个脉冲
我有更好的答案
可以测方波频率,不需要的,TIM_ETR管脚是外部计数用的您好,配置方便简单。即带有TIM_CRx功能的引脚都可以作为计数用的。望采纳,可以脉冲计数,主要用在测量高频,但是计数的话最好用定时器的捕获模式
采纳率:28%
CH3和CH4不能作为外部触发管脚。也可以选择CH1或CH2的滤波输入。在从模式下TIMx需要工作在从模式下,从外部触发计数。通过TIM_SelectInputTrigger(TIMx, TIM_TI1F_ED)可以选择CH1管脚作为输入
本回答被网友采纳
不可以!我按照一楼给的方法,不行。必须是CH0
为您推荐:
其他类似问题
您可能关注的内容
stm32的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 stm32 tim3定时中断 的文章

 

随机推荐