【感芯科技MC3172开发板体验】WS2812音乐灯带 - RISC-V MCU技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

【感芯科技MC3172开发板体验】WS2812音乐灯带

板子上个月末就拿到手了,由于撞上几门考试耽误了一下。现在我要用这块MC3172开发板做一个我很久之前就想做的音乐流水灯,顾名思义就是灯带会随着音乐变化。

该项目所用的外设有SPI和串口、ADC(MC3172没有,但开发板上的ch32v203有8个ADC已经引出),其中SPI负责驱动WS2812灯带,ADC则负责采集MAX9814模块的音频信息,串口则负责接收ADC的数据。
一、MC3172部分

首先是确保能够正常驱动WS2812,这里我借鉴了一位大佬的文章:【代码分享】用spi驱动任意数量ws2812 / 感芯科技 / WhyCan Forum(哇酷开发者社区)

灯带控制我写在了线程1void thread1_main(void)函数里,与其它线程互不干扰,不得不说自带多线程是真的方便。

其中ws2812.h的宏WS2812_NUM表示的是灯珠数量,函数void WS2812_OneSet( uint8_t num, uint32_t RGB )是设置某颗灯珠的RGB值。函数void WS2812_Show(void)是将刚刚设置好的颜色数据统一发送出去。

如文章末尾的视频所示,ws2812灯带驱动成功。

然后开始编写串口接收ADC参数,如下图所示,CH32V203的串口是与MC3172的PA0和PA1是相连的(对应多功能通讯接口GPCOM0_P0和GPCOM0_P1)
QQ截图20230609163209.png

QQ截图20230609163320.png

下面是串口接收部分代码,仿照GPIO_GPCOM_TIMER_Example.c的UART例程编写的

串口初始化

void uart_com0_init(){                   //初始化串口
    u32 gpcom_sel = GPCOM0_BASE_ADDR;
    INTDEV_SET_CLK_RST(gpcom_sel,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV4));

    GPCOM_SET_IN_PORT(gpcom_sel,(GPCOM_RXD_IS_P1));         //设置P1为RXD
    GPCOM_SET_OUT_PORT(gpcom_sel,( \\\\
            GPCOM_P3_OUTPUT_DISABLE|GPCOM_P0_OUTPUT_ENABLE|GPCOM_P2_OUTPUT_DISABLE|GPCOM_P1_OUTPUT_DISABLE| \\\\
            GPCOM_P3_IS_HIGH       |GPCOM_P0_IS_TXD       |GPCOM_P2_IS_HIGH       |GPCOM_P1_IS_HIGH \\\\
                      ));//设置P0为TXD

    GPCOM_SET_COM_MODE(gpcom_sel,GPCOM_UART_MODE);//

    GPCOM_SET_COM_SPEED(gpcom_sel,12000000,115200);

    GPCOM_SET_OVERRIDE_GPIO(gpcom_sel, ( \\\\
            GPCOM_P0_OVERRIDE_GPIO|GPCOM_P1_INPUT_ENABLE | \\\\
            GPCOM_P3_OVERRIDE_GPIO \\\\
                                              ));
}

在线程4接收串口数据

void thread4_main(void)
{
    uart_com0_init();

        u8 rx_data_rp=0;
        rx_data_rp=GPCOM_GET_RX_WP(GPCOM0_BASE_ADDR);
        while(1) {
             if(rx_data_rp!=(GPCOM_GET_RX_WP(GPCOM0_BASE_ADDR))){
                 ADC_VAL=GPCOM_GET_RX_DATA(GPCOM0_BASE_ADDR,rx_data_rp);//最大值255,目前只知道
//                  GPCOM_PUSH_TX_DATA(GPCOM0_BASE_ADDR,ADC_VAL);
                  rx_data_rp++;
                  rx_data_rp&=0x0f;
             }

    }
    thread_end();
}

二、CH32V203部分

由于目前找到CH32V203的代码不确定能不能用,因为CH32V203跟烧录代码相关,所以不敢更改代码烧录测试。等待后续资料更全后再更新后续。。。。

彩虹灯驱动成功!!!

更多回帖

×
发帖