板子上个月末就拿到手了,由于撞上几门考试耽误了一下。现在我要用这块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)
下面是串口接收部分代码,仿照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);
rx_data_rp++;
rx_data_rp&=0x0f;
}
}
thread_end();
}
二、CH32V203部分
由于目前找到CH32V203的代码不确定能不能用,因为CH32V203跟烧录代码相关,所以不敢更改代码烧录测试。等待后续资料更全后再更新后续。。。。
彩虹灯驱动成功!!!
|