#stm32 #uart #dma
Вопрос:
Я использую Uart1 для последовательной записи функции. И я хочу использовать этот интерфейс uart1 для получения данных неизвестной длины. Если я не использую функцию последовательной записи, я получаю данные правильно (с проверкой простоя СТРОКИ и подсчетом размера буфера DMA).
Но если я использую функцию последовательной записи, строка не может простаивать в нужное время, если я хочу печатать, получение данных с uartIdleStateActive2
флагом последовательной записи всегда ВКЛЮЧЕНО
Как я могу использовать этот if((__HAL_UART_GET_FLAG(amp;huart1, UART_FLAG_IDLE) != RESET))
случай, только получить процесс.
Я использую, как те if((__HAL_UART_GET_FLAG(amp;huart1, UART_FLAG_IDLE) != RESET) amp;amp; (__HAL_UART_GET_FLAG(amp;huart1, UART_FLAG_TC) != SET))
, но это не сработало. Как я могу проверить его, чтобы посмотреть состояние простоя во время приема?
void USART1_IRQHandler(void) { /* USER CODE BEGIN USART2_IRQn 0 */ /* UART IDLE Interrupt */ // SerialPrint("a"); if((__HAL_UART_GET_FLAG(amp;huart1, UART_FLAG_IDLE) != RESET)) { HAL_UART_DMAStop(amp;huart1); DMA_CounterCounted2 = __HAL_DMA_GET_COUNTER(huart1.hdmarx); if(((DMA_CounterCounted2) lt;= DMA_BUF_SIZE) amp;amp; (DMA_CounterCounted2 != 0)) { uartIdleStateActive2 = (_Bool)ENABLE; // SerialPrint("X"); } __HAL_UART_CLEAR_IDLEFLAG(amp;huart1); } /* USER CODE END USART2_IRQn 0 */ HAL_UART_IRQHandler(amp;huart1); /* USER CODE BEGIN USART2_IRQn 1 */ /* USER CODE END USART2_IRQn 1 */ }
Конфигурации UART 1:
static void MX_USART1_UART_Init(void) { /* USER CODE BEGIN USART1_Init 0 */ /* USER CODE END USART1_Init 0 */ /* USER CODE BEGIN USART1_Init 1 */ /* USER CODE END USART1_Init 1 */ huart1.Instance = USART1; huart1.Init.BaudRate = 230400U; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(amp;huart1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART1_Init 2 */ __HAL_UART_ENABLE_IT(amp;huart1, UART_IT_IDLE); // __HAL_UART_ENABLE_IT(amp;huart1, UART_IT_RXNE); /* USER CODE END USART1_Init 2 */ }
Комментарии:
1. Есть флаг прерывания для простоя, у вас он включен?
__HAL_UART_ENABLE_IT(amp;huart1, UART_IT_IDLE)
2. Да, я включил. Когда я использую функцию последовательной записи для получения значения записи; флаг uartIdleStateActive2 всегда включен, я не знаю, почему ?
3. Я также добавил конфигурации Uart1