3457|1

1249

帖子

69

TA的资源

纯净的硅(中级)

楼主
 

【GD32L233C-START评测】四、定时器PWM应用之驱动RGB灯 [复制链接]

定时器PWM是MCU最常用的外设之一,GD32L233C具有多个定时器和PWM输出通道,定时器资源如下所示:

 

通过管脚复用可以知道哪些IO具有PWM功能:

 

GD32L233C-START开发板说是兼容arduino uno接口(arduino uno接口的好处不就是有大量arduino生态的扩展板能够即插即用嘛),但是并没有完全支持,只能说这个开发板设计的很水,GD32L233C能输出PWM的IO远多于6个,可是在开发板上并没有按照arduino uno接口的标准将具有PWM功能的IO连接到D3、D5、D6、D9、D10、D11。。。只支持了D3、D9、D11。。。这意味着当arduino扩展板需要3路以上PWM控制信号时,无法即插即用。

此外,串口有好几个,没有必要将开发板上的USB调试串口和arduino uno接口的D0、D1复用。

标准arduino uno r3接口:

为了测试PWM功能,使用涂鸦的兼容arduino uno r3的RGB扩展板:

RGB扩展板插在GD32L233C-START上的效果

根据GD32L233C-START开发板的原理图,能够使用PWM的只有PB15、PB0、PB5,遗憾:

涂鸦三明治(PWM)照明功能板是一款支持彩灯五路调光的 LED 控制器。照明功能板(PWM)可实现五路照明功能,带有暖光,冷白及 RGB 灯珠和相应的控制芯片。

  • 冷白,暖白控制采用 SLM211A DC-DC 降压型 PWM 线性恒流调光控制芯片。
  • RGB 控制采用 BP168CJ DC-DC 降压型 PWM 线性恒流控制芯片。
I/O 说明
PWMC 冷白 PWM 控制信号,高电平有效
PWMW 暖白 PWM 控制信号,高电平有效
PWMR RGB 红光控制信号,高电平有效
PWMG RGB 绿光控制信号,高电平有效
PWMB RGB 蓝光控制信号,高电平有效

 

3个控制管脚对应的定时器和PWM通道如下:

PB15 --- timer11-ch1 pwmR
PB5  ---  timer2-ch1  pwmB
PB0  ---  timer2-ch2  pwmW

 

gd32的API设计相比stm32用起来要舒服的多,很简洁,易于使用:

main.c测试代码

  • #include "gd32l23x.h"
  • #include "systick.h"
  • // PB15 --- timer11-ch1 pwmR
  • // PB5 --- timer2-ch1 pwmB
  • // PB0 --- timer2-ch2 pwmW
  • void gpio_config(void)
  • {
  • rcu_periph_clock_enable(RCU_GPIOB);
  • /* TIMER2 & TIMER11 GPIO */
  • gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_0 | GPIO_PIN_5 | GPIO_PIN_15);
  • gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_5 | GPIO_PIN_15);
  • gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_0);
  • gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_5);
  • gpio_af_set(GPIOB, GPIO_AF_2, GPIO_PIN_15);
  • }
  • void timer2_config(void)
  • {
  • timer_oc_parameter_struct timer_ocinitpara;
  • timer_parameter_struct timer_initpara;
  • /* enable the peripherals clock */
  • rcu_periph_clock_enable(RCU_TIMER2);
  • /* deinit a TIMER */
  • timer_deinit(TIMER2);
  • /* initialize TIMER init parameter struct */
  • timer_struct_para_init(&timer_initpara);
  • /* TIMER2 configuration */
  • timer_initpara.prescaler = 63;
  • timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
  • timer_initpara.counterdirection = TIMER_COUNTER_UP;
  • timer_initpara.period = 9999;
  • timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
  • timer_init(TIMER2, &timer_initpara);
  • /* initialize TIMER channel output parameter struct */
  • timer_channel_output_struct_para_init(&timer_ocinitpara);
  • /* configure TIMER channel output function */
  • timer_ocinitpara.outputstate = TIMER_CCX_ENABLE;
  • timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
  • timer_channel_output_config(TIMER2, TIMER_CH_1, &timer_ocinitpara);
  • timer_channel_output_config(TIMER2, TIMER_CH_2, &timer_ocinitpara);
  • timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_1, 0);
  • timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_2, 0);
  • /* CH0 configuration in OC timing mode */
  • timer_channel_output_mode_config(TIMER2, TIMER_CH_1, TIMER_OC_MODE_PWM0);
  • timer_channel_output_mode_config(TIMER2, TIMER_CH_2, TIMER_OC_MODE_PWM0);
  • }
  • void timer11_config(void)
  • {
  • timer_oc_parameter_struct timer_ocinitpara;
  • timer_parameter_struct timer_initpara;
  • /* enable the peripherals clock */
  • rcu_periph_clock_enable(RCU_TIMER11);
  • /* deinit a TIMER */
  • timer_deinit(TIMER11);
  • /* initialize TIMER init parameter struct */
  • timer_struct_para_init(&timer_initpara);
  • /* TIMER2 configuration */
  • timer_initpara.prescaler = 63;
  • timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
  • timer_initpara.counterdirection = TIMER_COUNTER_UP;
  • timer_initpara.period = 9999;
  • timer_initpara.clockdivision = TIMER_CKDIV_DIV2;
  • timer_init(TIMER11, &timer_initpara);
  • /* initialize TIMER channel output parameter struct */
  • timer_channel_output_struct_para_init(&timer_ocinitpara);
  • /* configure TIMER channel output function */
  • timer_ocinitpara.outputstate = TIMER_CCX_ENABLE;
  • timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
  • timer_channel_output_config(TIMER11, TIMER_CH_1, &timer_ocinitpara);
  • timer_channel_output_pulse_value_config(TIMER11, TIMER_CH_1, 0);
  • /* CH0 configuration in OC timing mode */
  • timer_channel_output_mode_config(TIMER11, TIMER_CH_1, TIMER_OC_MODE_PWM0);
  • }
  • int main(void)
  • {
  • systick_config();
  • gpio_config();
  • timer2_config();
  • timer11_config();
  • while(1)
  • {
  • /* enable a TIMER */
  • timer_enable(TIMER11);
  • //pwmR test
  • for(int i =0;i<1000;i++)
  • {
  • delay_1ms(2);
  • timer_channel_output_pulse_value_config(TIMER11, TIMER_CH_1, i*10);
  • }
  • for(int i =999;i>0;i--)
  • {
  • delay_1ms(2);
  • timer_channel_output_pulse_value_config(TIMER11, TIMER_CH_1, i*10);
  • }
  • timer_channel_output_pulse_value_config(TIMER11, TIMER_CH_1, 0);
  • timer_disable(TIMER11);
  • //pwmR end
  • timer_enable(TIMER2);
  • //pwmB test
  • for(int i =0;i<1000;i++)
  • {
  • delay_1ms(2);
  • timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_1, i*10);
  • }
  • for(int i =999;i>0;i--)
  • {
  • delay_1ms(2);
  • timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_1, i*10);
  • }
  • timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_1, 0);
  • //pwmB end
  • //pwmW test
  • for(int i =0;i<1000;i++)
  • {
  • delay_1ms(2);
  • timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_2, i*10);
  • }
  • for(int i =999;i>0;i--)
  • {
  • delay_1ms(2);
  • timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_2, i*10);
  • }
  • timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_2, 0);
  • timer_disable(TIMER2);
  • //pwmW end
  • }
  • }

驱动效果:

 


 

 

此帖出自GD32 MCU论坛

最新回复

GD32L233C能输出PWM的IO远多于6个,PWM的IO口不少   详情 回复 发表于 2022-3-12 20:41
点赞 关注
 

回复
举报

7007

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

GD32L233C能输出PWM的IO远多于6个,PWM的IO口不少

此帖出自GD32 MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播报名| TI 面向楼宇和工厂自动化行业的毫米波雷达解决方案
【内容简介】TI 60GHz IWRL6432和 IWRL1432毫米波雷达传感器如何帮助解决楼宇和工厂自动化应用中的感应难题
【直播时间】5月28日(周三)上午10:00
【直播礼品】小米双肩包、contigo水杯、胶囊伞、安克充电器

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 5

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表