【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"
-
-
-
-
-
- void gpio_config(void)
- {
- rcu_periph_clock_enable(RCU_GPIOB);
-
- 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;
-
-
- rcu_periph_clock_enable(RCU_TIMER2);
-
-
- timer_deinit(TIMER2);
-
- timer_struct_para_init(&timer_initpara);
-
- 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);
-
-
- timer_channel_output_struct_para_init(&timer_ocinitpara);
-
- 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);
-
-
- 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;
-
-
- rcu_periph_clock_enable(RCU_TIMER11);
-
-
- timer_deinit(TIMER11);
-
- timer_struct_para_init(&timer_initpara);
-
- 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);
-
-
- timer_channel_output_struct_para_init(&timer_ocinitpara);
-
- 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);
-
-
- 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)
- {
-
- timer_enable(TIMER11);
-
- 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);
-
-
- timer_enable(TIMER2);
-
- 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);
-
-
-
- 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);
-
- }
- }
驱动效果:
|