c - STM32F1 USART DMA TX 未完成第二次传输

标签 c

希望有人能指出我的无能。 我已使用 DMA 中断设置 USART 进行 DMA 传输。

void DMA1_Channel7_IRQHandler(void)
{
    //  USART2 TX handler
    /* Test on DMA Stream Transfer Complete interrupt */
    if (DMA_GetITStatus(DMA1_IT_TC7))
    {
       /* Clear DMA Stream Transfer Complete interrupt pending bit */
       DMA_ClearITPendingBit(DMA1_IT_GL7 | DMA1_IT_TC7);
    }
   DMA_Cmd(DMA1_Channel7, DISABLE);
}

我正在尝试使用以下命令将数据发送到 TX 缓冲区:

SCICommsStringIntoTxQ("\n\rTEST_CODE V0.01: \r\n");

命令在哪里

 void SCICommsStringIntoTxQ(int8_t * str_out_string)
{
    memset(TxBuffer, '\0', sizeof(TxBuffer)); 
    strcpy(TxBuffer, str_out_string);
    USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);
    DMA_Cmd ( DMA1_Channel7, ENABLE );
}

我的 DMA 初始化是:-

/* Configures the DMA1 Channel7 for UART2_CHAN Transmission. */
   DMA_DeInit(DMA_Channel_USART2_TX);
   DMA7_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(USART2->DR);
   DMA7_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
   DMA7_InitStructure.DMA_BufferSize = (uint16_t)sizeof(TxBuffer) -1;
   DMA7_InitStructure.DMA_MemoryBaseAddr = (uint32_t)TxBuffer;
   DMA7_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
   DMA7_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
   DMA7_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
   DMA7_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
   DMA7_InitStructure.DMA_Mode = DMA_Mode_Normal;
   DMA7_InitStructure.DMA_Priority = DMA_Priority_High;
   DMA7_InitStructure.DMA_M2M = DMA_M2M_Disable;
   DMA_Init(DMA_Channel_USART2_TX, &DMA7_InitStructure);

   USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE); // Enable USART2 DMA TX
   DMA_ITConfig(DMA_Channel_USART2_TX, DMA_IT_TC, ENABLE);

第一次发送工作正常,但是一旦我尝试发送下一个字符串,它就会破坏我的第一个字符串。谁能告诉我我做错了什么?

最佳答案

感谢您抽出时间回复。我没有检查或等待 USART 完成。我以为 DMA 会解决这个问题。在将下一个字符串发送到 DMA 之前,我是否应该查看 UART XE(传输数据空标志)?

关于c - STM32F1 USART DMA TX 未完成第二次传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42281603/

相关文章:

我们不能初始化自动数组变量吗?

C 中的砍伐路径

c++ - 动态库没有静态库文件的符号

c - 为什么当我们返回本地地址而不是本地变量时会产生运行时错误?

c - 检查数组中的数字是否有公因数的省时方法?

c - ONP 中的段错误

c - 按钮长按后停止计数

c - 在 C 中定义 "between"宏的最佳方式

c - 记录对文件的函数调用并将此日志文件用作程序代码

c - 如何从 CodeVision AVR 迁移到 AVR Studio 5