Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 HAL: не отправляются данные через UART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
ArchiDevil
Здравия всем.

Проблема в следующем: не отправляются данные через USART1 или USART2 (другие не пробовал). Прием с ПК работает нормально.
Работаю с платой через STMCube, соответственно HAL. Упростил уже всё до предела, не понимаю в чем проблема.
Отправлял данные с USART1 на USART2 (не приходит вообще ничего), отправлял данные на ПК (смотрел четырьмя терминалами: везде приходит разный мусор).
Настройки самые обычные: 9600 бод, 8 бит данные, 1 стоп-бит. Контроль четности выключен. Приемник и передатчик (в случае USART1 -> USART2) настроены одинаково.
Смотрел двумя дебаггерами, при USART1 -> USART2 случае SR->RXNE не взводится, DR пустой (иногда содержит мусор). Изредка RXNE поднимается перед HAL_Delay, но после задержки снова становится нулем.

Что забавно, код на SPL работает.

Код
while (1)
{
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);

    uint8_t send_data[] = {'A'};
    if(HAL_UART_Transmit(&huart1, send_data, 1, HAL_MAX_DELAY) != HAL_OK)
        Error_Handler();

    HAL_Delay(1000);
    uint8_t receive_data[] = {0};
    if(HAL_UART_Receive(&huart2, receive_data, 1, HAL_MAX_DELAY) != HAL_OK)
        Error_Handler();

    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET);
}


Если делать отправку просто через регистры, типа такого:
Код
void send_to_uart(uint8_t data)
{
while(!(USART1->SR & USART_SR_TC));
USART1->DR = data;
}
uint8_t receive_from_uart()
{
  while(!(USART2->SR & USART_SR_RXNE));
  return USART2->DR & 0xFF;
}

То аналогично вешаемся на while в приеме не дожидаясь RXNE. Причина в конфигурации?

Уже и не знаю куда копать. Кто-нибудь может помочь?
ArchiDevil
Попробовал принять через прерывание на USART2, прерывания не возникло, сколько бы байт я там не отправлял. Смена скорости отправки так же ни на что не влияет. В SR все биты с ошибками по нулям. Продолжаю перебирать всё подряд.

Что еще более удивительно: если замкнуть RX-TX на USART2, то всё работает правильно.

Методом тыка выяснил, что не работает передача с USART1 на USART2, в обратную сторону всё нормально. Замыкание RX-TX на первом ничего не дает. Переключение USART1 на другие пины также ничего не дает.

Проблема решена. На третий день я случайно заметил в доке (я юзаю STM32F4Discovery плату), что там на TX ноге висит конденсатор на землю на 4.7 uF). В общем, на 250 baud-rate работает нормально, ну а выше, конечно, нет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.