GD32F103-TIMER模块

news2024/9/22 5:39:49

定时器是一个功能强大的外设。

一般功能:

  1. 定时中断,计时器,给定一个时间,到达时间后产生一个中断
  2. 定时器输出比较的功能,用于PWM波形的产生,驱动电机
  3. 定时器输入捕获,测频率

核心关键参数:

  1. 16位计数器
  2. 16位预分频器
  3. 16位自动重装载寄存器

比如高级定时器0,最大是108M,108M/65536/65536=39.76823……(最大定时时间)

如果你觉得时间不够,还可以使用定时器级联功能,三个定时器级联,就可以定时34万亿年。

高级/通用/基本

GD32F103只有三个定时器,一个高级Timer0,两个通用Timer1、2

计数模式

向上,向下,中央对齐。

其中中央对齐可以用在SVPWM控制算法中,产生三角载波。

影子寄存器/缓冲寄存器

预分频寄存器自动重载寄存器都是有影子寄存器的,只有在下一个周期你更改后的值才会生效。

问题1

不知道结构体这里为什么会报错?

解决办法

定时器-基本定时功能

#include "gd32f10x.h"                   // Device header

void Timer_Init(void)
{
	/* TIMER2 configuration */
	timer_parameter_struct Timer_initpara;
	
	rcu_periph_clock_enable(RCU_TIMER2);		//使能RCU_TIMER2时钟

	
	timer_deinit(TIMER1);
	
	/* initialize TIMER init parameter struct */
    timer_struct_para_init(&Timer_initpara);
	
	Timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
	Timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
	Timer_initpara.counterdirection = TIMER_COUNTER_UP;
	Timer_initpara.period = 10000 - 1;
	Timer_initpara.prescaler = 10800 - 1;
	Timer_initpara.repetitioncounter = 0;
	timer_init(TIMER2, &Timer_initpara);
	
	//手动把更新中断标志位清除一下,避免刚初始化完成就进入中断
	timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);
	
	/* TIMER2 channel control update interrupt enable */
	timer_interrupt_enable(TIMER2, TIMER_INT_UP);
	
	timer_enable(TIMER2);
	
	/* enable and set key EXTI interrupt to the specified priority */
    nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
    nvic_irq_enable(TIMER2_IRQn, 1U, 1U);
		
	
}


//void TIMER2_IRQHandler(void)
//{

//	if (timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_UP) == SET)
//	{
//		
//		timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);
//	}
//}
#include "gd32f10x.h"
#include "gd32f10x_libopt.h"
#include "systick.h"
#include "OLED.h"
#include "Timer.h"

uint16_t Num;

int main(void)
{
	OLED_Init();
	Timer_Init();
	

	OLED_ShowString(1, 1, "Num:");
	
	while (1)
	{
		OLED_ShowNum(1, 5, Num, 5);
		OLED_ShowNum(2, 5, timer_counter_read(TIMER2), 5);
		OLED_ShowNum(3, 5, timer_prescaler_read(TIMER2), 5);
	}                                      

}

void TIMER2_IRQHandler(void)
{

	if (timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_UP) == SET)
	{
		Num++;
		timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);
	}
}

定时器-外部时钟功能

外部时钟,配置输入捕获功能IC

  1. 输入捕获结构体
  2. 输入捕获引脚时钟、复用时钟、初始化引脚 输入上拉模式
  3. 输入捕获结构体配置
  4. 输入捕获从模式
#include "gd32f10x.h"                   // Device header

void Timer_Init(void)
{
	/* TIMER1 configuration */
	timer_parameter_struct Timer_initpara;
	timer_ic_parameter_struct timer_icinitpara;
	
	rcu_periph_clock_enable(RCU_TIMER1);		//使能RCU_TIMER1时钟
	rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_AF);
	gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
	
	
	timer_deinit(TIMER1);
	
	/* initialize TIMER init parameter struct */
    timer_struct_para_init(&Timer_initpara);
	
	Timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
	Timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
	Timer_initpara.counterdirection = TIMER_COUNTER_UP;
	Timer_initpara.period = 10 - 1;
	Timer_initpara.prescaler = 1 - 1;
	Timer_initpara.repetitioncounter = 0;
	timer_init(TIMER1, &Timer_initpara);
	
	 /* TIMER1 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    = 0x00;
    timer_input_capture_config(TIMER1, TIMER_CH_0, &timer_icinitpara);
	
	 /* slave mode selection : TIMER1 */
    /* TIMER1 input trigger : external trigger connected to CI0 */
    timer_input_trigger_source_select(TIMER1,TIMER_SMCFG_TRGSEL_CI0FE0);
    timer_slave_mode_select(TIMER1,TIMER_SLAVE_MODE_EXTERNAL0);
	
	
	//手动把更新中断标志位清除一下,避免刚初始化完成就进入中断
	timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP);
	
	/* TIMER2 channel control update interrupt enable */
	timer_interrupt_enable(TIMER1, TIMER_INT_UP);
	
	timer_enable(TIMER1);
	
	/* enable and set key EXTI interrupt to the specified priority */
    nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
    nvic_irq_enable(TIMER1_IRQn, 1U, 1U);
		
	
}


//void TIMER2_IRQHandler(void)
//{

//	if (timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_UP) == SET)
//	{
//		
//		timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);
//	}
//}

输出比较功能-PWM

输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形。

每个高级定时器和通用定时器都拥有4个输出比较通道。

高级定时器的前3个通道额外拥有死区生成和互补输出的功能。

死区时间的插入,确保了通道互补的两路信号不会同时有效。

呼吸灯

#include "gd32f10x.h"                   // Device header


void PWM_Init(void)
{
	//输出比较与定时器初始化结构体
	timer_oc_parameter_struct timer_ocintpara;
    timer_parameter_struct timer_initpara;
	
	//时钟 TIMER1 GPIOA
	rcu_periph_clock_enable(RCU_TIMER1);
	rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_AF);
	
	//PA1初始化 复用推挽输出
	gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1);
	
	timer_deinit(TIMER1);
	
	/* TIMER1 参数配置 */
    timer_initpara.prescaler         = 10800 - 1;  //PSC
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 100 - 1; //ARR
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER1,&timer_initpara);
	
	//输出比较参数配置
	timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;//高极性,不反转,REF直接输出
    timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;//输出使能
	timer_channel_output_config(TIMER1,TIMER_CH_1,&timer_ocintpara);
	
	 /* CH1 configuration in PWM mode1,duty cycle 0% */
    timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_1,0);//CCR 占空比
    timer_channel_output_mode_config(TIMER1,TIMER_CH_1,TIMER_OC_MODE_PWM0);//PWM模式0 模式1
    timer_channel_output_shadow_config(TIMER1,TIMER_CH_1,TIMER_OC_SHADOW_DISABLE);
	
	/* auto-reload preload enable */
    timer_auto_reload_shadow_enable(TIMER1);
    /* auto-reload preload enable */
    timer_enable(TIMER1);
}

void PWM_SetCompare1(uint16_t Compare)
{
	timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_1,Compare);
}
#include "gd32f10x.h"
#include "gd32f10x_libopt.h"
#include "systick.h"
#include "OLED.h"
#include "Timer.h"
#include "PWM.h"


uint8_t i;

int main(void)
{
	OLED_Init();
	PWM_Init();
	

	OLED_ShowString(1, 1, "Duty:   %");

	
	while (1)
	{
		for (i = 0; i <= 100; i++)
		{
			PWM_SetCompare1(i);
			Delay_ms(10);
			OLED_ShowNum(1, 6, i, 3);
		}
		for (i = 0; i <= 100; i++)
		{
			PWM_SetCompare1(100 - i);
			Delay_ms(10);
			OLED_ShowNum(1, 6, i, 3);
		}
		
		
	}                                      

}

输出比较-互补、死区时间、刹车

1.高级定时器只有 TIMER0 四通道定时器

通过配置互补通道PB13 PA8

配置刹车PB12

#include "gd32f10x.h"                   // Device header


void PWM_Init(void)
{
	//输出比较与定时器初始化结构体 刹车结构体
	timer_oc_parameter_struct timer_ocintpara;
    timer_parameter_struct timer_initpara;
	timer_break_parameter_struct timer_breakpara;
	
	//时钟 TIMER0 GPIOA GPIOB
	rcu_periph_clock_enable(RCU_TIMER0);
	rcu_periph_clock_enable(RCU_GPIOA);
	rcu_periph_clock_enable(RCU_GPIOB);
    rcu_periph_clock_enable(RCU_AF);
	
	//PA1初始化 复用推挽输出
	gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
	//PB13 互补通道初始化 复用推挽输出
	gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);
	 /* configure PB12(TIMER0 BKIN) as alternate function */
	gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_12);
	
	
	timer_deinit(TIMER0);
	
	/* TIMER0 参数配置 */
    timer_initpara.prescaler         = 108 - 1;  //PSC
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 600 - 1; //ARR
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER0,&timer_initpara);
	
	//输出比较参数配置
	timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;//输出使能
    timer_ocintpara.outputnstate = TIMER_CCXN_ENABLE;//互补输出使能
    timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;//高极性,不反转,REF直接输出
    timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;
    timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_HIGH;
    timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_HIGH;
	
	//通道选择
	timer_channel_output_config(TIMER0,TIMER_CH_0,&timer_ocintpara);
	
	 /* CH0 configuration in PWM mode1,duty cycle 0% */
    timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_0,0);//CCR 占空比
    timer_channel_output_mode_config(TIMER0,TIMER_CH_0,TIMER_OC_MODE_PWM0);//PWM模式0 模式1
    timer_channel_output_shadow_config(TIMER0,TIMER_CH_0,TIMER_OC_SHADOW_ENABLE);
	
	
	/* automatic output enable, break, dead time and lock configuration*/
    timer_breakpara.runoffstate     = TIMER_ROS_STATE_ENABLE;
    timer_breakpara.ideloffstate    = TIMER_IOS_STATE_ENABLE ;
    timer_breakpara.deadtime        = 164;
    timer_breakpara.breakpolarity   = TIMER_BREAK_POLARITY_LOW;
    timer_breakpara.outputautostate = TIMER_OUTAUTO_ENABLE;
    timer_breakpara.protectmode     = TIMER_CCHP_PROT_OFF;
    timer_breakpara.breakstate      = TIMER_BREAK_ENABLE;
    timer_break_config(TIMER0,&timer_breakpara);
	
	/* auto-reload preload enable */
//    timer_auto_reload_shadow_enable(TIMER0);
    
	/* TIMER0 primary output function enable */
    timer_primary_output_config(TIMER0,ENABLE);

    /* TIMER0 channel control update interrupt enable */
    timer_interrupt_enable(TIMER0,TIMER_INT_CMT);
    /* TIMER0 break interrupt disable */
    timer_interrupt_disable(TIMER0,TIMER_INT_BRK);
	
	nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3);
    nvic_irq_enable(TIMER0_TRG_CMT_IRQn, 0, 1);

    /* TIMER0 counter enable */
    timer_enable(TIMER0);
}



void PWM_SetCompare1(uint16_t Compare)
{
	timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_0,Compare);
}

互补输出:

死区时间:

刹车功能

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java+SpringBoot+vue+element实现新冠疫情物资管理系统详细设计

基于JavaSpringBootvueelement实现新冠疫情物资管理系统详细设计 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录基于…

文件IO----(open、close、read、write、lseek)

1.文件IO 介绍:&#xff08;系统IO、系统调用&#xff09; POSIX&#xff08;可移植操作系统接口&#xff09;定义的一组函数&#xff0c;不提供缓冲机制&#xff0c;每次读写操作都引起系统调用&#xff0c;核心概念是文件描述符&#xff0c;访问各种文件类型&#xff0c;Lin…

Keychron 键盘指南

文章目录QQ1Q2Q3Q4Q5KK1K2k3 && k3proK3 VS K7k6 && K6prok7K8k10K12K14CVV1V2V3V4V5V6SQ Q1 Q1 是一款革命性的全金属键盘&#xff0c;每个开关、键帽、稳定器、旋钮甚至面板都具有可定制的功能。它专为个性化体验和卓越的打字舒适度而设计。 双垫片设计…

Cadence PCB仿真使用Allegro PCB SI配置仿真库的方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,配置方法3,总结1,概述 本文简单介绍使用Allegro PCB SI软件选择需要仿真的网络的方法。 2,配置方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是Allegro PCB SI则可这样…

模型微调,低预算,高期望!

作为迁移学习中的常用技术&#xff0c;Fine-tuning&#xff08;微调&#xff09;已经成为了深度学习革命的重要部分。微调不需要针对新任务从头开始学习&#xff0c;只需要加载预训练模型的参数&#xff0c;然后利用新任务的数据进行一步训练模型即可。也可以说微调是对开放域任…

一文简单了解并部署Zookeeper集群

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a;蟹黄瓜子文章来源&#xff1a;GreatSQL社区投稿 1.Zookeeper概述 Zookeeper对于很多人开始可能都有所耳闻&am…

基于Java+SpringBoot+vue+element实现爱心捐赠平台系统

基于JavaSpringBootvueelement实现爱心捐赠平台系统 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码…

排他思想的运用

思路简述 需求&#xff1a;桌子上有一排灯&#xff0c;点哪个亮哪个&#xff0c;但是要求每次只能点亮一盏。如果不使用排他思想&#xff0c;操作过程如下&#xff1a; 第一次打开一盏灯&#xff0c;记为 A&#xff0c;记录下来。第二次打开灯之前&#xff0c;先去找记录&…

[cpp进阶]C++智能指针

文章目录为什么需要智能指针?智能指针的原理及使用智能指针的原理智能指针的使用C中的智能指针C智能指针的发展历程std::auto_ptrstd::auto_ptr的使用std::auto_ptr的模拟实现std::unique_ptrstd::unique_ptr的使用std::unique_ptr的模拟实现std::shared_ptrstd::shared_ptr的…

Springboot @InitBinder处理from-data表单传参,指定参数默认新增前缀

前言 有兄弟突然找到我&#xff0c;江湖救急&#xff0c;我以为是啥问题呢&#xff1f; 一看这位小兄弟也是半路出家&#xff0c; 没有对springboot的常用注解有过研究。 不过没大碍&#xff0c;还是那句话&#xff0c; 学习的事情&#xff0c;只有先知和后知 现在你看完这篇…

纳米软件分享:光伏逆变器ATE测试系统,逆变器测试解决方案

光伏并网逆变器&#xff08;以下简称“逆变器”&#xff09;是光伏发电系统的核心部件之一&#xff0c;其主要功能是将光伏阵列的直流逆变为符合电网接入要求的交流电并入电网。并网逆变器ATE测试平台&#xff0c;主要是模拟光伏阵列特性输入的直流电源、模拟电网电源、系统控制…

Java垃圾分类查询管理系统源码+数据库,基于SpringBoot+mybatis-plus,垃圾分类查询及预约上门回收

垃圾分类查询管理系统 完整代码下载地址&#xff1a;Java垃圾分类查询管理系统源码数据库 1.介绍 垃圾分类查询管理系统&#xff0c;对不懂的垃圾进行查询进行分类并可以预约上门回收垃圾。 让用户自己分类垃圾&#xff0c; 按国家标准自己分类&#xff0c; 然后在网上提交订…

java学习之main方法

目录 一、main方法的注意事项 二、在IDEA中传入参数 一、main方法的注意事项 形式&#xff1a;public static void main(String[] args){}&#xff0c;main方法是一个静态方法&#xff0c;访问修饰符是&#xff1a;public&#xff0c;形参是String数组 args 注意事项&#xf…

go语言--函数

package mainimport "fmt"func main(){//功能: 10 20var num1 int 10var num2 int 20var sum int 0sum num1sum num2fmt.Println(sum) }为什么使用函数 提高代码的复用性&#xff0c;减少代码冗余, 代码维护性也提高了 函数的定义 为完成摸一个功能的程序指令(…

IRCNN-FPOCS 文章解读

1、论文概述 1&#xff09;待解决的问题&#xff1a;地震道数据缺失&#xff08;野外地震数据的质量往往受到地质环境或设备参数的影响&#xff0c;这些数据可能在空间上不连续&#xff0c;导致地震痕迹缺失&#xff0c;也称为下采样观测&#xff09; 2&#xff09;目的&…

从菜鸟到团队协同大神:产品经理工具技能修炼

现在&#xff0c;自雇人士和自由职业者越来越普遍。受环境影响&#xff0c;员工们正在放弃朝九晚五的工作&#xff0c;转而采用更灵活的远程工作&#xff0c;另一方面&#xff0c;随着办公数字化转型、远程办公的需求强烈、在线协协同管理工具飞项等一批知名互联网工具如雨后春…

c#入门-捕获变量

局部变量捕获 局部函数&#xff0c;匿名函数&#xff0c;可以直接在函数体内使用局部变量。 如果作为委托使用&#xff0c;传递给别人。可能在别人使用委托的时候&#xff0c;这些局部变量的作用域就已经消失了。 因此&#xff0c;编译器会对这些变量做出特殊的操作&#xff…

优维低代码:I18n 国际化

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 连载…

第8季3:使用字库字符实现区域显示

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、代码框架分析 在第8季2&#xff1a;OSD实验演示与代码分析中&#xff0c;我们分析了SAMPLE_RGN_CreateVideoRegion函数&#xff0c;该函数完成了左下角的logo区域显示、右下角的时间区域显示&a…

Ubuntu18.04安装教程

Ubuntu18.04安装教程# 阿里云源 deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates ma…