当前位置: 首页 > news >正文

1-12 GD32基于定时器输入捕获

前言:


基于本人对相关知识回顾与思考,仅供学习参考


目录

前言:

1.0 输入捕获

 2.0 信号周期

3.0 定时器配置

4.0 定时器配置

5.0 定时器中断

后记:


1.0 输入捕获



 2.0 信号周期


获取信号周期的方法,在第一次捕获与第二次不会之间做差值运算,最后乘以计数周期得到信号周期。

还有月中方式是,在第一次获取计数寄存器数值时,将计数寄存器里面的数组设置为0,这样等到下一次计数时就能从0重新开始计数,通过这个方法就不用做差值运算了。


3.0 定时器配置


4.0 定时器配置


初始化GPIO 

static void GpioInit(void)
{rcu_periph_clock_enable(RCU_GPIOA);gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_10MHZ, GPIO_PIN_0);
}

开启GPIOA时钟,初始化GPIOA管脚,使用浮空输入,输入频率为10MHz,输入引脚为第0号引脚


使能定时器时钟

	// 使能定时器1时钟rcu_periph_clock_enable(RCU_TIMER1);// 复位定时器timer_deinit(TIMER1);

定时器初始化

	timer_parameter_struct timerInitPara;// 初始化定时器值timer_struct_para_init(&timerInitPara);// 设置预分频器的值timerInitPara.prescaler = 120 - 1;// 设置CRA重装计数器的值timerInitPara.period 	= 65536 - 1;// 定时器初始化timer_init(TIMER1, &timerInitPara);

定时器通道配置

	// 定时器输入捕获timer_ic_parameter_struct icInitPara;// 输入捕获通道赋初始值timer_channel_input_struct_para_init(&icInitPara);// 设置上升沿捕获/下降沿捕获icInitPara.icpolarity  = TIMER_IC_POLARITY_RISING;// 设置输入通道icInitPara.icselection = TIMER_IC_SELECTION_DIRECTTI;timer_input_capture_config(TIMER1, TIMER_CH_0, &icInitPara);

使能定时器

	// 清除定时器中断标志位timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_CH0);// 使能定时器中断timer_interrupt_enable(TIMER1, TIMER_INT_CH0);// 使能定时器中断优先级nvic_irq_enable(TIMER1_IRQn, 0, 0);// 使能定时器timer_enable(TIMER1);

5.0 定时器中断

static uint32_t g_icValue;void TIMER1_IRQHandler(void)
{if (timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_CH0) == SET){timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_CH0);// 读取输入捕获寄存器里面的数值g_icValue = timer_channel_capture_value_register_read(TIMER1, TIMER_CH_0) + 1;// 将计数寄存器的数值清除为 0 timer_counter_value_config(TIMER1, 0);}
}void CaptureDrvInit(void)
{GpioInit();TimerInit();
}void CaptureDrvTest(void)
{printf("period is %d us.\n", g_icValue);DelayNms(500);
}

6.0 全部程序

|---------------------capture_drv.h---------------------|-------------------------
#ifndef _CAPTURE_DRV_H_
#define _CAPTURE_DRV_H_void CaptureDrvInit(void);
void CaptureDrvTest(void);
#endif|---------------------capture_drv.c---------------------|-------------------------
#include <stdint.h>
#include <stdio.h>
#include "gd32f30x.h"
#include "delay.h"static void GpioInit(void)
{rcu_periph_clock_enable(RCU_GPIOA);gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_10MHZ, GPIO_PIN_0);
}static void TimerInit(void)
{// 使能定时器1时钟rcu_periph_clock_enable(RCU_TIMER1);// 复位定时器timer_deinit(TIMER1);timer_parameter_struct timerInitPara;// 初始化定时器值timer_struct_para_init(&timerInitPara);// 设置预分频器的值timerInitPara.prescaler = 120 - 1;// 设置CRA重装计数器的值timerInitPara.period 	= 65536 - 1;// 定时器初始化timer_init(TIMER1, &timerInitPara);// 定时器输入捕获timer_ic_parameter_struct icInitPara;// 输入捕获通道赋初始值timer_channel_input_struct_para_init(&icInitPara);// 设置上升沿捕获/下降沿捕获icInitPara.icpolarity  = TIMER_IC_POLARITY_RISING;// 设置输入通道icInitPara.icselection = TIMER_IC_SELECTION_DIRECTTI;timer_input_capture_config(TIMER1, TIMER_CH_0, &icInitPara);// 清除定时器中断标志位timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_CH0);// 使能定时器中断timer_interrupt_enable(TIMER1, TIMER_INT_CH0);// 使能定时器中断优先级nvic_irq_enable(TIMER1_IRQn, 0, 0);// 使能定时器timer_enable(TIMER1);
}static uint32_t g_icValue;void TIMER1_IRQHandler(void)
{if (timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_CH0) == SET){timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_CH0);// 读取输入捕获寄存器里面的数值g_icValue = timer_channel_capture_value_register_read(TIMER1, TIMER_CH_0) + 1;// 将计数寄存器的数值清除为 0 timer_counter_value_config(TIMER1, 0);}
}void CaptureDrvInit(void)
{GpioInit();TimerInit();
}void CaptureDrvTest(void)
{printf("period is %d us.\n", g_icValue);DelayNms(500);
}

编译结果:

后记:

......

http://www.lryc.cn/news/499904.html

相关文章:

  • 前端基础的讲解-JS(22)
  • Minecraft-Datapack数据包开发3-进度与成就
  • 泷羽sec-shell编程(3)
  • 如何解决压测过程中JMeter堆内存溢出问题
  • 爬虫项目基础知识详解
  • uniapp 微信小程序webview 和 h5数据通信
  • SSM01-MyBatis框架(一文学会MyBatis)
  • 【PlantUML系列】状态图(六)
  • JS中重排和重绘的区别是什么?
  • 工业—使用Flink处理Kafka中的数据_ProduceRecord2
  • C 库中的断言与 FreeRTOS 中的 trace 宏
  • JAVAWeb中的Servlet学习
  • docker安装ddns-go(外网连接局域网)
  • 时间复杂度度详解
  • 如何处理和优化大文件上传和下载
  • QT 线程锁
  • 光猫开DMZ教程
  • 分区之间的一种度量方法-覆盖度量(Covering Metric)
  • cocos creator接入字节跳动抖音小游戏JSAPI敏感词检测(进行文字输入,但输入敏感词后没有替换为*号)
  • 13.Java IO 流(文件流、字符流、字符处理流、字节处理流、对象处理流、标准流、转换流、打印流、Properties 配置文件、其他流)
  • 掌握 DOM 操作:让你的网页动起来
  • JVM整理部分面试题
  • ubuntu20 使用 pyspacemouse获取 spacemouse wireless 输入
  • windows下Qt5自动编译配置QtMqtt环境(11)
  • 速盾:高防cdn有哪些冷知识?
  • 全面UI组件库Telerik 2024 Q4全新发布——官方宣布支持.NET 9
  • 电脑投屏到电脑:Windows,macOS及Linux系统可以相互投屏!
  • 12.6深度学习_模型优化和迁移_模型移植
  • Grid++Report:自定义模板设计(自由表格使用),详细教程
  • [Collection与数据结构] 位图与布隆过滤器