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」バイトが来て、その後、受信バイト数はゼロで安定します。私が間違っていることは何ですか?