编辑语:
技术解码栏目:是面向开发者详细解读芯片开放社区(OCC)上关于处理器、芯片、基础软件平台、集成开发环境及应用开发平台的相关技术,方便开发者学习及快速上手,提升开发效率。
RVB2601是基于平头哥RISC-V生态芯片的开发套件,开发者基于RVB2601可进行端云一体的物联网应用开发及音频方案开发。上周向大家推荐了RVB2601应用开发实战系列一: Helloworld最小系统,本周我们将继续推荐RVB2601应用开发实战系列。今天为大家介绍如何基于RVB2601实现跑马灯例程。
一. 前言
基于RVB2601的跑马灯程序是利用通过控制一颗RGB LED灯珠实现三色跑马灯效果。建议在在看本文之前,先详细看下新手必看 | RVB2601开发板快速上手指南。本例程名为ch2601_marquee_demo,可以通过集成开发环境剑池CDK下载获取相应资源。
三色LED通过PIN引脚 PA7、PA25、PA4与CH2601主芯片GPIO控制器连通,主控可以通过对PA7、PA25和PA4的GPIO PIN的操作,可以实现三色LED不同颜色的闪烁。LED硬件原理图如下:
三. 跑马灯开发
3.1 例程下载
打开CDK,点击HOME图标,查找ch2601_marquee_demo后,打开工程可以看下一下目录文件。
3.2 LED配置
- led_pinmux_init
该功能函数位于app/src/led.c, 用于初始化三色LED灯的IO管脚。配置三色灯的PA7、PA25和PA4为IO模式,为每个IO管脚配置PWM通道以及占空比时间。
1. void led_pinmux_init() 2. { 3. csi_pin_set_mux(PA7, PA7_PWM_CH7); 4. csi_pin_set_mux(PA25, PA25_PWM_CH2); 5. csi_pin_set_mux(PA4, PA4_PWM_CH4); 6. ... 7. } c
- led_refresh
该功能函数位于app/src/led.c, 用于依次闪烁LED。利用g_ctr计数器来判断闪烁LED灯。通过操作三根IO管脚来确定显示指定颜色的灯。
1. void led_refresh() 2. { 3. if (g_ctr == 3) { 4. g_ctr = 0; 5. } 6. if (g_ctr == 0) 7. { 8. csi_pwm_out_start(&r, 7 / 2); 9. csi_pwm_out_stop(&r, 2 / 2); 10. csi_pwm_out_stop(&r, 4 / 2); 11. 12. } 13. else if (g_ctr == 1) 14. { 15. csi_pwm_out_start(&r, 2 / 2); 16. csi_pwm_out_stop(&r, 7 / 2); 17. csi_pwm_out_stop(&r, 4 / 2); 18. 19. } 20. else //2 21. { 22. csi_pwm_out_start(&r, 4 / 2); 23. csi_pwm_out_stop(&r, 7 / 2); 24. csi_pwm_out_stop(&r, 2 / 2); 25. 26. } 27. } c
- demo_task
该功能函数位于app/src/main.c, 用于周期性点亮LED灯,在主函数里调用。
1. static void demo_task(void *arg) 2. { 3. lv_init(); 4. oled_init(); 5. lable_test(); 6. led_pinmux_init(); 7. 8. while (1) 9. { 10. lv_task_handler(); 11. udelay(1000 * 1000); 12. lv_tick_inc(1); 13. led_refresh(); 14. } 15. } c
3.3. 编译运行
编译通过后,点击下载成功,复位运行。可看右下角的灯依次闪烁。参见如下视频演示
4. 总结
本例程介绍了如何通过CSI接口配置IO管脚来控制LED灯,从而实现依次闪烁,达到跑马灯的效果。后续还有更多的开发例程,敬请期待!