HAL_UART_Receive_IT запускается только один раз

#uart #interrupt-handling #hal

#uart #обработка прерываний #hal

Вопрос:

Я использую библиотеку HAL, но прерывание приема срабатывает только один раз.

Я пробовал отлаживать его, но я все еще не могу понять, с чего начать.

Не уверен, какой флаг состояния установлен, чтобы я мог повторно включить или отключить его, чтобы запустить еще один раунд. Таблица данных немного расплывчата, потому что STM не предоставляет подробную копию. Я использую STM32F303K8.

 uint8_t rcvd, count = 0, reception_complete = FALSE;
char buffer[100];

int main(void)
{
    HAL_Init();
    SystemClockConfig();
    UART2_Init();

    __HAL_UART_ENABLE_IT(amp;huart2, UART_IT_RXNE);

    while(1){

        if(reception_complete == FALSE) {
            HAL_UART_Receive_IT(amp;huart2, amp;rcvd, 1);
        }
        else {
            ReturnProcessedString();
            reception_complete = FALSE;
        }
    }

    return 0;
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART2)
    {
        if(rcvd == 'r'){
            reception_complete = TRUE;
            buffer[count  ] = 'r';

            count = 0;

        }else {
            buffer[count  ] = rcvd;
        }
    }
}
 

Ответ №1:

У меня была такая же проблема с вами, и я провел много тестов за пять дней, но результаты не были хорошими. Но я решил эту проблему с помощью кого-то, кого я узнал через чей-то блог. Поэтому я хочу, чтобы вы поделились решением. Моя проблема заключалась в том, что я использовал printf в маршруте прерывания и обратном вызове. Это неправильное поведение. Кроме того, отладчик работает только один раз. Поэтому полученные результаты должны быть проверены командой trasmit. Я использовал TX с UART3 и RX с UART6. Если было много данных RX, возникла проблема с отправкой TX как есть, поэтому мне пришлось распечатать 100-е данные. Я подтвердил, что 3000 байт работают без каких-либо проблем. Если вам нужен мой тестовый код, отправьте мне следующий адрес электронной почты. nicehans72@gmail.com . Я тебя отпущу.

main.c

 volatile uint8_t rxd[10];
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */


  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_UART7_Init();
  MX_UART8_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  MX_USART3_UART_Init();
  MX_USART6_UART_Init();
  /* USER CODE BEGIN 2 */

    HAL_UART_Receive_IT(amp;huart6, (uint8_t *)rxd, 1);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

int a=0;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
    a  ;
    if(UartHandle->Instance == USART6)
    {
        if (a0==0)
            HAL_UART_Transmit(amp;huart3, (uint8_t *)rxd, 1, 0xFFFF);
        HAL_UART_Receive_IT(amp;huart6, (uint8_t *)rxd, 1);
    }
}

static void MX_USART3_UART_Init(void)
{

  /* USER CODE BEGIN USART3_Init 0 */

  /* USER CODE END USART3_Init 0 */

  /* USER CODE BEGIN USART3_Init 1 */

  /* USER CODE END USART3_Init 1 */
  huart3.Instance = USART3;
  huart3.Init.BaudRate = 9600;
  huart3.Init.WordLength = UART_WORDLENGTH_8B;
  huart3.Init.StopBits = UART_STOPBITS_1;
  huart3.Init.Parity = UART_PARITY_NONE;
  huart3.Init.Mode = UART_MODE_TX_RX;
  huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(amp;huart3) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART3_Init 2 */

  /* USER CODE END USART3_Init 2 */

}

static void MX_USART6_UART_Init(void)
{

  /* USER CODE BEGIN USART6_Init 0 */

  /* USER CODE END USART6_Init 0 */

  /* USER CODE BEGIN USART6_Init 1 */

  /* USER CODE END USART6_Init 1 */
  huart6.Instance = USART6;
  huart6.Init.BaudRate = 9600;
  huart6.Init.WordLength = UART_WORDLENGTH_8B;
  huart6.Init.StopBits = UART_STOPBITS_1;
  huart6.Init.Parity = UART_PARITY_NONE;
  huart6.Init.Mode = UART_MODE_TX_RX;
  huart6.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart6.Init.OverSampling = UART_OVERSAMPLING_16;
  huart6.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart6.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(amp;huart6) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART6_Init 2 */

  /* USER CODE END USART6_Init 2 */

}
 

stm32f7xx_it.c

 void USART3_IRQHandler(void)
{
  /* USER CODE BEGIN USART3_IRQn 0 */

  /* USER CODE END USART3_IRQn 0 */
  HAL_UART_IRQHandler(amp;huart3);
  /* USER CODE BEGIN USART3_IRQn 1 */

  /* USER CODE END USART3_IRQn 1 */
}

void USART6_IRQHandler(void)
{
  /* USER CODE BEGIN USART6_IRQn 0 */

  /* USER CODE END USART6_IRQn 0 */
  //
    HAL_UART_IRQHandler(amp;huart6);
  /* USER CODE BEGIN USART6_IRQn 1 */

  /* USER CODE END USART6_IRQn 1 */
}