4

FreeRTOS と STM32CubeMX を備えたSTM32L432デバイスを使用しています。

ASCII プロトコルに基づいて USART 経由で M2M 通信を実装しようとしています。プロトコル シーケンスの長さは異なる場合がありますが、最大長と定義済みの終了文字 (' \r ' / 0x0D ) があります。

そこで、すべての RX-USART データを DMA ( FIFOなど) で収集し、フラグに基づいてアドレス一致 isr を使用してUSART_ICR_CMCF終了文字を決定することを考えました。

USART1 を初期化し、アドレス一致 isr を有効にする

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) {
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(uartHandle->Instance==USART1) {
    /* USART1 clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* USART1 interrupt Init */
    HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);

    /* USER CODE BEGIN USART1_MspInit 1 */
    USART1->CR2 |= 0x0D000000; // \r 0x0D
    __HAL_UART_ENABLE_IT(&huart1,UART_IT_CM);
  }
}

USART1 isr ハンドラ

void USART1_IRQHandler(void) {
  if (USART1->ISR & USART_ISR_CMF) {
    data = USART1->RDR;  
    SET_BIT(USART1->ICR,USART_ICR_CMCF);
  }
  HAL_UART_IRQHandler(&huart1);
}

現在、アドレス一致 isr は正常に動作していますが、DMA / FIFO サポートを実装する方法がわかりません。

ところで:

デバイスが USART HW FIFO をサポートしていないことに非常に驚きました。一般的に使用される FIFO を再現するために DMA を使用するという私の考えはありますか?

4

1 に答える 1