串口1 DMA发送 9位格式 串口无输出,不知道什么原因

看了好多遍,感觉没啥问题啊


void USART1_CFG(void)

{

  GPIO_InitTypeDef  GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef  NVIC_InitStructure;


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);


  /* USART2 TX-->A.2   RX-->A.3 */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init(GPIOA, &GPIO_InitStructure);


    USART_InitStructure.USART_BaudRate = 250000;

    USART_InitStructure.USART_WordLength = USART_WordLength_9b;

    USART_InitStructure.USART_StopBits = USART_StopBits_1;

    USART_InitStructure.USART_Parity = USART_Parity_No;

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    USART_InitStructure.USART_Mode = USART_Mode_Tx ;    //DMX512这里只发送数据


  USART_Init(USART1, &USART_InitStructure);

//    USART_ITConfig(USART1, USART_IT_TXE, ENABLE);


    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);


//  DMA_Cmd(DMA1_Channel4, ENABLE);                                    /* USART1 Tx */

//  DMA_Cmd(DMA1_Channel5, ENABLE);                                    /* USART1 Rx */


  USART_Cmd(USART2, ENABLE);

}


/*******************************************************************************

* Function Name  : DMA_INIT

* Description    : Configures the DMA for USART1.

* Input          : None

* Return         : None

*******************************************************************************/

void DMA_INIT(void)

{

    DMA_InitTypeDef DMA_InitStructure;

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);


  DMA_DeInit(DMA1_Channel4);

  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DATAR);  /* USART2->DATAR:0x40004404 */

  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)Tx_Buffer;

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

  DMA_InitStructure.DMA_BufferSize = DMX_CHN;

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;

  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;

  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  DMA_Init(DMA1_Channel4, &DMA_InitStructure);


//    DMA_DeInit(DMA1_Channel5);

//  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART2->DATAR);

//  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)RxBuffer1;

//  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

//  DMA_InitStructure.DMA_BufferSize = TxSize2;

//  DMA_Init(DMA1_Channel5, &DMA_InitStructure);

}


void DMX_Init()        //初始化 主函数调用

{

    USART1_CFG();

    DMA_INIT();

    USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);//|USART_DMAReq_Rx

}

static void USART_Send9Data(void)

{

    uint16_t tmp;

    DMA_Cmd(DMA1_Channel4, DISABLE);                                    /* USART1 Tx */

    for(tmp=0;tmp

    {

       Tx_Buffer[tmp] = (uint16_t)DMX_SendData[tmp]+0x0100;        //数据第9位为高

    }

    DMA_Cmd(DMA1_Channel4, ENABLE);                                    /* USART1 Tx */

    

}



您好,大概看了一下你的程序,在串口初始化配置的时候就有有一个问题,你串口配置的是串口1,但在使能的时候配置的是串口2,如下图,建议你再仔细检查一下程序。

image.png



大意了,非常感谢;我现在只能发送一次数据,debug发现,在dma第二次数据传输后,发送完成标志位一直没有置位,所以在这里造成了死循环

5.png

请问 可能是什么原因造成的,谢谢


您好,我看你DMA的传输方式配置为正常模式,传输结束后要开启新的DMA操作,你可按照下列方法尝试一下:在关闭DMA并清除传输完成标志之后,重新配置一下DMA传输数目的大小,然后再开启DMA。可通过调用DMA_SetCurrDataCounter函数设置DMA输出数目的大小。


只有登录才能回复,可以选择微信账号登录