HAL_UART_RxCpltCallback () не выполняется - PullRequest
0 голосов
/ 23 марта 2019

Я хочу отправить 10 байтов данных через UART loopback в режиме прерывания.Хотя я могу получать данные, я не понимаю, почему мой HAL_UART_RxCpltCallback () не выполняется.Но мой HAL_UART_TxCpltCallback () выполняется каждый раз после передачи байта данных.Я сгенерировал код через cubeMX.Я включил глобальное прерывание USART2.Мой контрольный регистр (CR1) для моего USART2 - 0x300c.То есть биты UE, M, TE, RE устанавливаются только.Биты TXIE, TCIE НЕ устанавливаются в регистр CR1.Теперь, что здесь означает «глобальный» в глобальном прерывании?Означает ли это, что прерывание генерируется из любого из 10 источников (упомянутых в техническом описании, например, завершение передачи, заполнение буфера приема и т. Д.)?

Ни один из битов, соответствующих прерываниям, не разрешен в регистре CR1.Но элемент управления обращается к HAL_UART_TxCpltCallback () каждый раз, когда передает байт данных.Почему это происходит?

Пожалуйста, раскройте тайну.

PS: Я использую плату STM32F407G-DISC1, Attolic Truestudio IDE, ОС Ubuntu 16.04.

UART_HandleTypeDef huart2;


void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
uint8_t tx_data[] = {0,1,2,3,4,5,6,7,8,9};
uint8_t rx_data[10];

int main(void)
{
   int i=0;
   HAL_Init();
   SystemClock_Config();
   MX_GPIO_Init();
   MX_USART2_UART_Init();
   while (1)
   {
      HAL_UART_Transmit_IT(&huart2, &tx_data[i], 10);
      HAL_Delay(1500);
      HAL_UART_Receive_IT(&huart2, &rx_data[i] , 10);
      HAL_Delay(1500);

      if((xferCnt==10) || (rxCnt==10))
           break;
      else
           i++;
   }

 }

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    xferCnt++;
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    rxCnt++;
}
...