Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

HAL_UARTEx_RxEventCallback не вызывается

Пн апр 11, 2022 00:30:24

Всем привет! Подскажите пожалуйста, не срабатывает Callback
Спойлер
Код:
char str[1024] = { 0 };
int main(void) {
   MX_USART1_UART_Init();
   MX_USART2_UART_Init();
   HAL_UARTEx_ReceiveToIdle_IT(&huart1, str, 1024);
   while (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 = 9600;
   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(&huart1) != HAL_OK) {
      Error_Handler();
   }
   /* USER CODE BEGIN USART1_Init 2 */

   /* USER CODE END USART1_Init 2 */

}

/**
 * @brief USART2 Initialization Function
 * @param None
 * @retval None
 */
static void MX_USART2_UART_Init(void) {

   /* USER CODE BEGIN USART2_Init 0 */

   /* USER CODE END USART2_Init 0 */

   /* USER CODE BEGIN USART2_Init 1 */

   /* USER CODE END USART2_Init 1 */
   huart2.Instance = USART2;
   huart2.Init.BaudRate = 115200;
   huart2.Init.WordLength = UART_WORDLENGTH_8B;
   huart2.Init.StopBits = UART_STOPBITS_1;
   huart2.Init.Parity = UART_PARITY_NONE;
   huart2.Init.Mode = UART_MODE_TX_RX;
   huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
   huart2.Init.OverSampling = UART_OVERSAMPLING_16;
   if (HAL_UART_Init(&huart2) != HAL_OK) {
      Error_Handler();
   }
   /* USER CODE BEGIN USART2_Init 2 */

   /* USER CODE END USART2_Init 2 */

}

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {
   if (huart->Instance == USART1) {
      HAL_UART_Transmit_IT(&huart2, str, Size);
      HAL_UARTEx_ReceiveToIdle_IT(&huart1, str, 1024);
   }
}
При этом если я перенастрою все так чтобы работало все по USART2 то все отрабатывает . Что отправляю в терминале то и получаю.

Но вот в таком виде, когда данные должны приходить на USART1 и уходить в USART2 ничего не происходит. Согласно отладчика в Callback даже не прилетаем.

Технически это прием по USART1 данных от GPS приемника и передача их в USART2 на виртуальный комп порт в терминал на ПК.

Один раз, когда я "прозванивал" сигнал анализатором то волшебным образом данные в терминале я начал видеть, однако потом когда перезапустил МК то все пропало.
Анализатором снимал данные непосредственно с припаянного в плату nucleo пина и сигнал там есть.

Подскажите пожалуйста в чем может быть проблема?

Добавлено after 22 minutes 19 seconds:
При этом во время работы программы str не пустая
Спойлер
Код:
Name : str
   Details:"b", '\0' <repeats 1022 times>
но значение не меняется, сколько бы я не прокручивал программу в отладчике

Re: HAL_UARTEx_RxEventCallback не вызывается

Пн апр 11, 2022 16:35:01

Какаято ерунда происходит. Когда проверял просто передачу через прерывания (HAL_UART_Receive_IT(&huart1, str, 10);). То поймал момент, когда я разъединял линию и мне в терминал приходили 00 . Причем когда я брался(линия разорвана была) просто за провода (у меня макетные провода для ардуино) одной рукой за один провод, другой за другой то передача прерывалась. Потом соединил линию и увидел что сообщения пошли, переписал все на HAL_UARTEx_ReceiveToIdle_IT, не заработало. Снова переписал на HAL_UART_Receive_IT и все линия молчит, нулей тоже нет. Как бы я не трогал руками схему

Re: HAL_UARTEx_RxEventCallback не вызывается

Пн апр 11, 2022 17:00:51

The Rock писал(а):То поймал момент, когда я разъединял линию и мне в терминал приходили 00

Сам подумай: как из линии, притянутой к "1", могут приходить "нули"? Неужели у тебя ничё не ёкает на "0" из UART?

Re: HAL_UARTEx_RxEventCallback не вызывается

Пн апр 11, 2022 17:34:49

tonyk писал(а):Сам подумай: как из линии, притянутой к "1", могут приходить "нули"? Неужели у тебя ничё не ёкает на "0" из UART?

К сожалению это полностью первый мой опыт работы с МК и да я, пока этого не понимаю ( Приходили коды ASCII 00
КЗ на линиях нет, при прозвонке мультиметром напряжение на TX линии от 3.3В до 1.2В
Если отсоединить GPS и померить напряжение на пине входа МК, то судя по всему там нет никакой подтяжки никуда. Как и написано в кубе в характеристиках этой ножки
Спойлер
Код:
    GPIO_InitStruct.Pin = GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


Добавлено after 25 minutes 13 seconds:
Нашел где в кубе можно поменять режим ножки PB7 на Pull-Up .
Теперь данные в терминале на ПК я вижу, только если сделаю так:
Отсоединяю линию TX GPS приемника - подаю питание на стм - соединяю линию TX GPS приемника с МК и данные начинают поступать.
Если загрузится с подключенной линией, то не работает ... Изза чего это может быть?

Re: HAL_UARTEx_RxEventCallback не вызывается

Пн апр 11, 2022 19:16:54

The Rock писал(а): напряжение на TX линии от 3.3В до 1.2В

ППЦ.
Может, сначала теорию изучим, а потом за проводки хвататься будем?

Re: HAL_UARTEx_RxEventCallback не вызывается

Пн апр 11, 2022 23:14:50

А вы можете пояснить что не так?
Я впринципе понимаю, что мультиметром я ничего не увижу. Это я так максимально подробно писал, то что я имею сейчас в надежде подучить какой-то прямой совет или помощь в решение моей ситуации

Re: HAL_UARTEx_RxEventCallback не вызывается

Вт апр 12, 2022 13:11:36

Настрой сначала первый UART на передачу. Проверь, летят ли байты. Когда убедишься, что летят, то только после этого настраивай второй на прием.
Также попробуй добавить вот это.

Код:
   HAL_NVIC_SetPriority(UART4_IRQn, 15, 0);
   HAL_NVIC_EnableIRQ(UART4_IRQn);


Ну только в твоем случае поменяй UART4 на свой

Re: HAL_UARTEx_RxEventCallback не вызывается

Вт апр 12, 2022 14:42:00

Cheeseman писал(а):Настрой сначала первый UART на передачу. Проверь, летят ли байты. Когда убедишься, что летят, то только после этого настраивай второй на прием.
Также попробуй добавить вот это.
Вы имеете ввиду проверить исправность UART1, при помощи например USB-UART конвертера?

А может быть проблема в какой-то коммутации или порядке вызова инициализаций? Получил сегодня второй приемник GPS он ведет себя один в один так же. Т.е. если загрузится без модуля и потом его подключить то все работает отлично. А если с подключенным то нифига

Re: HAL_UARTEx_RxEventCallback не вызывается

Вт апр 12, 2022 17:41:31

Имею в виду, что подключать после настройки и проверки периферии надо. Как понял один UART на отправку. Второй на прием. Настраиваешь сначала первый на отправку. Пишешь какую-нибудь функцию тип void SendData(uint8_t data). и в бесконечном цикле отправляешь байт, к примеру 0xAA . Анализатором или осциллографом проверяешь работает или нет. Далее настраиваешь второй USART на прием. Выдаешь какие-нибудь данные. Можешь даже с USARTA который на передачу настроен и проверяешь пришли данные или нет. После этого уже подключаешь железяку. У меня где-то на компе валялся код инициализации USARTA на прием и на передачу. Завтра скину, если не забуду. Если правильно понял, то с ним именно проблема

Re: HAL_UARTEx_RxEventCallback не вызывается

Вт апр 12, 2022 20:30:19

Cheeseman, Спасибо с советом о перепроверке вы мне помогли. Я открыл чистый проект в кубе, и у меня все заработало. В итоге вооружившись двойными слешами нашел, что у меня какаято проблема в инициализации дисплея. Но при этом если включить прием UART перед инициализацией дисплея то все работает. Спасибо!
Ответить