hongyaolee 发表于 2024-1-29 20:11

DMA串口发送问题,重新设置TXNUM失败

我采用的是不循环的模式,在发送完成中断里面关DMA,然后在需要发送数据时根据需要发送的长度重新设置TXNUM,然后打开DMA,但好像没起作用
代码如下:
发送完成中断:
void DMA_Channel5_IRQHandler(void)
{
        if (DMA_GetIntStatus(DMA_INT_TXC5, DMA) != RESET)
        {
                DMA_EnableChannel(UART4_Tx_DMA_Channel, DISABLE);
                DMA_ClrIntPendingBit(DMA_INT_TXC5, DMA);
        }
}
发送数据:
void moy_uart_set_dma_buf(const uint8_t *data, uint32_t length)
{
        memcpy(tx_buff, data, length);
        DMA_SetCurrDataCounter(UART4_Tx_DMA_Channel, length);
        DMA_EnableChannel(UART4_Tx_DMA_Channel, ENABLE);
}

hongyaolee 发表于 2024-1-29 21:23

在发送数据函数使能DMA那里打断点,TX出来的数据就都是对的,没有一个字节多或者少,不打断点让他自己跑,TX的数据就不对了

一周一天班 发表于 2024-1-30 09:04

void moy_uart_set_dma_buf(const uint8_t *data, uint32_t length)
{
       while(UART4_Tx_DMA_Channel->CHCFG & DMA_CHCFG1_CHEN);
      memcpy(tx_buff, data, length);
      DMA_SetCurrDataCounter(UART4_Tx_DMA_Channel, length);
      DMA_EnableChannel(UART4_Tx_DMA_Channel, ENABLE);
}

hongyaolee 发表于 2024-1-30 10:16

一周一天班 发表于 2024-1-30 09:04
void moy_uart_set_dma_buf(const uint8_t *data, uint32_t length)
{
       while(UART4_Tx_DMA_Channel- ...

可以了,非常感谢{:handshake:}

cr315 发表于 2024-2-1 16:52

检查TXNUM的值是否在允许的范围内
页: [1]
查看完整版本: DMA串口发送问题,重新设置TXNUM失败