利用GD32F470的定时器实现频率和占空比测试

1)main函数代码如下:

#include "gd32f4xx.h"
#include <stdio.h>
#include "gd32f470i_eval.h"
#include "systick.h"

void TIM_PwmInit(void)
{
    rcu_periph_clock_enable(RCU_GPIOA);

    /* PWM输出管脚为复用推挽模式 */
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE,GPIO_PIN_1);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_1);
    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_1);
	
    /* PWM输入管脚为浮空输入模式 */
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE,GPIO_PIN_6);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_6);
    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_6);
	
    /* TIMER1初始化 */
    timer_oc_parameter_struct timer_ocintpara = {0};
    timer_parameter_struct timer_initpara = {0};

    rcu_periph_clock_enable(RCU_TIMER1);

    timer_deinit(TIMER1);
		
    timer_initpara.prescaler         = (108 - 1);  // 预分频:108MHz / 108 = 1MHz
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;  // 边沿对齐计数
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;  // 向上计数
    timer_initpara.period            = (1000 - 1);  // 周期:1MHz / 1000 = 1000Hz  注: 下面设置的占空比必须小于等于period,否则错误;
    timer_init(TIMER1, &timer_initpara);

    /* 配置所有通道为PWM模式0 */
    timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;  // 通道输出极性高,即高电平有效
    timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;  // 使能输出通道
    timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;  // 输出通道空闲低电平

    timer_channel_output_config(TIMER1,TIMER_CH_1, &timer_ocintpara);

    /* 配置通道1为25%占空比 */
    timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_1, (250 - 1));  // 250 / 1000 = 25%
    timer_channel_output_mode_config(TIMER1,TIMER_CH_1, TIMER_OC_MODE_PWM0);  // 配置为PWM模式0
    timer_channel_output_shadow_config(TIMER1,TIMER_CH_1, TIMER_OC_SHADOW_DISABLE);  // 关闭输出影子

    timer_auto_reload_shadow_enable(TIMER1);  // 使能重装载影子
    timer_enable(TIMER1);  // 使能定时器1

    /* 初始化TIMER2 */
    timer_ic_parameter_struct timer_icinitpara = {0};
    
    rcu_periph_clock_enable(RCU_TIMER2);

    timer_deinit(TIMER2);

    timer_initpara.prescaler         = (108 - 1);  // 预分频:108MHz / 108 = 1MHz
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;  // 边沿对齐计数
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;  // 向上计数模式
    timer_initpara.period            = (65536 - 1);  // 周期最好设置为最高,以免计数器溢出
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;  // 输入时钟1分频
    timer_init(TIMER2,&timer_initpara);

    timer_icinitpara.icpolarity  = TIMER_IC_POLARITY_RISING;  // 输入极性为上升沿,即上升沿有效
    timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;  // 输入捕获通道连接至CIx
    timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;  // 时钟1分频
    timer_icinitpara.icfilter    = 0x0;
    timer_input_pwm_capture_config(TIMER2, TIMER_CH_0, &timer_icinitpara);

    timer_input_trigger_source_select(TIMER2, TIMER_SMCFG_TRGSEL_CI0FE0);  // 输入触发源为通道0
    timer_slave_mode_select(TIMER2, TIMER_SLAVE_MODE_RESTART);  // 从模式选择为复位模式
    timer_master_slave_mode_config(TIMER2, TIMER_MASTER_SLAVE_MODE_ENABLE);  // 使能从模式

    timer_auto_reload_shadow_enable(TIMER2);  // 使能重装载影子
    
    nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);  // 抢占优先级4位,响应优先级0位
    nvic_irq_enable(TIMER2_IRQn, 1, 0);  // 使能中断服务,抢占优先级为1
    
    timer_interrupt_flag_clear(TIMER2, TIMER_INT_CH0);  // 清除通道0中断标志位
    timer_interrupt_enable(TIMER2, TIMER_INT_CH0);  // 使能通道0中断

    timer_enable(TIMER2);  // 使能定时器2
}

int fputc(int ch, FILE *f)
{
    usart_data_transmit(EVAL_COM0, (uint8_t)ch);
    while (RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE));
    return ch;
}

extern __IO uint16_t dutycycle;
extern __IO uint16_t frequency;
int main(void)
{
    systick_config();
    TIM_PwmInit();
    gd_eval_com_init(EVAL_COM0);
	
    while(1)
    {
        printf("dutycycle: %d%%, frequency: %dHz\n", dutycycle, frequency);
        delay_1ms(1000);
    }
}

2)中断函数如下所示(gd32f4xx_it.c):

uint32_t ic1value = 0, ic2value = 0;
__IO uint16_t dutycycle = 0;
__IO uint16_t frequency = 0;

void TIMER2_IRQHandler(void)
{
    if(SET == timer_interrupt_flag_get(TIMER2, TIMER_INT_CH0))
    {
        timer_interrupt_flag_clear(TIMER2, TIMER_INT_CH0);  // 清除中断标志位
        
        ic1value = timer_channel_capture_value_register_read(TIMER2, TIMER_CH_0) + 1;

        if(0 != ic1value)
        {
            
            ic2value = timer_channel_capture_value_register_read(TIMER2, TIMER_CH_1) + 1;

            dutycycle = (ic2value * 100) / ic1value;  // 计算占空比
            frequency = (float)1000000 / ic1value;  // 计算频率
        }
        else
        {
            dutycycle = 0;
            frequency = 0;
        }
    }
}

3)测试方法:PA6与PA1用镊子短接,用示波器连接信号,串口打开,如下图所示:
在这里插入图片描述
从上图可知道,频率是927赫兹,(目标代码应该是1000HZ),有一定误差,

在这里插入图片描述
上图示波器测试的占空比是25%;
4)打开串口,查看GD32F470测试的结果,如下图所示:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一次压测引发的数据库 CPU 飙升

作者&#xff1a;昀鹤 一次压测过程中&#xff0c;当数据库的 qps 和 tps 都正常时&#xff0c;如果 cpu 利用率异常的高&#xff0c;应该如何排查&#xff1f;希望通过这篇文章&#xff0c;给你一些启发... 一、业务背景 业务需要控制频道内兑换现金的数量&#xff0c;于是在…

肆拾玖坊三级众筹模式玩法揭秘,白酒体验馆运作模式

发展至今&#xff0c;肆拾玖坊已积累了数百万忠实用户&#xff0c;拥有100多家分销商、5000多个新零售终端&#xff0c;覆盖全国34个省级行政区域、200余地市、1500个县区。成为中国创业界和酒行业的“现象级”企业。 今天&#xff0c;我们就来深入解析肆拾玖坊的营销模式&…

智能猫砂盆效果这么惊艳吗?绝对不踩雷的智能猫砂盆合集来啦

身为一个铲屎官&#xff0c;我深受“天天铲屎”的困扰。想要片刻放松都不行&#xff0c;因为猫砂盆一旦堆积屎尿&#xff0c;尤其在夏天&#xff0c;会迅速发臭&#xff0c;滋生细菌。对猫而言&#xff0c;不清理猫砂盆会让它们感到不适&#xff0c;可能引发疾病或拒绝使用猫砂…

C#唯一进程的处理Winform/WPF

C#唯一进程的处理 1.使用进程&#xff08;Process&#xff09;判断winformWPF执行效果&#xff1a; 2.使用互斥体&#xff08;Metux&#xff09;实现winformWPF实现效果&#xff1a; 在C#客户端&#xff08;Winform/WPF&#xff09;开发过程中&#xff0c;有的情况需要确保程序…

ubuntu22.04安装onlyoffice社区版

安装unbuntu22.04 https://blog.csdn.net/qq_36437991/article/details/135915360 安装onlyoffice sudo apt-get update sudo apt-get upgradepostgresql sudo apt-get install postgresql创建用户和数据库 sudo -i -u postgres psql -c "CREATE USER onlyoffice WIT…

ERP系统品牌大比拼:哪款产品更适合您的企业?

ERP集成了企业的销售、采购、生产、财务等各个环节&#xff0c;实现了资源的优化配置和信息的实时共享。然而&#xff0c;面对市场上琳琅满目的ERP系统产品&#xff0c;许多企业却陷入了选择的困境。 “哪款ERP系统更适合我的企业呢&#xff1f;”这或许是每一位企业决策者心中…

【STM32】SysTick系统滴答定时器

1.SysTick简介 CM4内核的处理和CM3一样&#xff0c;内部都包含了一个SysTick定时器&#xff0c;SysTick 是一个24 位的倒计数定时器&#xff0c;当计到0 时 &#xff0c;将 从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除&#xf…

免费ai写作?这三款软件是你的好帮手!

在信息爆炸的今天&#xff0c;自媒体已成为越来越多人展现自我、分享知识的平台。然而&#xff0c;对于许多自媒体创作者来说&#xff0c;写作过程中的灵感枯竭、文笔不畅等问题常常困扰着他们。幸运的是&#xff0c;随着人工智能技术的飞速发展&#xff0c;免费AI写作软件应运…

MyBatisPlus基础学习

一、简介 二、集成MP 三、入门HelloWorld 四、条件构造器EntityWrapper 五、ActiveRecord(活动记录 ) 六、代码生成器 七、插件扩展 八、自定义全局操作 九、公共字段自动填充 十、Oracle主键Sequence 十一、Idea快速开发插件 十二、mybatis-plus实践及架构原理

一文带你全面详细了解安全运维

一、安全运维-网络 1、IP地址相关 IP地址属于网络层地址&#xff0c;用于标识网络中的节点设备。 IP地址由32bit构成&#xff0c;每8bit一组&#xff0c;共占用4个字节。 IP地址由两部分组成&#xff0c;网络位和主机位。 IP地址分类&#xff1a; 类别网络位子网掩码私有地…

【OceanBase诊断调优】 —— DDL时报磁盘不足问题排查

1. 背景 由于在4.x的部分版本中&#xff0c;我们对于一些ddl操作还存在磁盘空间放大问题&#xff0c;本文主要介绍了这一类问题的排查。 2. 问题排查 2.1 整体排查链路 2.2 问题现象 DDL过程中报磁盘空间不足&#xff0c;需要确认是否符合预期&#xff0c;如果是符合预期&a…

告别数据孤岛,Xinstall助力App广告投放实现全渠道归因!

在移动互联网时代&#xff0c;App的推广和运营已成为企业不可或缺的一部分。然而&#xff0c;面对五花八门的广告渠道和繁杂多样的投放方式&#xff0c;如何有效追踪广告和渠道效果&#xff0c;如何甄别和选择流量渠道&#xff0c;成为了众多App开发商和运营者头疼的问题。幸运…

Qt制作程序启动界面类QSplashScreen实例测试详解

目录 一、QSplashScreen的概述 二、QSplashScreen静态图片加载 1、主程序实现 2、mainwindow.h实现 3、mainwindows.cpp实现 三、QSplashScreen动态图片加载 1、主程序实现 2、mainwindow.h实现 3、mainwindows.cpp实现 一、QSplashScreen的概述 QSplashScreen&#x…

LabVIEW电磁超声热态金属在线缺陷检测系统

LabVIEW软件开发的电磁超声热态金属在线缺陷检测系统针对极端高温环境下的金属材料&#xff0c;进行实时、无损的缺陷检测&#xff0c;具有高精度和高可靠性&#xff0c;能够显著提高材料质量控制的效率和准确性。 项目背景 随着工业技术的发展&#xff0c;高温环境下的金属材…

SQL Server入门-SSMS简单使用(2008R2版)-1

环境&#xff1a; win10&#xff0c;SQL Server 2008 R2 参考&#xff1a; SQL Server 新建数据库 - 菜鸟教程 https://www.cainiaoya.com/sqlserver/sql-server-create-db.html 第 2 课&#xff1a;编写 Transact-SQL | Microsoft Learn https://learn.microsoft.com/zh-cn/…

day01-anaconda的安装

Anaconda的安装 参考地址&#xff1a; http://t.csdnimg.cn/mUmSp 安装完毕&#xff0c;可以卸载电脑中的其他python版本&#xff0c;在控制面板中进行卸载。 在命令行指令中输入 pythonPython 3.8.3 (default, Jul 2 2020, 17:30:36) [MSC v.1916 64 bit (AMD64)] :: An…

DSP应用市场的大蛋糕,国产厂商能吃下多少?

DSP是数字信号处理器&#xff08;Digital Signal Processor&#xff09;的简称&#xff0c;是一种专门用于高速数学运算的微处理器。DSP能够快速且准确地处理数字信号&#xff0c;同时具备可编程和低功耗等特点&#xff0c;如今在各个领域发挥着越来越重要的作用。 &#xff08…

【Spine学习11】之 战士攻击动作 思路总结(手动调整贝塞尔曲线实现前快后慢)

拿到一份psd文件先观察检查一下图片顺序有没有问题&#xff0c; 重点看一下人物的腿部分层&#xff0c;&#xff08;如果是大小腿分开画的就网格可打可不打&#xff0c;如果是连在一起画的&#xff0c;那必须打网格&#xff09; 拿着剑的时候剑和手的层级有没有错位&#xff0c…

六、在Qt下通过PCL在VTK9.3.0下显示自己的pcd点云文件

前几天刚整理好VTK8.2.0&#xff0c;发现我们的项目使用的PCL自带的VTK是9.3.0的&#xff0c;脸黑了快 VTK8.2.0可参考该篇博文&#xff1a;五、在Qt下加载QVTKWidget控件&#xff08;VTK8.2.0&#xff09;&#xff0c;生成Visual Studio项目&#xff0c;显示点云&#xff08;C…

02 Shell 编程之条件语句

目录 2.1 条件测试语句 2.1.1 文件测试 2.1.2 整数值比较 2.1.3 字符串比较 2.1.4 逻辑测试 2.2 if 条件语句 2.2.1 if 语句的结构 1. 单分支if 语句 2. 双分支if 语句 3. 多分支if 语句 2.2.2 if 语句应用示例 1. 单分支if 语句应用 2. 双分支if 语句应用 3. 多分支if 语句应…