本文作者:我爱下载
1 概述
RVB2601评估板包含RGB三基色LED一个,为了学习PWM信号的驱动,我们可以通过驱动三基色LED来完成。
2 硬件接口描述
通过如上两个原理图对照可知。
序号 |
LED名称 |
GPIO(PWM) |
1 |
LED_BLUE |
PA7(CH7) |
2 |
LED_GREEN |
PA25(CH2) |
3 |
LED_RED |
PA4(CH4) |
3 软件驱动设计
3.1 PWM的CSI接口
驱动采用CSI接口实现。实际使用到CSI接口如下所示:
函数 |
说明 |
csi_pwm_init |
初始化 |
csi_pwm_uninit |
反初始化 |
csi_pwm_out_config |
配置输出模式 |
csi_pwm_out_start |
开始输出 |
csi_pwm_out_stop |
停止输出 |
PWM接口详细说明
- csi_pwm_init
csi_error_t csi_pwm_init(csi_pwm_t *pwm, uint32_t idx)
csi_pwm_t
成员 |
类型 |
说明 |
dev |
csi_dev_t |
csi设备统一句柄 |
callback |
void (callback)(csi_pwm_t pwm, csi_pwm_event_t event, uint32_t ch, uint32_t time_us, void *arg) |
用户回调函数 |
arg |
void * |
回调函数参数(用户自定义) |
priv |
void * |
设备私有变量 |
- csi_pwm_uninit
void csi_pwm_uninit(csi_pwm_t *pwm)
- csi_pwm_out_config
csi_error_t csi_pwm_out_config(csi_pwm_t *pwm, uint32_t channel, uint32_t period_us, uint32_t pulse_width_us, csi_pwm_polarity_t polarity)
csi_pwm_polarity_t
类型 |
说明 |
PWM_POLARITY_HIGH |
高电平 |
PWM_POLARITY_LOW |
低电平 |
- csi_pwm_out_start
csi_error_t csi_pwm_out_start(csi_pwm_t *pwm, uint32_t channel)
- csi_pwm_out_stop
void csi_pwm_out_stop(csi_pwm_t *pwm, uint32_t channel)
3.2 PIN的CSI接口
测试中用到的PIN的CSI接口说明如下所示:
函数 |
说明 |
csi_pin_set_mux |
设置PIN的复用功能 |
接口详细说明
- csi_pin_set_mux
csi_error_t csi_pin_set_mux(pin_name_t pin_name, pin_func_t pin_func)
4 软件测试代码
通过PWM接口完成三色灯亮度渐变调节驱动的测试程序。
4.1 初始化
void led_pinmux_init() { csi_error_t ret; csi_pin_set_mux(PA7, PA7_PWM_CH7); //设置PIN的复用功能 csi_pin_set_mux(PA25, PA25_PWM_CH2); //设置PIN的复用功能 csi_pin_set_mux(PA4, PA4_PWM_CH4); //设置PIN的复用功能 ret = csi_pwm_init(&r, 0); //初始化pwm设备 if (ret != CSI_OK) { printf("===%s, %d\n", __FUNCTION__, __LINE__); return ; } //配置pwm通道的输出模式 ret = csi_pwm_out_config(&r, 7 / 2, 300, 100, PWM_POLARITY_HIGH); if (ret != CSI_OK) { printf("===%s, %d\n", __FUNCTION__, __LINE__); return ; } //配置pwm通道的输出模式 ret = csi_pwm_out_config(&r, 2 / 2, 300, 100, PWM_POLARITY_HIGH); if (ret != CSI_OK) { printf("===%s, %d\n", __FUNCTION__, __LINE__); return ; } //配置pwm通道的输出模式 ret = csi_pwm_out_config(&r, 4 / 2, 300, 100, PWM_POLARITY_HIGH); if (ret != CSI_OK) { printf("===%s, %d\n", __FUNCTION__, __LINE__); return ; } }
4.2 三色led亮度PWM控制
- 点亮led
csi_pwm_out_stop(&r, 2 / 2); csi_pwm_out_stop(&r, 7 / 2); csi_pwm_out_stop(&r, 4 / 2);
- 熄灭led
csi_pwm_out_start(&r, 7 / 2); csi_pwm_out_start(&r, 2 / 2); csi_pwm_out_start(&r, 4 / 2);
- 亮度调节控制
void ft_led_slow_change(void) { csi_error_t ret; if (g_led_refresh) { if (g_ctr == 0) { ret = csi_pwm_out_config(&r, 7 / 2, 300, led_pwm_count, PWM_POLARITY_HIGH); if (ret != CSI_OK) { printf("===%s, %d\n", __FUNCTION__, __LINE__); return ; } if(led_change_flag == 0) { if(led_pwm_count == 0) { csi_pwm_out_start(&r, 7 / 2); csi_pwm_out_stop(&r, 2 / 2); csi_pwm_out_stop(&r, 4 / 2); } led_pwm_count += 10; if(led_pwm_count >= 300) { led_change_flag = 1; } } else { if(led_pwm_count > 10) { led_pwm_count -= 10; } else { led_pwm_count = 0; led_change_flag = 0; g_ctr++; if (g_ctr == 3) { g_ctr = 0; } } } } else if (g_ctr == 1) { //25 ret = csi_pwm_out_config(&r, 2 / 2, 300, led_pwm_count, PWM_POLARITY_HIGH); if (ret != CSI_OK) { printf("===%s, %d\n", __FUNCTION__, __LINE__); return ; } if(led_change_flag == 0) { if(led_pwm_count == 0) { csi_pwm_out_start(&r, 2 / 2); csi_pwm_out_stop(&r, 7 / 2); csi_pwm_out_stop(&r, 4 / 2); } led_pwm_count += 10; if(led_pwm_count >= 300) { led_change_flag = 1; } } else { if(led_pwm_count > 10) { led_pwm_count -= 10; } else { led_pwm_count = 0; led_change_flag = 0; g_ctr++; if (g_ctr == 3) { g_ctr = 0; } } } } else //2 { //4 ret = csi_pwm_out_config(&r, 4 / 2, 300, led_pwm_count, PWM_POLARITY_HIGH); if (ret != CSI_OK) { printf("===%s, %d\n", __FUNCTION__, __LINE__); return ; } if(led_change_flag == 0) { if(led_pwm_count == 0) { csi_pwm_out_start(&r, 4 / 2); csi_pwm_out_stop(&r, 7 / 2); csi_pwm_out_stop(&r, 2 / 2); } led_pwm_count += 10; if(led_pwm_count >= 300) { led_change_flag = 1; } } else { if(led_pwm_count > 10) { led_pwm_count -= 10; } else { led_pwm_count = 0; led_change_flag = 0; g_ctr++; if (g_ctr == 3) { g_ctr = 0; } } } } } }
5 演示视频
本文源自:平头哥芯片开放社区(OCC)