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.hqwc.cn/news/57082.html

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

相关文章

Grafana V10 告警推送

最近项目建设完成&#xff0c;一个城域网项目&#xff0c;相关zabbix和grafana展示已经完&#xff0c;想了想&#xff0c;不想天天看平台去盯网络监控平台&#xff0c;索性对告警进行分类调整&#xff0c;增加告警的推送&#xff0c;和相关部门的提醒&#xff0c;其他部门看不懂…

大数据分析案例-基于随机森林算法构建多发性硬化症预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

HIVE优化之不需要参数优化

#1.数据倾斜 什么是数据倾斜&#xff1f; 一部分数据多 一部分数据少 造成的结果&#xff1a; MR运行过慢 主要是shuffle和reduce过程慢 分组聚合导致数据倾斜 Hive未优化的分组聚合 方法1&#xff1a;在MAP端直接聚合&#xff08;分组聚合优化&#xff09;&#xff0c;减少…

STDF - 基于 Svelte 和 Tailwind CSS 打造的移动 web UI 组件库,Svelte 生态里不可多得的优秀项目

Svelte 是一个新兴的前端框架&#xff0c;组件库不多&#xff0c;今天介绍一款 Svelte 移动端的组件库。 关于 STDF STDF 是一个移动端的 UI 组件库&#xff0c;主要用来开发移动端 web 应用。和我之前介绍的很多 Vue 组件库不一样&#xff0c;STDF 是基于近来新晋 js 框架 S…

echarts绘制甘特图

说在前面 项目上有需求&#xff0c;需要在大屏上展示进度甘特图&#xff0c;调研了DHTMLX和普加甘特图&#xff0c;效果都不是特别符合需求现状&#xff0c;查询了一些博客&#xff0c;决定使用echarts来绘制甘特图。 实现效果展示 实现思路分析 1、应该采用柱状图&#xff…

关于Java的IO流开发

IO概述 回想之前写过的程序&#xff0c;数据都是在内存中&#xff0c;一旦程序运行结束&#xff0c;这些数据都没有了&#xff0c;等下次再想使用这些数据&#xff0c;可是已经没有了。那怎么办呢&#xff1f;能不能把运算完的数据都保存下来&#xff0c;下次程序启动的时候&a…

[自动化测试] 读取CSV 文件

CSV文件可以用来存储固定字段数据&#xff0c;可以通过excel 表格另存为csv文件&#xff0c;不要直接改文件名称创建&#xff0c;不是真正的csv文件 import csv import codecs from itertools import islice #读取本地csv文件 datacsv.reader(codecs.open(filename./data/us…

探讨|使用或不使用机器学习

动动发财的小手&#xff0c;点个赞吧&#xff01; 机器学习擅长解决某些复杂问题&#xff0c;通常涉及特征和结果之间的困难关系&#xff0c;这些关系不能轻易地硬编码为启发式或 if-else 语句。然而&#xff0c;在决定 ML 是否是当前给定问题的良好解决方案时&#xff0c;有一…

MySQL—— 基础语法大全

MySQL—— 基础 一、MySQL概述1.1 、数据库相关概念1.2 、MySQL 客户端连接1.3 、数据模型 二、SQL2.1、SQL通用语法2.2、SQL分类2.3、DDL2.4、DML2.5、DQL2.6、DCL 三、函数四、约束五、多表查询六、事务 一、MySQL概述 1.1 、数据库相关概念 数据库、数据库管理系统、SQL&a…

Webots与MATLAB联合仿真环境配置

1. 版本 系统&#xff1a;Win10 matlab版本&#xff1a;2023a webots版本&#xff1a;R2020b 2.安装 MATLAB MinGW-w64 C/C Compiler 在使用matlab写控制器之前&#xff0c;需要给matlab安装 MATLAB MinGW-w64 C/C Compiler&#xff0c;因为需要matlab与c进行交互。 下载地址…

小程序的 weiui的使用以及引入

https://wechat-miniprogram.github.io/weui/docs/quickstart.html 网址 1.点进去&#xff0c;在app.json里面配置 在你需要的 页面的 json里面配置&#xff0c;按需引入 然后看文档&#xff0c;再在你的 wxml里面使用就好了

框框大学之——教育技术学

清一色劝退的教育技术学。。。。。。 https://www.kkdaxue.com/?current1&major%E6%95%99%E8%82%B2%E6%8A%80%E6%9C%AF%E5%AD%A6&pageSize10&sortFieldcreateTime&sortOrderdescend 总结&#xff1a; 1 杂而不经 2 摆烂劝退居多 3 适合躺平 4 考公不行 5 要多…