打印

困扰中GD32L233串口一直自动发送数据

[复制链接]
97|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 清一色 于 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");
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝