Easyelectronics.ru

Электроника для всех
Текущее время: 22 авг 2019, 20:57

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: Не получается передать по UART на плате STM32 Nucle-L053R8
СообщениеДобавлено: 18 ноя 2015, 18:07 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 июн 2013, 22:55
Сообщения: 53
Здравствуйте, с целью обучению хотел запрограммировать самый простой режим UART
в частности асинхронный по прерыванию. В качестве отладочной платы использую
плату Nucleo-L053R8 (STM32). Информация передается с UART1 в UART2 на одной
и той же плате. TX,RX соединяю крестом.

Программу написал по образу и подобию приведенную здесь .
Т.е. сначала я конфигурирую в Cube, также как и у автора статьи меняю на обоих USART1,2 меняю
скорость на 9600, и включаю прерывание на NVIC Settings.

После генерации кода, реализую простую передачу информацию
с USART1 на USART2. Передаю через буфер (все также как и у автора статьи).
Однако проблема в том что принимающий буфер receiveBuffer ничего
не получает, в режиме отладки, когда отладчик доходит до бесконечного цикла.

Помогите пожалуйста разобраться как решить данную проблему.

Полный код программы:

Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не получается передать по UART на плате STM32 Nucle-L053R8
СообщениеДобавлено: 19 ноя 2015, 01:05 
Заглядывает иногда

Зарегистрирован: 15 окт 2015, 21:27
Сообщения: 136
foxis писал(а):
Здравствуйте, с целью обучению хотел запрограммировать самый простой режим UART
в частности асинхронный по прерыванию. В качестве отладочной платы использую
плату Nucleo-L053R8 (STM32). Информация передается с UART1 в UART2 на одной
и той же плате. TX,RX соединяю крестом.

Пользуйте для начала юарт подключенный к компу, а потом уже с юарта в юарт гоняйте на одном камне


Последний раз редактировалось I_Red 19 ноя 2015, 01:13, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не получается передать по UART на плате STM32 Nucle-L053R8
СообщениеДобавлено: 19 ноя 2015, 01:11 
Заглядывает иногда

Зарегистрирован: 15 окт 2015, 21:27
Сообщения: 136
I_Red писал(а):
foxis писал(а):
Здравствуйте, с целью обучению хотел запрограммировать самый простой режим UART
в частности асинхронный по прерыванию. В качестве отладочной платы использую
плату Nucleo-L053R8 (STM32). Информация передается с UART1 в UART2 на одной
и той же плате. TX,RX соединяю крестом.

Пользуйте для начала юарт подключенный к компу, а потом уже с юарта в юарт гоняйте на одном камне

Хотя все намного хуже... где Ваши процедуры прерываний? Их почему-то в коде не нашел...
Чет типа такого:
Код:
void USART1_IRQHandler(void)
{
   if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET)
   {
      RxBite = USART1->RDR & 0xFF;
       while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
       USART_SendData(USART1, RxBite);
   }
   USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не получается передать по UART на плате STM32 Nucle-L053R8
СообщениеДобавлено: 19 ноя 2015, 13:16 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 июн 2013, 22:55
Сообщения: 53
I_Red
1)насчет реализации UART с ПК не думаю, что это проще потому как
для этого нужен преобразователь уровня, спец. програмка для принятия данных,
а тут два проводка подпаял и схема готова.

2) Выкладываю, реализованные Cube обработчик прерываний (файл stm32l0xx_it.c)

Show


3) Сама функция обработки прерываний HAL_UART_IRQHandler
(в файле stm32l0xx_hal_uart.c):

Show


4) Инициализации пинов UART (файл stm32l0xx_hal_msp.c ):

Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не получается передать по UART на плате STM32 Nucle-L053R8
СообщениеДобавлено: 22 ноя 2015, 18:20 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1931
Откуда: Харьков
foxis писал(а):
I_Red
1)насчет реализации UART с ПК не думаю, что это проще потому как
для этого нужен преобразователь уровня, спец. програмка для принятия данных,
а тут два проводка подпаял и схема готова.
[/spoiler]

Для начала было бы не плохо изучить особенности платы с которой работаете.
Дока:
http://www.st.com/web/en/resource/techn ... 105823.pdf
5.7 USART communication
Цитата:
By default the USART2
communication between the target MCU and ST-LINK MCU is enabled in order to support
Virtual Com Port for mbed (SB13 and SB14 ON, SB62 and SB63 OFF).

Спец. программка:
http://www.compuphase.com/software_termite.htm#_
Все заводится в два клика без шаманских танцев с паяльником и проводками.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не получается передать по UART на плате STM32 Nucle-L053R8
СообщениеДобавлено: 23 ноя 2015, 18:08 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 июн 2013, 22:55
Сообщения: 53
alexsam,
спасибо большое, программку установил, действительно все работает.

Но проблема осталась, послать данные я могу, а вот с приемом (на RX USART2) проблема
так и не решилась.

Код программы:

Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не получается передать по UART на плате STM32 Nucle-L053R8
СообщениеДобавлено: 23 ноя 2015, 21:39 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1931
Откуда: Харьков
Так а где у вас обработчик прерывания?
вы хотите принять 2 байта
HAL_UART_Receive_IT(&huart2, receiveBuffer, 2);
Вот напишите обработчик и в нем проверяйте буфер.
Отсылать нужно по 2 байта для тестов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не получается передать по UART на плате STM32 Nucle-L053R8
СообщениеДобавлено: 24 ноя 2015, 13:36 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 июн 2013, 22:55
Сообщения: 53
alexsam,

обработчик прерываний у меня уже сформирован с помощью Cube,
который использует Hal библиотеки.

(эти файлы я уже указывал выше)
обработчик прерываний (файл stm32l0xx_it.c)

Show


Сама функция обработки прерываний HAL_UART_IRQHandler
(в файле stm32l0xx_hal_uart.c):

Show



Возможно конечно проблема во встроенных функциях, возможно там ошибка
где-то закралась.
Вы предлагает самому реализовать обработчик прерываний ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не получается передать по UART на плате STM32 Nucle-L053R8
СообщениеДобавлено: 24 ноя 2015, 16:54 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1931
Откуда: Харьков
Я main.c не увидел объявления колбэка для приема данных:
Код:
/* USER CODE BEGIN 4 */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
  HAL_UART_Transmit(huart, receiveBuffer, 2, 10);
  HAL_UART_Receive_IT(&huart2, receiveBuffer, 2);
}
/* USER CODE END 4 */

В данном случае у вас будет обычное эхо:
Код:
HAL_UART_Transmit(huart, receiveBuffer, 2, 10);

отправляет то, что пришло,
Код:
HAL_UART_Receive_IT(&huart2, receiveBuffer, 2);

Начинает прием заново.
У меня стоит прием на 2 байта. После приема двух байт у вас будет вызываться прерывание и ваш колбэк.
При отправке данных в терминале в настройках укажите чтоб ничего не лепил к строке в конце.
Синие буквы - то что я отправил, зелены - ответ от МК


Вложения:
2015-11-24_1354.png
2015-11-24_1354.png [ 65.48 Кб | Просмотров: 7672 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не получается передать по UART на плате STM32 Nucle-L053R8
СообщениеДобавлено: 24 ноя 2015, 18:39 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 июн 2013, 22:55
Сообщения: 53
alexsam,
у меня такой функции в майне нет, пробовал ее прописать и вызвать
результат тот же, данные не хочет принимать.

Как я понял проблема в самом обработчике прерываний HAL_UART_IRQHandler.
Когда появляются данные, то происходит прерывание и в обработчике
компилятор по идее должен зайти вот в эту ветку
Код:
/* UART in mode Receiver ---------------------------------------------------*/
 
  if((__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESET))
  {
    UART_Receive_IT(huart);
  }


, для дальнейшей обработки, однако он почему-то проходит мимо нее, в результате
никакой обработки не происходит.

Не очень понятно как работают функции __HAL_UART_GET_IT и __HAL_UART_GET_IT_SOURCE.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не получается передать по UART на плате STM32 Nucle-L053R8
СообщениеДобавлено: 24 ноя 2015, 22:55 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1931
Откуда: Харьков
Так вам её не нужно вызывать, вы её объявили и в ней уже пишите то, что вам нужно делать когда вам придет нужно кол-во байт.
А UART_Receive_IT(huart); может не вызываться, если у вас пришло кол-во байт не совпадающее с тем, что вы отправляете.
Например вы ждете 5 байт, а пришло всего 3, вы не попадете в обработчик. Поэтому в проге для отправки нужно установить чтоб она ничего не дописывала к строке, которая отправляется.
Вот то, что сгенерил куб и мои вставки для ЭХА:

Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не получается передать по UART на плате STM32 Nucle-L053R8
СообщениеДобавлено: 25 ноя 2015, 17:29 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 июн 2013, 22:55
Сообщения: 53
Спасибо большое, alexsam,

за подсказки, сегодня ситуация немного прояснилась. Я конечно без эхо пока делал, просто
тупо получал данные с СОМ4 порта.
Оказалось, что он почему-то может принимать только один байт, т.е.
если отправляет посылку например "f", то все норм, принимает,
переменная receiveBuffer заполняется и равна "f".

Но если передавать 2 байта, например, "ff", то компилятор
почему-то сам в середине обработчика выходит в режим отладки (хотя я не ставил
в этом месте точку останова), приходиться нажимать "Go" еще раз.
В результате в переменной receiveBuffer - пусто.

Хотя я поменял длину массива, и количество принимаемых байтов.

Полный код программы:

Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не получается передать по UART на плате STM32 Nucle-L053R8
СообщениеДобавлено: 25 ноя 2015, 19:07 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1931
Откуда: Харьков
Ох.. вы сначала пытаетесь принять 4 байта:
HAL_UART_Receive_IT(&huart2, receiveBuffer, 4);
Затем, уже в прерывании скопипастили мой код и пытаетесь отправить обратно 2 байта и прочитать тоже 2.

1) Поставьте везде одинаковое кол-во байт на прием и посылку.
2) Сразу после загрузки прошивки сделайте ребут кнопкой на борде (если у вас не ребутится автоматически). Это исключит всякие "помехи". Keil или что у вас там вообще можно закрыть если у вас "помехи" от него.
3) Убедитесь что терминал настроен на отправку символов без добавления чего либо в конце. Оправьте из терминала столько символов (байт), на сколько вы настроили прием.
4) будет счастье :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не получается передать по UART на плате STM32 Nucle-L053R8
СообщениеДобавлено: 26 ноя 2015, 13:26 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 июн 2013, 22:55
Сообщения: 53
Ура, все получилось ! :) Спасибо вам большое за помощь, alexsam. :)

В очередной раз убеждаюсь в коварстве режима отладки.
До этого я как делал, ставлю точку останова в строке
Код:
HAL_UART_RxCpltCallback(&huart2);

после компиляции программы до хожу до данной точки
и далее в Termite отправляю посылку (например "gg"),
дальше в иаре нажимаю "go", компилятор сам где-то в середине обработчика
останавливается и еще раз приходиться нажимать "go", компилятор доходит до
"while(1)" и никакого эха в Termite мы не получаем,
т.е. обратного отклика нет.

А вот если сразу же после компиляции нажать "go",
отключив все точки останова (т.е. вообще не использовать отладку),
то эхо сразу же появляется и программа работает как положено.

Полный код программы:
Show


2) А связь между USART1 и USART2 у меня не было из-за того,
что перемычки SB62 и SB63 разомкнуты, а это значит, что
в данном случае USART2 может связываться только с ПК по
COM порту.
Если эти перемычки замкнуть, то связь между USART2 и ПК оборвется, и сигналы
RX, TX пойдут на ножки PA2, PA3 как раз в этом случае уже можно реализовывать
связь между USART2, USART1 соединением ножек РА2-РА10, РА3-РА9,
как я хотел первоначально.

Теперь все проблемы можно считать решенными. Всем спасибо,
особенная балагодарность, alexsam, за помощь в освоении USART.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB