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,子优先级为0timer_deinit(TIMER0);                 //复位TIMERxTimerParameterStruct.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;                  //设置"重复计数次数"为0timer_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通道0timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_3,250);//设置初始占空比为250/500timer_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 clockgpio_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_Leddelay_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/500MCU_Led_Toggle();}
}

 

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

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

相关文章

数据互通,版本管理优化图文档与BOM数据

在现代企业的产品开发过程中&#xff0c;图文档和BOM数据是不可或缺的关键要素。图文档记录了产品的设计和工程信息&#xff0c;而BOM数据则明确了产品所需物料的清单和规格。然而&#xff0c;由于数据的复杂性和版本变更的频繁性&#xff0c;图文档与BOM数据之间的协作和管理常…

【JavaEE进阶】Spring核心与设计思想

文章目录 一. Spring框架概述1. 什么是Spring框架2. 为什么要学习框架?3. Spring框架学习的难点 二. Spring 核心与设计思想1. 什么是容器?2. 什么是IoC?3. Spring是IoC容器4. DI&#xff08;依赖注入&#xff09;5. DL&#xff08;依赖查找&#xff09; 一. Spring框架概述…

2023-08-07力扣今日五题

链接&#xff1a; 剑指 Offer 53 - II. 0&#xff5e;n-1中缺失的数字 题意&#xff1a; 如题 解&#xff1a; 长度n的递增数组里&#xff0c;要找0到n中没出现的那个数字&#xff0c;那么出现的下标是0到n-1&#xff0c;一一对应即可&#xff0c;都出现了就是n没有 实际…

RocketMQ第二课-核心编程模型以及生产环境最佳实践

一、回顾RocketMQ的消息模型 ​ 上一章节我们从试验整理出了RocketMQ的消息模型&#xff0c;这也是我们使用RocketMQ时最直接的指导。 二、深入理解RocketMQ的消息模型 1、RocketMQ客户端基本流程 <dependency><groupId>org.apache.rocketmq</groupId>&…

字母异位词分组 LeetCode热题100

题目 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 思路 将字符串按字符升序排列后作为key&#xff0c;原字符串作为value存储到map上。 代码 class Solution…

高效构建 vivo 企业级网络流量分析系统

作者&#xff1a;vivo 互联网服务器团队- Ming Yujia 随着网络规模的快速发展&#xff0c;网络状况的良好与否已经直接关系到了企业的日常收益&#xff0c;故障中的每一秒都会导致大量的用户流失与经济亏损。因此&#xff0c;如何快速发现网络问题与定位异常流量已经成为大型企…

dubbo之基础知识

Dubbo 官网地址&#xff1a;Apache Dubbo Dubbo 是一款易用、高性能的 WEB 和 RPC 框架&#xff0c;同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能力、工具与最佳实践 作用 1.远程方法调用 2.容错和负载均衡 3.提供服务的自动注册与发现 为什么需要…

One-4-All: Neural Potential Fields for Embodied Navigation 论文阅读

论文信息 题目&#xff1a;One-4-All: Neural Potential Fields for Embodied Navigation 作者&#xff1a;Sacha Morin, Miguel Saavedra-Ruiz 来源&#xff1a;arXiv 时间&#xff1a;2023 Abstract 现实世界的导航可能需要使用高维 RGB 图像进行长视野规划&#xff0c;这…

【Spring】AOP切点表达式

文章目录 1、语法2、通配符3、execution4、within5、annotation6、args7、args8、bean9、this10、target11、target12、within13、表达式组合14、补充 1、语法 动作关键词(访问修饰符 返回值 包名.类/接口名 .方法名(参数)异常名) 举例&#xff1a; execution(public User c…

AIGC:【LLM(五)】——Faiss:高效的大规模相似度检索库

文章目录 一.简介1.1 什么是Faiss1.2 Faiss的安装 二.Faiss检索流程2.1 构建向量库2.2 构建索引2.3 top-k检索 三.Faiss构建索引的多种方式3.1 Flat &#xff1a;暴力检索3.2 IVFx Flat &#xff1a;倒排暴力检索3.3 IVFxPQy 倒排乘积量化3.4 LSH 局部敏感哈希3.5 HNSWx 一.简介…

Golang通过栈实现表达式运算(中缀表达式转后缀表达式解析语法)

Golang通过栈实现表达式运算(中缀表达式转后缀表达式解析语法) 需求背景&#xff1a;将string表达式数组 [title AUSU && ( header Wecome || brand ! AC68U )] 解析并使用ES查询得到运算结果。 分析&#xff1a;带有括号的表达式&#xff0c;需要根据优先级解析&a…

jvm的垃圾回收算法有哪些

jvm的垃圾回收算法有标记-清除、复制、标记-整理、分代回收算法&#xff0c;它们分别有不同的实现&#xff1a; 一、标记-清除算法 利用可达性分析算法分析之后&#xff0c;将未被标记的对象[即不可达对象]清除&#xff0c;以便回收它们所占用的内存。 缺点&#xff1a; 1、需…

flask------消息闪现 flash

1介绍 flask提供了一个非常有用的flash()函数&#xff0c;它可以用来“闪现”需要提示给用户的消息&#xff0c;比如当用户登录成功后显示“欢迎回来&#xff01;”。在视图函数调用flash()函数&#xff0c;传入消息内容&#xff0c;flash&#xff08;&#xff09;函数把消息存…

TPlink DDNS 内网穿透?外网访问设置方法

有很多小伙伴都想知道&#xff1a;TPlink路由器怎么设置DDNS内网穿透&#xff1f;今天&#xff0c;小编就给大家分享一下TPlink DDNS 外网访问设置方法&#xff0c;下面是图文教程&#xff0c;帮助新手快速入门DDNS设置。 本文介绍的是云路由器TP-LINK DDNS的设置方法。TP-LIN…

R-Meta分析教程

详情点击链接&#xff1a;R-Meta模型教程 一&#xff1a;Meta分析的选题与文献计量分析CiteSpace应用 1、Meta分析的选题与文献检索 1)什么是Meta分析&#xff1f; 2)Meta分析的选题策略 3)文献检索数据库 4)精确检索策略&#xff0c;如何检索全、检索准 5)文献的管理与…

浏览器同源策略

浏览器同源策略 同源策略&#xff1a;是一个重要的浏览器的安全策略&#xff0c;用于限制一个源的文档或者它加载的脚本如何能与另一个源的资源进行交互 它能帮助阻隔恶意文档&#xff0c;减少可能被攻击的媒介 例如&#xff1a;被钓鱼网站收集信息&#xff0c;使用ajax发起…

DevOps系列文章之 Docker 安装 NFS 服务器

Docker 安装 NFS 服务器 环境&#xff1a; 192.186.2.105 NFS 服务器 192.168.2.106 Client 客户端 安装 一、服务器端 https://github.com/f-u-z-z-l-e/docker-nfs-server 1、创建目录 mkdir /nfsdata mkdir -p /docker/nfs/2、启动脚本 vim start.sh# 内容 docker run …

[国产MCU]-BL602开发实例-GPIO控制

GPIO与控制 文章目录 GPIO与控制1、GPIO介绍2、GPIO管理相关API介绍3、硬件准备4、软件准备5、代码实现3.1 GPIO输出3.2 GPIO输入3.3 GPIO中断BL602的GLB(Global Register)是芯片通用全局设定模块,主要包含了时钟管理、复位管理、总线管理、内存管理以及GPIO管理等功能。 本文…

shell脚本自动打包部署

1、安装git 2、使用Git克隆代码 3、安装Maven &#xff08;1&#xff09; tar -zxvf ** 解压文件 &#xff08;2&#xff09;修改配置 &#xff08;3&#xff09;source /etc/profile 重新加载一下文件 &#xff08;4&#xff09;mvn -version 查看版本号 已经安装成…

线程池的使用案例一

一、配置线程池 1、不推荐的方式 ExecutorService executorService Executors.newFixedThreadPool(); // 创建⼀个固定⼤⼩的线程池&#xff0c;可控制并发的线程数&#xff0c;超出的线程会在队列中等待&#xff1b; ExecutorService executorService Executors.newCache…