本帖最后由 清一色 于 2025-5-17 13:57 编辑
第一次使用GD32系列的MCU,用LPUART做串口通讯第发送成功一次后串口会自动不受控的发数据。各位大神何解?
void lpuart_dma_send(uint8_t *data, uint16_t length)
{
//LPUART_IRQHandler();
/* 等待上一次发送完成 */
//while(dma_flag_get(DMA_CH0, DMA_FLAG_FTF));
#if 1
if(Uart_Function.tx_complete == 1)
{
Uart_Function.tx_complete = 0;
/* 复制数据到发送缓冲区 */
memcpy(lp_txbuffer, data, length);
/* 禁用DMA通道 */
dma_channel_disable(DMA_CH0);
/* 重新配置DMA */
dma_memory_address_config(DMA_CH0,(uint32_t)data);
dma_transfer_number_config(DMA_CH0,length);
/* 重新使能DMA通道 */
//memset(lp_txbuffer, 0, 0);
dma_channel_enable(DMA_CH0);
}
#endif
}
void DMA_Channel0_IRQHandler(void)
{
if(RESET != dma_interrupt_flag_get(DMA_CH0, DMA_INT_FLAG_FTF))
{
dma_interrupt_flag_clear(DMA_CH0, DMA_INT_FLAG_G);
dma_channel_disable(DMA_CH0);
dma_pltx_count = sizeof(data_AT_RSSI_READ) - (dma_transfer_number_get(DMA_CH0));
//g_transfer_complete = SET;
Uart_Function.tx_complete = 1;
}
}
void com_lpuart_init(void)
{
/* enable COM GPIO clock */
rcu_periph_clock_enable(RCU_GPIOA);
/* enable LPUART clock */
rcu_periph_clock_enable(RCU_LPUART);
/* connect port to LPUART TX */
gpio_af_set(GPIOA, GPIO_AF_8, GPIO_PIN_2);
/* connect port to LPUART RX */
gpio_af_set(GPIOA, GPIO_AF_8, GPIO_PIN_3);
/* configure LPUART TX as alternate function push-pull */
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
/* configure LPUART RX as alternate function push-pull */
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3);
/* LPUART configure */
lpuart_deinit(LPUART0);
lpuart_word_length_set(LPUART0,LPUART_WL_8BIT);
lpuart_stop_bit_set(LPUART0,LPUART_STB_1BIT);
lpuart_parity_config(LPUART0,LPUART_PM_NONE);
lpuart_baudrate_set(LPUART0,115200U);
lpuart_receive_config(LPUART0,LPUART_RECEIVE_ENABLE);
lpuart_transmit_config(LPUART0,LPUART_TRANSMIT_ENABLE);
// 4. 使能空闲中断
lpuart_interrupt_enable(LPUART0, LPUART_INT_IDLE);
nvic_irq_enable(LPUART_IRQn,0); // 使能LPUART中断
//usart_interrupt_enable(LPUART0, USART_INT_TBE);
lpuart_enable(LPUART0);
}
void com_dma_lpuart_init(void)
{
dma_parameter_struct dma_init_struct;
/* enable DMA clock */
rcu_periph_clock_enable(RCU_DMA);
/*configure DMA interrupt*/
nvic_irq_enable(DMA_Channel0_IRQn, 0);
nvic_irq_enable(DMA_Channel1_IRQn, 0);
/**********配置LPUART_TX到DMA_CH0********/
/* initialize DMA channel 0 */
dma_deinit(DMA_CH0);
dma_struct_para_init(&dma_init_struct);
dma_init_struct.request = DMA_REQUEST_LPUART_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)&LPUART_TDATA(LPUART0);
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_CH0, &dma_init_struct);
/* configure DMA mode */
dma_circulation_disable(DMA_CH0);
dma_memory_to_memory_disable(DMA_CH0);
/* disable the DMAMUX_MUXCH0 synchronization mode */
dmamux_synchronization_disable(DMAMUX_MUXCH0);
/* LPUART DMA enable for transmission and reception */
lpuart_dma_transmit_config(LPUART0,LPUART_TRANSMIT_DMA_ENABLE);
/* enable DMA channel 0 transfer complete interrupt */
dma_interrupt_enable(DMA_CH0, DMA_INT_FTF);
/* 配置DMA发送完成中断 */
/* enable DMA channel 0 */
dma_channel_enable(DMA_CH0);
/**********配置LPUART_RX到DMA_CH1********/
/* initialize DMA channel 1 */
dma_deinit(DMA_CH1);
dma_struct_para_init(&dma_init_struct);
dma_init_struct.request = DMA_REQUEST_LPUART_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)&LPUART_RDATA(LPUART0);
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_CH1, &dma_init_struct);
/* configure DMA mode */
dma_circulation_enable(DMA_CH1);
dma_memory_to_memory_enable(DMA_CH1);
/* disable the DMAMUX_MUXCH1 synchronization mode */
dmamux_synchronization_disable(DMAMUX_MUXCH1);
/* LPUART DMA enable for reception */
lpuart_dma_receive_config(LPUART0,LPUART_RECEIVE_DMA_ENABLE);
/* enable DMA channel 1 transfer complete interrupt */
dma_interrupt_enable(DMA_CH1, DMA_INT_FTF);
/* enable DMA channel 1 */
dma_channel_enable(DMA_CH1);
printf("\n\rDMA1_Config_END\n\r");
}
|