0

UART からデータを受信する STM32F0 DMA に問題があります。非循環モードで 2 つの DMA チャネル (rx と tx 用) を使用しています。rx チャネルの優先度は低くなります。UART からのデータは Idle Line 割り込みで処理され、ここで DMA 受信バイト数を読み取って処理します。パッケージ内のバイト数が DMA バッファ サイズ以下になるまで、すべて正常に動作します。そうしないと、DMA が奇妙にオフになり、次の Idle Line 割り込みによって 1、0、0、... の DMA 受信バイト数が返されます。コードの一部を次に示します。ここでは、DMA バッファがいっぱいになっているかどうかを確認し、DMA カウンタをバッファ サイズにリセットしようとしています。

#define S_M_INPUT_CMD_SIZE 20
static char s_m_uart_dma_in_buff[S_M_INPUT_CMD_SIZE + 1]; 

void USART1_IRQHandler(void)
{
   ITStatus reception_status = USART_GetITStatus(USART1, USART_IT_IDLE);
   if(reception_status != RESET)
   {
      int32_t bytes_number = S_M_INPUT_CMD_SIZE - DMA_GetCurrDataCounter(DMA1_Channel3);            
      if (DMA_GetFlagStatus(DMA1_FLAG_TC3) != RESET)
      {
         USART_ITConfig(UART_, USART_IT_IDLE, DISABLE);
         DMA_Cmd(DMA1_Channel3, DISABLE);
         while (DMA1_Channel3->CCR & DMA_CCR_EN);
         for (int i = 0; i < S_M_INPUT_CMD_SIZE; i++)
            s_m_uart_dma_in_buff[i] = '\0'; 
         DMA_SetCurrDataCounter(DMA1_Channel3, S_M_INPUT_CMD_SIZE); 
         DMA_Cmd(DMA1_Channel3, ENABLE); 
         DMA_ClearFlag(DMA1_FLAG_GL3);
      }
      USART_ClearITPendingBit(UART_, USART_IT_IDLE);
   } 
}

最初の「オーバーフロー」と DMA の有効化の後、rx レジスタにあった「バッファ サイズ + 1」バイトが来て、その後、受信バイト数はゼロで安定します。私が間違っていることは何ですか?

4

1 に答える 1