GD32F103VET输出PWM波形

这篇具有很好参考价值的文章主要介绍了GD32F103VET输出PWM波形。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

GD32F103VET将TIMER0_CH3映射到PE14引脚,使其输出PWM波形。测试时,使用示波器看PE14引脚输出的波形,效果更直观。

TIMER0之PWM输出引脚映射如下:
TIMER0_REMAP[1:0]="00"(没有映射):
TIMER0_CH0默认被映射到PA8引脚
TIMER0_CH1默认被映射到PA9引脚
TIMER0_CH2默认被映射到PA10引脚
TIMER0_CH3默认被映射到PA11引脚

TIMER0_REMAP[1:0]="01"(部分映射):
TIMER0_CH0被映射到PA8引脚
TIMER0_CH1被映射到PA9引脚
TIMER0_CH2被映射到PA10引脚
TIMER0_CH3被映射到PA11引脚

TIMER0_REMAP[1:0]="11"(全映射):
TIMER0_CH0被映射到PE9引脚
TIMER0_CH1被映射到PE11引脚
TIMER0_CH2被映射到PE13引脚
TIMER0_CH3被映射到PE14引脚
 

测试程序如下:

#include "PWM0.h"

/*
PWM输出引脚映射如下:
TIMER0_REMAP[1:0]="00"(没有映射):
TIMER0_CH0默认被映射到PA8引脚
TIMER0_CH1默认被映射到PA9引脚
TIMER0_CH2默认被映射到PA10引脚
TIMER0_CH3默认被映射到PA11引脚
rcu_periph_clock_enable(RCU_GPIOA);//使能TIMER0_CH0引脚的外设时钟
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);

TIMER0_REMAP[1:0]="01"(部分映射):
TIMER0_CH0被映射到PA8引脚
TIMER0_CH1被映射到PA9引脚
TIMER0_CH2被映射到PA10引脚
TIMER0_CH3被映射到PA11引脚
rcu_periph_clock_enable(RCU_AF);		//使能映射功能的时钟
gpio_pin_remap_config(GPIO_TIMER0_PARTIAL_REMAP, ENABLE);//设置为部分映射
rcu_periph_clock_enable(RCU_GPIOA);//使能TIMER0_CH0引脚的外设时钟
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);

TIMER0_REMAP[1:0]="11"(全映射):
TIMER0_CH0被映射到PE9引脚
TIMER0_CH1被映射到PE11引脚
TIMER0_CH2被映射到PE13引脚
TIMER0_CH3被映射到PE14引脚
rcu_periph_clock_enable(RCU_AF);		//使能映射功能的时钟
gpio_pin_remap_config(GPIO_TIMER0_FULL_REMAP, ENABLE);
rcu_periph_clock_enable(RCU_GPIOE);//使能GPIOE端口的外设时钟
gpio_init(GPIOE, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14);
*/
void PWM0_Interrupt_Initializtion(uint16_t arr,uint16_t psc);

//函数功能:PWM0初始化,将PE14用作TIMER0_CH3引脚,输出PWM波形
//arr:自动重装值。
//psc:时钟预分频数
//PWM0_Interrupt_Initializtion(TIMER0,50000,1080);//当arr=50000,psc=1080时,则为500ms,误差为10us;
void PWM0_Interrupt_Initializtion(uint16_t arr,uint16_t psc)
{
	timer_parameter_struct TimerParameterStruct;
	timer_oc_parameter_struct Timer_OC_ParameterStruct;

/初始化TIMER0_CH3引脚开始
	rcu_periph_clock_enable(RCU_AF);		//使能映射功能的时钟
	gpio_pin_remap_config(GPIO_TIMER0_FULL_REMAP, ENABLE);
	//TIMER0_REMAP[1:0]="11"(全映射),将TIMER0_CH3映射到PE4引脚
	//TIMER0_REMAP[1:0]="01"(部分映射),将TIMER0_CH3映射到PA11引脚
	//TIMER0_REMAP[1:0]="00"(没有映射),默认将TIMER0_CH3映射到PA11引脚
	rcu_periph_clock_enable(RCU_GPIOE);//使能GPIOE端口的外设时钟
	gpio_init(GPIOE, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14);
	//配置GPIOE14的工作模式为复用功能IO推挽输出和输出速度最大为50MHz
	//将PE14用作TIMER0_CH3引脚,输出PWM波形
/初始化TIMER0_CH3引脚结束

/初始化TIMER0计数器开始
	rcu_periph_clock_enable(RCU_TIMER0);      //使能TIMER0的APB2外设时钟
	//nvic_irq_enable(TIMER0_UP_IRQn, 2U, 0U);  //设置TIMER0_UP_IRQn的中断优先级,抢占优先级为2,子优先级为0

	timer_deinit(TIMER0);                 //复位TIMERx

	TimerParameterStruct.period            = arr-1; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
	TimerParameterStruct.prescaler         = psc-1; //设置用来作为TIMx时钟频率除数的预分频值(APB2时钟分频值)
	TimerParameterStruct.clockdivision     = TIMER_CKDIV_DIV1;   //设置时钟分母值为1
	//计算公式:arr*psc/108000000/1,当arr=250,psc=108时,则为0.25ms,误差为1us;
	TimerParameterStruct.counterdirection  = TIMER_COUNTER_UP;   //设置计数方向为"向上计数"
	TimerParameterStruct.alignedmode       = TIMER_COUNTER_EDGE; //设置为无中央对齐计数模式(边沿对齐模式)
	TimerParameterStruct.repetitioncounter = 0;                  //设置"重复计数次数"为0
	timer_init(TIMER0,&TimerParameterStruct);//根据TimerParameterStruct所指向的参数初始化TIMERx的时间基数单位

	timer_counter_value_config(TIMER0,0);//设置TIMERx的计数器初始值为0
	//timer_counter_read(TIMER0);//读取TIMERx的计数器值
/初始化TIMER0计数器结束

/初始化PWM0在TIMER0_CH3引脚输出电平的极性开始
  Timer_OC_ParameterStruct.outputstate  = TIMER_CCX_ENABLE;        //"通道引脚输出"使能
	Timer_OC_ParameterStruct.ocidlestate  = TIMER_OC_IDLE_STATE_LOW; //通道引脚空闲时输出为低电平
	Timer_OC_ParameterStruct.ocpolarity   = TIMER_OC_POLARITY_HIGH;  //通道引脚输出极性为高电平

	Timer_OC_ParameterStruct.outputnstate = TIMER_CCXN_DISABLE;      //"互补通道引脚输出"不使能
	Timer_OC_ParameterStruct.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;//互补通道引脚空闲时输出为高电平
	Timer_OC_ParameterStruct.ocnpolarity  = TIMER_OCN_POLARITY_HIGH; //互补通道引脚输出极性为高电平

	timer_channel_output_config(TIMER0,TIMER_CH_3,&Timer_OC_ParameterStruct);
	//根据Timer_OC_ParameterStruct所指定的参数初始化TIMER0通道0

	timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_3,250);
	//设置初始占空比为250/500

	timer_channel_output_mode_config(TIMER0,TIMER_CH_3,TIMER_OC_MODE_PWM0);
	//设置通道输出比较模式:PWM0模式
	//在向上计数时,一旦计数器值小于TIMERx_CH0CV时,O0CPRE为高电平,否则为低电平,这里是向上计数;
	//在向下计数时,一旦计数器的值大于TIMERx_CH0CV时,O0CPRE为低电平,否则为高电平;

	timer_channel_output_shadow_config(TIMER0,TIMER_CH_3,TIMER_OC_SHADOW_DISABLE);
	//禁止"通道0输出/比较影子寄存器"

	timer_primary_output_config(TIMER0,ENABLE);//使能TIMER0输出比较功能
/初始化PWM0在TIMER0_CH3引脚输出电平的极性结束

  timer_auto_reload_shadow_enable(TIMER0);//使能TIMERx自动重装载
/*
	timer_flag_clear(TIMER0,TIMER_FLAG_UP);               //清除"TIMERx更新标志位"
	timer_interrupt_flag_clear(TIMER0,TIMER_INT_FLAG_UP); //清除"TIMERx更新中断标志位"
	timer_interrupt_enable(TIMER0,TIMER_INT_UP);          //使能"TIMERx更新"产生中断

  timer_internal_clock_config(TIMER0);//设置"内部时钟"作为定时器时钟
	//timer_slave_mode_select(TIMER0,TIMER_SLAVE_MODE_DISABLE);
	//设置"关闭从模式",如果TIMER计数器使能,则预分频器直接由内部时钟驱动
*/
	timer_enable(TIMER0);//TIMERx计数器使能,开始工作
}
#include "LED.h"

void LED_Init(void);

//函数功能:初始化MCU_Led
void LED_Init(void)
{
	rcu_periph_clock_enable(RCU_GPIOD);//使能GPIOD时钟,enable GPIO clock

	gpio_init(GPIOD, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
	//将GPIOD15设置为输出上拉

	MCU_Led_Off();
//	GPIO_BC(GPIOD) = GPIO_PIN_15;//清除GPIOD15输出,GPIO bit clear register
}
#ifndef __LED_H
#define __LED_H

#include "gd32f10x.h" //使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t

#define MCU_Led_Off()  GPIO_BOP(GPIOD)=GPIO_PIN_15  //GD15输出高电平
#define MCU_Led_On() GPIO_BC(GPIOD)=GPIO_PIN_15   //GD15输出低电平
#define MCU_Led_Toggle() gpio_bit_write( GPIOD,GPIO_PIN_15,(bit_status)((1-gpio_input_bit_get(GPIOD,GPIO_PIN_15))) )
//GD15取反输出电平

extern void LED_Init(void);

#endif

main.c程序如下:

#include "gd32f10x.h" //使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t
#include "delay.h"

#include "LED.h"
#include "PWM0.h"

int main(void)
{
	int16_t i = 0;
	FlagStatus breathe_flag = SET;

	//NVIC_PRIGROUP_PRE4_SUB0:抢占优先级为4bit(取值为0~15),子优先级为0bit(没有响应优先级)
	//NVIC_PRIGROUP_PRE3_SUB1:抢占优先级为3bit(取值为0~7),子优先级为1bit(取值为0~1)
	//NVIC_PRIGROUP_PRE2_SUB2:抢占优先级为2bit(取值为0~3),子优先级为2bit(取值为0~3)
	//NVIC_PRIGROUP_PRE1_SUB3:抢占优先级为1bit(取值为0~1),子优先级为3bit(取值为0~7)
	//NVIC_PRIGROUP_PRE0_SUB4:抢占优先级为0bit(没有抢占优先级),子优先级为3bit(取值为0~15)
	nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);//设置系统中断优先级"抢占优先级为4bit,子优先级为0bit"
  INTX_ENABLE();//开启所有中断

	LED_Init();//初始化MCU_Led
	delay_init();//系统时钟配置

	PWM0_Interrupt_Initializtion(50000,1080);
	//PWM0初始化,将PE14用作TIMER0_CH3引脚,输出PWM波形
	//设置PWM0周期为500ms,误差为10us;

	while(1)
	{
		delay_ms(40);
		if (SET == breathe_flag)
		{
			i = i + 10;
		}
		else
		{
			i = i - 10;
		}

		if(i>500)
		{
			breathe_flag = RESET;
	  }
		if(i<=0)
		{
			breathe_flag = SET;
		}
		timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_3,i);
		//每隔40ms,修改TIMER0_CH0引脚输出占空比为i/500
		MCU_Led_Toggle();
	}
}

GD32F103VET输出PWM波形,单片机,嵌入式硬件,GD32

 文章来源地址https://www.toymoban.com/news/detail-631322.html

到了这里,关于GD32F103VET输出PWM波形的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【单片机】STM32单片机,定时器,多路PWM,TIM1、TIM2、TIM3、TIM4,STM32F103

    下图是定时器相关引脚: 在《STM32中文参考手册V10.pdf》有写: TIM1 的PWM是带互补输出的,较为高级和复杂,有兴趣可以参考其他介绍文章,这里的代码让7个引脚输出PWM。 调用: 这里没有重映射,注意不能把PA9 PA10 初始化成串口去了。 timer.c timer.h 调用: 这里没有重映射。

    2024年02月11日
    浏览(69)
  • Proteus仿真stm32f103r6输出PWM/正弦波

    Proteus仿真stm32f103r6输出PWM/正弦波  

    2024年01月23日
    浏览(51)
  • stm32f103单片机—编码器测速

    stm32f103ZET6开发板(非指定) MG513P3012V型号电机(带霍尔编码器)(非指定) 此种测速方法要求单片机的定时器具有编码器模式,对于stm32f1系列,具备编码器模式的定时器有TIM1/2/3/4/5/8, 定时器使用通道1、2来实现编码器功能 ,接线时注意把A/B相接到定时器通道1/2的引脚。 电

    2024年02月06日
    浏览(76)
  • 关于两个STM32F103系列单片机的蓝牙通信

       毕设做的是掌控小车,因此采用蓝牙通信作为小车和手部通信,前段时间做出实物,对其遇到的问题以及解决的方法做一些总结。一个主控芯片采用STM32F103ZET6,另一个主控芯片采用STM32F103C8T6,原因是本来准备了两个主控C8T6,不小心烧了一个。 1.两个蓝牙的配对  需要准

    2024年02月13日
    浏览(63)
  • STM32F103ZE单片机呼吸灯源代码

    本实验采用的系统频率SYSTIM为8MHZ,如果频率改变需要修改一个数值

    2024年02月09日
    浏览(53)
  • stm32f103VET6和stm32f103c8t6有什么区别?

    我来终结下这个问题。 这两款单片机我都用过,其中无际单片机特训营其中一款wifi报警主机项目就是用了stm32f103c8t6。  stm32f103VET6和stm32f103c8t6都是STMicroelectronics公司推出基于ARM Cortex-M3内核的单片机。 它们在硬件规格和性能上存在一些差异,下面我详细讲解下它们的差异之处

    2024年02月15日
    浏览(66)
  • JDY-31蓝牙模块远程控制STM32F103单片机

       手机app通过蓝牙模块发送指令实时控制单片机的外设功能,比如发送衣柜开关门指令(舵机旋转),衣架上升降落(步进电机正转反转),远程开启去污除湿功能(继电器控制打开关闭小风扇+加热片)。 本次例子:手机APP连接蓝牙模块远程控制SG90舵机正转(0-180°)和反

    2024年02月01日
    浏览(74)
  • (STM32F103单片机)DHT11温湿度传感器

    目录   一,产品介绍 二,产品亮点 三,产品参数 四,引脚连接及通信说明  五,原理讲解 六,源码 1,DHR11.C 2.DHR11.H 3,main.c DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高

    2023年04月08日
    浏览(56)
  • 【单片机】STM32单片机的各个定时器的定时中断程序,标准库,STM32F103

    高级定时器和普通定时器的区别(https://zhuanlan.zhihu.com/p/557896041): TIM1是高级定时器,使用的时钟总线是RCC_APB2Periph_TIM1,和普通定时器不一样。 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用

    2024年02月07日
    浏览(58)
  • 基于STM32F103C8T6的端口重映射及定时器输出PWM控制

    #一、端口重映射原理及部分/完全重映射 #二、端口重映射的配置 #三、PWM控制 ##1、通用定时器输出PWM ##2、PWM的工作原理 ##3、PWM的内部运作机制 ##4、PWM的模式 ##5、自动加载的预载寄存器 #四、定时器输出PWM结构体及库函数的配置 #五、项目硬件 #六、项目代码 一、端口重映射

    2024年02月13日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包