- 下面把官方提供的实例验证一下,由于实例功能都是单一的,下载程序,一一验证,点灯,按键功能,串口发送接收都有实现,这里不一一叙述。虚拟USB功能,设备驱动安装失败,无法连接验证。有哪位大神知道哪里有驱动更新?windows自动搜索没有。
- 接下来在官方提供GD32L23x_Firmware_Library_V1.0.1下Examples,尝试一下串口打印功能,可以打印一些调试信息。
- 根据提供的Examples,这里选择DMA方式发送和接收。
- 打开一个项目,移植USART和DMA部分,tx选择DMA_CH0,tx初始化部分如下:
- dma_channel_enum dma_channel_tx;
- /*!
- \brief initialize the dma_USART_tx configuration of the com
- \param[in] none
- \param[out] none
- \retval none
- */
- void dma_usart_tx_deinit(void)
- {
- dma_parameter_struct dma_init_struct;
- /* enable DMA clock */
- rcu_periph_clock_enable(RCU_DMA);
-
- /* initialize DMA channel 0 */
- dma_channel_tx = DMA_CH0;//rx---DMA channel 1
-
- dma_deinit(dma_channel_tx);
- dma_struct_para_init(&dma_init_struct);
- dma_init_struct.request = DMA_REQUEST_USART0_TX;
- dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
- // dma_init_struct.memory_addr = (uint32_t)txbuffer;
- dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
- dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
- // dma_init_struct.number = ARRAYNUM(txbuffer);
- dma_init_struct.periph_addr = (uint32_t)USART0_TDATA_ADDRESS;
- dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
- dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
- dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
- dma_init(dma_channel_tx, &dma_init_struct);
-
- /* configure DMA mode */
- dma_circulation_disable(dma_channel_tx);
- dma_memory_to_memory_disable(dma_channel_tx);
- /* disable the DMAMUX_MUXCH0 synchronization mode */
- dmamux_synchronization_disable(DMAMUX_MUXCH0);
- /* enable DMA channel 0 */
- dma_channel_enable(dma_channel_tx);
-
- /* USART DMA enable for transmission */
- usart_dma_transmit_config(USART0, USART_DENT_ENABLE);
- /* wait DMA Channel transfer complete */
-
- }
(3)rx选择DMA_CH1,rx初始化部分如下:
- dma_channel_enum dma_channel_rx;
- \brief initialize the dma_USART_rx configuration of the com
- \param[in] none
- \param[out] none
- \retval none
- */
- void dma_usart_rx_deinit(void)
- {
- dma_parameter_struct dma_init_struct;
-
- dma_channel_rx = DMA_CH1;//rx---DMA channel 1
-
- dma_deinit(dma_channel_rx);
- dma_struct_para_init(&dma_init_struct);
- dma_init_struct.request = DMA_REQUEST_USART0_RX;
- dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
- dma_init_struct.memory_addr = (uint32_t)rxbuffer;
- dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
- dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
- dma_init_struct.number = ARRAYNUM(rxbuffer);
- dma_init_struct.periph_addr = (uint32_t)USART0_RDATA_ADDRESS;
- dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
- dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
- dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
- dma_init(dma_channel_rx, &dma_init_struct);
-
- /* configure DMA mode */
- dma_circulation_disable(dma_channel_rx);
- dma_memory_to_memory_disable(dma_channel_rx);
- /* disable the DMAMUX_MUXCH1 synchronization mode */
- dmamux_synchronization_disable(DMAMUX_MUXCH1);
-
- /* enable DMA channel */
- dma_channel_enable(dma_channel_rx);
- /* USART DMA enable for reception */
- usart_dma_receive_config(USART0, USART_DENR_ENABLE);
- /* wait DMA channel 1 transfer complete */
-
- }
(4)rx 接收并打印接收信息,放main函数中调用。
- #define RX_NUM 100
- uint8_t rxbuffer[RX_NUM]="\0";
- void dma_usart_rx_process(void)
- {
- if(RESET == dma_flag_get(dma_channel_rx, DMA_FLAG_FTF))
- {
- if(rxbuffer[0] != '\0')
- {
- printf("\n\r%s\n\r", rxbuffer);
- //transfer_status = judge_rx_result();
- usart_clear_buffer(rxbuffer,RX_NUM);
- /* initialize the rx */
- dma_usart_rx_deinit();
- }
- }
- }
- /*!
- \brief clear buffer
- \param[in] buffer[] num
- \param[out] none
- \retval none
- */
- void usart_clear_buffer(uint8_t *buffer,uint32_t num)
- {
- uint32_t i = 0;
- for(i = 0;i < num; i++)
- {
- buffer = '\0';
- }
- }
-
(5)上电初始化 usart 和dma 的tx及rx。用mini USB接口,连接板子上的USART口,打开串口调试器,设置调试器相关参数。初始化时,波特率是115200,调试器对应设置即可,打开串口。
(6)上电,打印如下信息。发送内容对应接收内容
- 加入按键(用测试板上的按键 wakeup)和灯(用测试板上LED1-LED4),验证调试打印信息。
- 初始化按键,然后开启按键扫描,得到按键结果。
- enum {
- KEY_EVENT_CLICK, //短按
- KEY_EVENT_LONG, //长按
- KEY_EVENT_HOLD, //保持
- KEY_EVENT_UP, //松开
- KEY_EVENT_DOUBLE_CLICK, //双击
- KEY_EVENT_TRIPLE_CLICK, //三击
- KEY_EVENT_FOURTH_CLICK, //四击
- KEY_EVENT_FIRTH_CLICK, //五击
- };
(2)初始化LED灯,响应不同的按键操作。
- enum {
- LED_OFF, //灯灭
- LED_ON, //灯亮
- LED_Shine, //灯闪
- LED_Water01, //灯流水01
- LED_Water02, //灯流水02
- };
(3)打印按键结果和灯的状态信息。
- 实例功能验证就到这里,上面有些地方写的简单,也比较乱,欢迎指正,一起学习进步。
- 后面会对低功耗进行验证。
|