GD32F303高级定时器输出互补PWM-开发笔记

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

GD32F303高级定时器timer0输出3组互补PWM

主要特性

◼ 总通道数:4;
◼ 计数器宽度:16位;
◼ 时钟源可选:内部时钟,内部触发,外部输入,外部触发;
◼ 多种计数模式:向上计数,向下计数和中央计数;
◼ 正交编码器接口:被用来追踪运动和分辨旋转方向和位置;
◼ 霍尔传感器接口:用来做三相电机控制;
◼ 可编程的预分频器:16位,运行时可以被改变;
◼ 每个通道可配置:输入捕获模式,输出比较模式,可编程的PWM模式,单脉冲模式;
◼ 可编程的死区时间;
◼ 自动重装载功能;
◼ 可编程的计数器重复功能;
◼ 中止输入功能;
◼ 中断输出和DMA请求:更新事件,触发事件,比较/捕获事件,换相事件和中止事件;
◼ 多个定时器的菊链使得一个定时器可以同时启动多个定时器;
◼ 定时器的同步允许被选择的定时器在同一个时钟周期开始计数;
◼ 定时器主-从管理。

结构图

stm32f030 互补pwm,兆易GD32系列开发,单片机,stm32,嵌入式硬件,c语言,个人开发

时钟

stm32f030 互补pwm,兆易GD32系列开发,单片机,stm32,嵌入式硬件,c语言,个人开发
高级定时器timer0是挂在APB2上的,最大频率120MHz,这里使用120MHz。
stm32f030 互补pwm,兆易GD32系列开发,单片机,stm32,嵌入式硬件,c语言,个人开发
时钟使能,令RCU_APB2EN的11位bit为1即可。

主要寄存器

stm32f030 互补pwm,兆易GD32系列开发,单片机,stm32,嵌入式硬件,c语言,个人开发
需要配置的寄存器为上面框出来的。

代码讲解(寄存器版)

  • pwm.c
/*
* Dasen - 2023/4/28
* pwm.c - 产生三组互补PWM波
*/

#include "pwm.h"

void Pwm_gpioInit(void)
{
	//PA8(复用) - CH0			|		PB13(复用) - CH0-N	
	//PA9(复用) - CH1			|		PB14(复用) - CH1-N
	//PA10(复用) - CH2		|		PB15(复用) - CH2-N
	RCU_APB2EN |=(1<<2);//GPIOA时钟使能
	RCU_APB2EN |=(1<<3);//GPIOB时钟使能
	RCU_APB2EN |=(1<<0);//复用IO时钟使能
	
	
	
	//PA8
	GPIO_CTL1(GPIOA) &=~(0X0F<<0);//清除CTL配置
	GPIO_CTL1(GPIOA) |=(3<<0);//输出模式,最大速度50MHz
	GPIO_CTL1(GPIOA) |=(2<<2);//AFIO推挽输出
	
	//PA9
	GPIO_CTL1(GPIOA) &=~(0X0F<<4);//清除CTL配置
	GPIO_CTL1(GPIOA) |=(3<<4);//输出模式,最大速度50MHz
	GPIO_CTL1(GPIOA) |=(2<<6);//AFIO推挽输出
	
	//PA10
	GPIO_CTL1(GPIOA) &=~(0X0F<<8);//清除CTL配置
	GPIO_CTL1(GPIOA) |=(3<<8);//输出模式,最大速度50MHz
	GPIO_CTL1(GPIOA) |=(2<<10);//AFIO推挽输出
	
	//PB13
	GPIO_CTL1(GPIOB) &=~(0X0F<<20);//清除CTL配置
	GPIO_CTL1(GPIOB) |=(3<<20);//输出模式,最大速度50MHz
	GPIO_CTL1(GPIOB) |=(2<<22);//AFIO推挽输出
	
	//PB14
	GPIO_CTL1(GPIOB) &=~(0X0F<<24);//清除CTL配置
	GPIO_CTL1(GPIOB) |=(3<<24);//输出模式,最大速度50MHz
	GPIO_CTL1(GPIOB) |=(2<<26);//AFIO推挽输出
	
	//PB15
	GPIO_CTL1(GPIOB) &=~(0X0F<<28);//清除CTL配置
	GPIO_CTL1(GPIOB) |=(3<<28);//输出模式,最大速度50MHz
	GPIO_CTL1(GPIOB) |=(2<<30);//AFIO推挽输出
	
	AFIO_PCF0 &=~(3<<6);
	AFIO_PCF0 |=(0<<6);//没有重映射
}

void Timer0_InitPwm(uint16_t prescale, uint16_t period)
{
	RCU_APB2EN |=(1<<11);//TIMER0时钟使能
	
	Pwm_gpioInit();//gpio config
	
	TIMER_CTL0(TIMER0) = 0;//清除控制寄存器0配置
	TIMER_CTL0(TIMER0) |=(0<<8);//通过软件配置CKDIV,规定定时器时钟(CK_TIMER) 与死区时间和数字滤波器采样时钟(DTS)之间的分频系数。:
															//00:fDTS=fCK_TIMER;
															//01:fDTS= fCK_TIMER /2;
															//10:fDTS= fCK_TIMER /4;
															//11:保留
	
	TIMER_CTL0(TIMER0) |=(1<<7);//1:使能TIMERx_CAR寄存器的影子寄存器(自动重载影子使能)
	TIMER_CTL0(TIMER0) |=(0<<5);//计数器对齐模式选择:00:无中央对齐计数模式(边沿对齐模式)。 DIR位指定了计数方向。其他值为中央对齐模式
	TIMER_CTL0(TIMER0) |=(0<<4);//0:向上计数;1:向下计数
	TIMER_CTL0(TIMER0) |=(1<<2);//选择更新事件源。1:下列事件会产生更新中断或DMA请求:计数器溢出/下溢
	TIMER_CTL0(TIMER0) |=(0<<1);//该位用来使能或禁能更新事件的产生。0:更新事件使能.1:更新事件禁能.
	
	
	
	TIMER_CTL1(TIMER0)=0;//清除控制寄存器1配置
	TIMER_CTL1(TIMER0) |=(1<<3);//DMA请求源选择:0:当通道捕获/比较事件发生时,发送通道x的DMA请求 .1:当更新事件发生,发送通道x的DMA请求
	TIMER_CTL1(TIMER0) |=(0<<2);//换相控制影子寄存器更新控制:当换相控制影子寄存器(CHxEN, CHxNEN和CHxCOMCTL位)使能(CCSE=1),这些影子寄存器更新控制如下:(当通道没有互补输出时,此位无效。)
															//0:CMTG位被置1时更新影子寄存器
															//1:当CMTG位被置1或检测到TRIGI上升沿时,影子寄存器更新 
															
	TIMER_CTL1(TIMER0) |=(1<<0);//换相控制影子使能:0:影子寄存器CHxEN, CHxNEN和CHxCOMCTL位禁能.
															//1:影子寄存器CHxEN, CHxNEN和CHxCOMCTL位使能.
															//如果这些位已经被写入了,换相事件到来时这些位才被更新
															//当通道没有互补输出时,此位无效
															
	TIMER_SMCFG(TIMER0) =0;//清除从模式配置寄存器配置

	TIMER_DMAINTEN(TIMER0) =0;//清除DMA和中断使能寄存器
	TIMER_DMAINTEN(TIMER0) |=(0<<0);//0:禁止更新中断;1:使能更新中断
	
	TIMER_INTF(TIMER0) =0;//中断标志位清零 【TIMER_INTF(TIMER0)&(1<<0) 为UPIF更新中断标志位:1:发生更新中断;0:无更新中断发生。】
	
	TIMER_SWEVG(TIMER0) =0;//软件事件产生寄存器清零
	
	
	
	/******************************PWM通道配置 START*********************************/
	//先把CHCTL2的CHxEN清零,才配置CHCTL0
	TIMER_CHCTL2(TIMER0) =0;//通道控制寄存器2清零
	
	TIMER_CHCTL0(TIMER0) =0;//通道控制寄存器0清零
	TIMER_CHCTL1(TIMER0) =0;//通道控制寄存器1清零
	//CH0
	TIMER_CHCTL0(TIMER0) |=(0<<0);//通道0 I/O模式选择:00:通道0配置为输出
	TIMER_CHCTL0(TIMER0) |=(1<<3);//1:使能通道0输出/比较影子寄存器
	TIMER_CHCTL0(TIMER0) |=(6<<4);//110:PWM 模式0。在向上计数时,一旦计数器值小于TIMERx_CH0CV时,O0CPRE为高电平,否则为低电平。在向下计数时,一旦计数器的值大于TIMERx_CH0CV时,O0CPRE 为低电平,否则为高电平。
	
	//CH1
	TIMER_CHCTL0(TIMER0) |=(0<<8);
	TIMER_CHCTL0(TIMER0) |=(1<<11);
	TIMER_CHCTL0(TIMER0) |=(6<<12);
	
	//CH2
	TIMER_CHCTL1(TIMER0) |=(0<<0);
	TIMER_CHCTL1(TIMER0) |=(1<<3);
	TIMER_CHCTL1(TIMER0) |=(6<<4);
	
	//CH0 EN
	TIMER_CHCTL2(TIMER0) |=(1<<0);//1:使能通道x
	TIMER_CHCTL2(TIMER0) |=(0<<1);//通道x极性:0:通道x高电平为有效电平;1:通道x低电平为有效电平
	//CH0-N EN
	TIMER_CHCTL2(TIMER0) |=(1<<2);//1:使能通道x互补输出
	TIMER_CHCTL2(TIMER0) |=(0<<3);//通道x互补输出极性:0:通道x互补输出高电平为有效电平;1:通道x互补输出低电平为有效电平
	
	//CH1 EN
	TIMER_CHCTL2(TIMER0) |=(1<<4);//1:使能通道x
	TIMER_CHCTL2(TIMER0) |=(0<<5);//通道x极性:0:通道x高电平为有效电平;1:通道x低电平为有效电平
	//CH1-N EN
	TIMER_CHCTL2(TIMER0) |=(1<<6);//1:使能通道x互补输出
	TIMER_CHCTL2(TIMER0) |=(0<<7);//通道x互补输出极性:0:通道x互补输出高电平为有效电平;1:通道x互补输出低电平为有效电平
	
	//CH2 EN
	TIMER_CHCTL2(TIMER0) |=(1<<8);//1:使能通道x
	TIMER_CHCTL2(TIMER0) |=(0<<9);//通道x极性:0:通道x高电平为有效电平;1:通道x低电平为有效电平
	//CH2-N EN
	TIMER_CHCTL2(TIMER0) |=(1<<10);//1:使能通道x互补输出
	TIMER_CHCTL2(TIMER0) |=(0<<11);//通道x互补输出极性:0:通道x互补输出高电平为有效电平;1:通道x互补输出低电平为有效电平
	
	TIMER_SWEVG(TIMER0) |=(1<<5);//通道换相更新事件发生:1:产生通道控制更新事件。此位由软件置1,由硬件自动清0. 当此位被置1,通道捕获/比较控制寄存器 (CHxEN, CHxNEN 和CHxCOMCTL) 的互补输出被更新。
	/******************************PWM通道配置 END*********************************/
	
	//时基配置
	TIMER_CNT(TIMER0)=0;//计数器寄存器清零
	TIMER_PSC(TIMER0) =prescale;//TIM_CLK=120MHz/(prescale+1)。计数器时钟等于TIMER_CK时钟除以(PSC+1),每次当更新事件产生时,PSC 的值被装入到对应的影子寄存器。
	TIMER_CAR(TIMER0) =period;//计数器自动重载值
	TIMER_CREP(TIMER0) = 5;//重复计数器的值;这些位定义了更新事件的产生速率。重复计数器计数值减为0时产生更新事件。影子寄存器的更新速率也会受这些位影响(前提是影子寄存器被使能)。
	
	//比较寄存器配置
	TIMER_CH0CV(TIMER0) = period>>1;//当通道0配置为输出模式时,这些位包含了即将和计数器比较的值。使能相应影子寄存器后,影子寄存器值随每次更新事件更新。
	TIMER_CH1CV(TIMER0) = period>>1;
	TIMER_CH2CV(TIMER0) = period>>1;
	
	TIMER_CCHP(TIMER0) &=~(3<<8);//00:禁能保护模式。无写保护.
	TIMER_CCHP(TIMER0) =0;//互补通道保护寄存器清零
	TIMER_CCHP(TIMER0) |=(1<<15);//所有的通道输出使能
	TIMER_CCHP(TIMER0) |=(0<<14);//自动输出使能:0:POEN位只能使用软件方式置1;1:如果中止输入无效,下一次更新事件发生时,POEN位将会置1
																//此位只有在TIMERx_CCHP寄存器的PROT [1:0] =00时才可修改。
	
	TIMER_CCHP(TIMER0) |=(1<<11);//0:当POEN位被置1,通道输出信号 (CHx_O/ CHx_ON)被禁止;1:当POEN位被置1,通道输出信号 (CHx_O / CHx_ON)被使能,和TIMER0_CHCTL2寄存器CHxEN/CHxNEN位有关
															//此位在TIMERx_CCHP寄存器的PROT [1:0]=10或11时不能被更改。	

	TIMER_CCHP(TIMER0) |=(0<<10);//0:当POEN位被清0,通道输出信号 (CHx_O/ CHx_ON)被禁止;1:当POEN位被清0,通道输出信号 (CHx_O / CHx_ON)被使能,和TIMER0_CHCTL2寄存器CHxEN/CHxNEN位有关
															//此位在TIMERx_CCHP寄存器的PROT [1:0]=10或11时不能被更改。
															
	//死区时间
	TIMER_CCHP(TIMER0) |=(96<<0);//DELAY >= 8.33ns*96=799.68ns
	
	TIMER_CFG(TIMER0)=0;
	TIMER_CFG(TIMER0)|=1;//1:如果POEN位与IOS位均为0,则输出无效
	
	
	TIMER_SWEVG(TIMER0) |=(1<<0);//更新事件产生:1:产生更新事件。此位由软件置1,被硬件自动清0。当此位被置1,如果选择了中央对齐或向上计数模式,计数器被清0。否则(向下计数模式)计数器将载入自动重载值,预分频计数器将同时被清除。
	TIMER_CTL0(TIMER0) |=(1<<0);//计数器使能:0:计数器禁能;1:计数器使能
}

  • main.c
/*
CK_SYS is 120000000
CK_AHB is 120000000
CK_APB1 is 60000000
CK_APB2 is 120000000
CK_SYS is 120000000
CK_AHB is 120000000
CK_APB1 is 60000000
CK_APB2 is 120000000
*/

#include "gd32f30x.h"
#include <stdio.h>
#include "main.h"
#include "pwm.h"


/*!
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none
*/

int main(void)
{
	Timer0_InitPwm(0,4000-1);//120MHz/4000=30KHz	
    while (1);
}

实验现象

接示波器观察,可以看到三组互补pwm波形,占空比为50%,频率30KHz。文章来源地址https://www.toymoban.com/news/detail-708991.html

到了这里,关于GD32F303高级定时器输出互补PWM-开发笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32F4使用高级定时器(TIM1和TIM8)输出PWM问题

    STM32F4使用高级定时器(TIM1和TIM8)输出PWM时要使用TIM_CtrlPWMOutputs使能PWM输出,否则不会输出PWM波形,这一点是和通用定时器输出PWM不一样的地方,通用定时器是不用配置TIM_CtrlPWMOutputs函数的。、

    2024年02月15日
    浏览(41)
  • GD32F303基于USBD库的usb custom hid 双向通讯实现

    默认已经建立好需要移植的GD32F303空白工程 环境:keil   GD库版本: V2.1.4 通讯工具: 链接:https://pan.baidu.com/s/1Ukuy0u52C9ufPGz9QcHONA  提取码:d9rf 正文开始 USBD库植步骤: 找到GD官网的软件包 本文中用的是GD32F30x_Firmware_Library_V2.1.4 将FirmwareGD32F30x_usbd_library 文件夹全部拷贝至工程

    2023年04月09日
    浏览(42)
  • 【正点原子STM32连载】第二十三章 高级定时器互补输出带死区控制实验 摘自【正点原子】APM32F407最小系统板使用指南

    本章将介绍使用APM32F407输出带死区和刹车控制的两路互补PWM。通过本章的学习,读者将学习到高级定时器的互补输出、死区插入和刹车的功能的使用。 本章分为如下几个小节: 23.1 硬件设计 23.2 程序设计 23.3下载验证 23.1 硬件设计 23.1.1 例程功能 定时器8通道1及其互补通道输

    2024年02月09日
    浏览(61)
  • STM32F1定时器-PWM输出

    STM32 PWM工作过程 ARR寄存器决定PWM周期,CCR寄存器决定占空比 通道1为例 的PWM输出电路图 CCR1:捕获比较(值)寄存器(x =1,2,3,4):设置比较值。 CCMR1:OC1M[2:0]位:对于PWM方式下,用于设置PWM模式1【110】 或者PWM模式2【111】 CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平

    2024年02月09日
    浏览(79)
  • 单片机GD32F303RCT6 (Macos环境)开发 (二十)—— 光感芯片veml7700的使用

    1、veml有7个寄存器,每个十六位,见图。 00是config寄存器, 01 02 是中断设置的阈值 03是节能模式的设置 04 是得到的光的亮度值 05是得到的data of whole WHITE 06是中断设置值。 2、我们只测试得到光的亮度值,所以veml寄存器设置如下: 设置gain,integration time ,power save mode ,interrup

    2024年02月04日
    浏览(62)
  • STM32TIM定时器PWM输出比较(适用于通用,高级定时器)

    在定时器中我们最常用的功能就是输出PWM,大多是用在电机控制方面,目前网络上相关资料也有很多,但是,很多不利于我们“现搜现用”我这里不是说我写的有多好,而是你搜索到此类文章时大部分是急于解决目前的问题,一段相关代码和讲解就行,当然不是学习背后的原

    2024年01月25日
    浏览(54)
  • STM32——高级定时器输出比较模式实验

    1,配置定时器基础工作参数 HAL_TIM_OC_Init() 2,定时器PWM输出MSP初始化 HAL_TIM_OC_MspInit() 配置NVIC、CLOCK、GPIO等 3,配置PWM模式/比较值等 HAL_TIM_OC_ConfigChannel() 4,使能通道预装载 __HAL_TIM_ENABLE_OCxPRELOAD() 5,使能输出、主输出、计数器 HAL_TIM_OC_Start() 6,修改捕获/比较寄存器的值 _HAL

    2024年02月02日
    浏览(50)
  • stm32f407单一定时器输出四路PWM波

    最近在玩遥控器多路pwm捕获,顺带着写了一下pwm波输出的代码,下面我来说一下407板子输出pwm波的具体配置及函数说明。 输出效果如下。PS:因为我的分析仪只能接一个,就只看一路的输出 1、开启时钟及定时器引脚复用 在输出PWM波时要开启定时器时钟及GPIO时钟,本例以TI

    2024年02月12日
    浏览(45)
  • STM32F407高级定时器-死区时间研究-STM32CubeMX

    距离上次写笔记,已经过去好长时间了 中间也折腾过不少东西,但是都没咋整理,主要是这中间都是在干活儿,不是自己想要研究的,也没想着要写。 从去年10月份开始想要学习FOC,10月份研究了一个月,到11月初,实现了SVPWM驱动BLDC电机,使用串口实现开环下转速和力矩调

    2023年04月23日
    浏览(53)
  • STM32使用高级定时器输出互补pwm波

    最近做的一个项目用到stm32,网上查了很多资料,也踩了很多坑,这里记录一下配置的步骤和说明 硬件使用的是stm32h750vbt6; 软件用到了stm32cubemx和keil5; 打开Debug模式方便调试,可以忽略,不影响代码运行 在用cube配置时钟源时,有下面三个选项 Disable(禁用) BYPASS Clock Sou

    2024年02月16日
    浏览(71)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包