官方的例程

/**\brief      configure the GPIO ports\param[in]  none\param[out] none\retval     none*/
void gpio_configuration(void)
{rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_AF);/*configure PA6 (TIMER2 CH0) as alternate function*/gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
}/**\brief      configure the nested vectored interrupt controller\param[in]  none\param[out] none\retval     none*/
void nvic_configuration(void)
{nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3);nvic_irq_enable(TIMER2_IRQn, 1, 1);
}/**\brief      configure the TIMER peripheral\param[in]  none\param[out] none\retval     none*/
void timer_configuration(void)
{/* TIMER2 configuration: input capture mode -------------------the external signal is connected to TIMER2 CH0 pin (PA6)the rising edge is used as active edgethe TIMER2 CH0CV is used to compute the frequency value------------------------------------------------------------ */timer_ic_parameter_struct timer_icinitpara;timer_parameter_struct timer_initpara;rcu_periph_clock_enable(RCU_TIMER2);timer_deinit(TIMER2);/* TIMER2 configuration */timer_initpara.prescaler         = 107;timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;timer_initpara.counterdirection  = TIMER_COUNTER_UP;timer_initpara.period            = 65535;timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;timer_initpara.repetitioncounter = 0;timer_init(TIMER2,&timer_initpara);/* TIMER2  configuration *//* TIMER2 CH0 input capture configuration */timer_icinitpara.icpolarity  = TIMER_IC_POLARITY_RISING;     //上升沿触发timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;timer_icinitpara.icfilter    = 0x0;timer_input_capture_config(TIMER2,TIMER_CH_0,&timer_icinitpara);/* auto-reload preload enable */timer_auto_reload_shadow_enable(TIMER2);/* clear channel 0 interrupt bit */timer_interrupt_flag_clear(TIMER2,TIMER_INT_CH0);/* channel 0 interrupt enable */timer_interrupt_enable(TIMER2,TIMER_INT_CH0);/* TIMER2 counter enable */timer_enable(TIMER2);
}/*!\brief      main function\param[in]  none\param[out] none\retval     none
*/
int main(void)
{gpio_configuration(); gd_eval_com_init(EVAL_COM1);nvic_configuration();timer_configuration();while (1);
}/*** @brief  This function handles TIMER2 interrupt request.* @param  None* @retval None*/
void TIMER2_IRQHandler(void)
{if(SET == timer_interrupt_flag_get(TIMER2,TIMER_INT_CH0)){/* clear channel 0 interrupt bit */timer_interrupt_flag_clear(TIMER2,TIMER_INT_CH0);if(0 == ccnumber){/* read channel 0 capture value */readvalue1 = timer_channel_capture_value_register_read(TIMER2,TIMER_CH_0);ccnumber = 1;}else if(1 == ccnumber){/* read channel 0 capture value */readvalue2 = timer_channel_capture_value_register_read(TIMER2,TIMER_CH_0);if(readvalue2 > readvalue1){count = (readvalue2 - readvalue1); }else{count = ((0xFFFF - readvalue1) + readvalue2); }fre = (float)1000000 / count;printf("the value1 is %d,the value2 is %d\n",readvalue1,readvalue2);printf("the count is %d\n",count);printf("the frequence is %f\n",fre);ccnumber = 0;}}
}

自己修改使用的

void ACSig_In_Capture_Init(void)  //TIM2_CH0    AC_SIG-PB4
{timer_ic_parameter_struct timer_icinitpara;timer_parameter_struct timer_initpara;rcu_periph_clock_enable(RCU_TIMER2);rcu_periph_clock_enable(RCU_GPIOB);rcu_periph_clock_enable(RCU_AF);//重映射gpio_pin_remap_config(GPIO_TIMER2_PARTIAL_REMAP, ENABLE);    gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_4);  nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3);nvic_irq_enable(TIMER2_IRQn, 1, 1);    /* TIMER2 configuration: input capture mode -------------------the external signal is connected to TIMER2 CH0 pin (PB4)the rising edge is used as active edgethe TIMER2 CH0CV is used to compute the frequency value------------------------------------------------------------ */   timer_deinit(TIMER2);/* TIMER2 configuration */timer_initpara.prescaler         = 215;timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;  timer_initpara.counterdirection  = TIMER_COUNTER_UP;timer_initpara.period            = 65535;timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;timer_initpara.repetitioncounter = 0;timer_init(TIMER2,&timer_initpara);/* TIMER2  configuration *//* TIMER2 CH0 input capture configuration */timer_icinitpara.icpolarity  = TIMER_IC_POLARITY_FALLING;     //下降沿timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;timer_icinitpara.icfilter    = 0x4;                          //使能滤波功能 timer_input_capture_config(TIMER2,TIMER_CH_0,&timer_icinitpara);/* auto-reload preload enable */timer_auto_reload_shadow_enable(TIMER2);/* clear channel 0 interrupt bit */timer_interrupt_flag_clear(TIMER2,TIMER_INT_CH0);/* channel 0 interrupt enable */timer_interrupt_enable(TIMER2,TIMER_INT_CH0);/* TIMER2 counter enable */timer_enable(TIMER2);
}

可以看到上面的例程使能了滤波功能,下面对滤波功能做一下介绍,并说明为什么要用。

  输入捕获1滤波器CH0CAPFLT[3:0], 这个用来设置输入采样频率和数字滤波器长度。 其中,fPCLK是定时器的输入频率(TIMxCLK) ,一般为 108Mhz,而 fDTS则是根据 TIMERx_CTL0 的 CKDIV[1:0]的设置来确定的,如果 CKD[1:0]设置为 00,那么fDTS=fTIMER_CK=fPCLK。

  N 值就是滤波长度,举个简单的例子:假设 CH0CAPFLT[3:0]=0011,并设置 IC1 映射到通道 1 上,且为上升沿触发,那么在捕获到上升沿的时候,再以fPCLK的频率,连续采样到 8 次通道 1 的电平,如果都是高电平,则说明确实是一个有效的触发,就会触发输入捕获中断(如果开启了的话) 。这样可以滤除那些高电平脉宽低于 8 个采样周期的脉冲信号,从而达到滤波的效果。

  此处我是用来采集下降沿信号,但是信号下降的比较慢。当我把滤波关掉,情况如下图,蓝色是采集信号,黄色是测试信号,进一次触发中断就翻转一次黄色信号的电平。可以看到因为蓝色信号下降太慢,在临界处触发了多次中断。

  当我把滤波打开后,定时器就会采集多次才会触发,这样就可以解决信号边沿慢的问题了。

GD32定时器输入捕获例程相关推荐

  1. STM32定时器输入捕获

    5.STM32定时器输入捕获 前言: STM32定时器输入捕获简介 STM32的输入捕获可以用于捕获脉宽, 测量时间 . 例如超声波测距模块就是需要用输入捕获功能, 通过测量输入脉冲的高电平脉宽 , ...

  2. 【STM32】【STM32CubeMX】STM32CubeMX的使用之七:定时器输入捕获实现超声波测距

    文章目录 0.前言 1.硬件设计 1.1.超声波模块 1.2.STM32L151 2.CubeMX配置 3.软件设计   下载工程文件:   https://gitee.com/Joseph_Coop ...

  3. STM32-通用定时器-输入捕获

    1.概述 前面,我们介绍了STM32F1的通用定时器作为PWM输出的使用方法,这一章我们向大家介绍通用定时器作为输入捕获的使用.在本章中,我们将用TIM5的通道的通道1(PA0)来做输入捕获, 捕获 ...

  4. STM32笔记 (十三)定时器输入捕获(利用定时器捕获高电平时间)

    简介 定时器的输入捕获可以用来测量脉冲宽度与PWM的输入测量,可以通过设置检测不同的跳变边沿,来实现对高低电平的计时捕获 框图 由图可知,初始化定时器进行输入捕获有以下步骤: 开启时钟,配置定时器的G ...

  5. stm32 同一个定时器输入捕获测量双通道PWM占空比

    stm32 cubemx 输入捕获 stm32 同一个定时器输入捕获测量双通道PWM占空比 . 最近在做蓝桥杯嵌入式的真题,发现在使用TIM3的通道1和2同时测量PWM1和PWM2的占空比时,硬件是不 ...

  6. STM32定时器-输入捕获

    定时器-输入捕获 输入捕获工作过程 一句话总结工作过程:通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较 ...

  7. STM32之通用定时器输入捕获模式

    #include "stm32f10x.h" /* RCC时钟配置 */ void RCC_config() {  ErrorStatus HSEStartUpStatus; /* ...

  8. 8. GD32F103C8T6 定时器-输入捕获测频率

    1采集方波频率 /*-----------------------输入捕获----------------------------*/void gpio_configuration(void) {/* ...

  9. STM32F103定时器输入捕获功能

      STM32F103单片机的定时器不仅能输出PWM波,而且还能捕获输入的PWM波.可以通过定时器的捕获功能测量输入PWM波的周期和占空比.其中定时器的输入捕获功能如下:   在输入捕获模式下,当检测 ...

最新文章

  1. 从 Gzip 压缩 SVG 说起 — 论如何减小资源文件的大小
  2. pygame做一个简单的打字游戏
  3. thinkphp集成系列之phpmailer批量发送邮件
  4. CCNP自学之路——eigrp--1
  5. 【转】Phong和Blinn-Phong光照模型
  6. 神牛笔记:吉林大学ACM总结(fennec)
  7. LeetCode 1085. 最小元素各数位之和
  8. 基于Spring Security的认证授权_认证原理_授权流程_Spring Security OAuth2.0认证授权---springcloud工作笔记126
  9. xugang 记录一个.NET 程序员的成长 asp.net水晶报表的一些问题
  10. matlab练习程序(图像放大/缩小,双立方插值)
  11. matlab半峰宽计算公式,半峰宽单位换算(峰宽与半峰宽转换公式)
  12. 有限元法基本思想和分类
  13. 解决微信小程序wx:if使用不了函数,WXS使用方法以及防踩坑
  14. Python学习历程-1-20180630
  15. 静态资源文件无法加载导致jsp页面渲染不成功问题
  16. 中缀表达式X=A+B*(C-(D+F))/E转后缀表达式之后是什么?
  17. 【Add_two_numbers】
  18. 图像分割-分水岭算法和GrabCut 算法
  19. 手机开机密码忘记了怎么办?
  20. java:如何解决汉字在记事本中编译翻译后出现乱码

热门文章

  1. 怎么通过python挣外快_利用Python爬虫轻松挣外快的几个方法(值得收藏)
  2. gx works2 存储器空间或桌面堆栈不足_保证安全的移动空间,超高安全品质的私家车推荐...
  3. yum 代理_教你如何在5分钟轻松部署nginx反向代理
  4. ascii码_umask,补码,ASCII码:稍微深入考虑一点
  5. 初识、理解生成器模式
  6. 谷歌让AI芯片学会“下崽”,下一代TPU就让AI自己设计
  7. 百度AI“杀入”新领域,我举双手支持!
  8. 1、RabbitMQ入门
  9. redis 一主二从
  10. NET(C#)连接各类数据库-集锦