Не работает порт stm32

STM Урок 33. HAL. USB. Virtual Com Port

Урок 33

HAL. USB. Virtual Com Port

Отладочную плату ипользуем ту же: STM32F4-DISCOVERY.

Проект создаём из проекта I2CLCD80. Назовем его USB_OTG_CDC. Запустим проект в Cube, включим USB_OTG_FS в режим Device_Only

В USB_DEVICE в разделе Class For FS IP выберем пункт Communication Device Class (Virtual Port Com).

Лапки портов PD4-PD7, PB8, PB9 отключим, это пережиток прошлых занятий

В Clock Configuration выберем следующие делители (нажмите на картинку для увеличения изображения)

В Configuration ничего не трогаем, т.к. прерывания там выставились сами.

Сгенерируем и запустим проект, подключим lcd.c и настроим программатор на автоперезагрузку.

Соберем проект. Прошьём контроллер. У нас появится неизвестное устройство, скачаем драйвер на наше виртуальное устройство usb. Для этого зайдем на сайт st.com, в строке поиска там вводим virtual com port, скачиваем и устанавливаем драйвер. Затем желательно зайти в папку с установленным драйвером, выбрать папку, соответствующую разрядности нашей операционной системы, и запускаем также установку и оттуда.

У нас скорей всего устройство установится с ошибкой (код 10)

Есть несколько типов решений, мне понравился именно этот, т.к. более простой: в файле usbd_cdc.h заменим размер пакета, вместо 512 напишем 256 в данной строке:

#define CDC_DATA_HS_MAX_PACKET_SIZE 256 /* Endpoint IN & OUT Packet size */

Соберём, прошьём и увидим, что ошибка исчезла.

Начнём писать код.

Сначала попытаемся передать данные на ПК.

Для этого мы сначала откроем файл usbd_cdc_if.c и исправим там в 2х строчках 4 на 64

/* It’s up to user to redefine and/or remove those define */

#define APP_RX_DATA_SIZE 64

#define APP_TX_DATA_SIZE 64

В файле main.c закомментируем весь пользовательский код кроме инициализации и очистки дисплея

/* USER CODE BEGIN 2 */

/* USER CODE END 2 */

Также в main.c подключим файл usbd_cdc_if.h для видимости функций приема и передачи

/* USER CODE BEGIN Includes */

Немного изменим в главной функции строковую переменную, убавив в ней размер и добавив префикс tx

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

В файле usbd_cdc_if.c добавим прототип функции передачи, скопировав объявление из реализации данной функции в том же файле

/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);

/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */

В main() внесём данные в строку

/* USER CODE END 2 */

В бесконечном цикле попробуем эти данные отправить в порт USB, используя функцию, прототип которой мы добавили

CDC_Transmit_FS((unsigned char*)str_tx, strlen(str_tx));

/* USER CODE END WHILE */

Соберём код, прошьём контроллер и посмотрим результат в терминальной программе.

Вроде передать нам что-то удалось. Теперь попробуем что-нибудь принять. Здесь чуть посложнее, т.к. для этого используется уже обработчик прерывания, коим является в файле usbd_cdc_if.c функция CDC_Receive_FS.

Читайте также:  Как начать худеть настрой

Добавим ещё одну строковую глобальную переменную в main()

/* USER CODE BEGIN PV */

/* USER CODE END PV */

Объявим её также и в файле usbd_cdc_if.c

/* USER CODE BEGIN PRIVATE_VARIABLES */

extern char str_rx[21];

/* USER CODE END PRIVATE_VARIABLES */

В функцию CDC_Receive_FS в этом же файле добавим некоторый код и кое-что закомментируем

static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)

/* USER CODE BEGIN 6 */

Добавим переменную в main()

/* USER CODE BEGIN 1 */

Занесенные в наш буфер данные попробуем вывести на дисплей, для этого в бесконечном цикле в функции main() добавим определённый код

CDC_Transmit_FS((unsigned char*)str_tx, strlen(str_tx));

Соберём проект. Прошьём код и посмотрим результат, вводя в терминальной программе и отправляя в порт USB какие-нибудь строки.

22 комментария на “ STM Урок 33. HAL. USB. Virtual Com Port ”

«Есть несколько типов решений, мне понравился именно этот, т.к. более простой: в файле usbd_cdc.h заменим размер пакета, вместо 512 напишем 256 в данной строке….»

Просто измените размер кучи (Minimum Heap Size) в настройка CubeMX. Вместо значения 0x200 задайте 0x400.

И комп увидит устройство без ошибок.

При инициализации структур компилятору элементарно не хватает места, заданного по умолчанию, для выделения памяти.

Пардон, очепятка вышла. Не компилятору, а функции malloc.

Спасибо, так действительно проще.

Спасибо огромное за ваши материалы по STM32 , подключил TFT 320×240 – все отлично работает . Вернулся к материалу для подключения флешки . Все отладочные средства у меня находятся на VirtualBox ( W7 ) . Скачал по вашей инструкции и поставил драйвер Virtual com port . Он поставился , но в диспетчере задач ничего не появилось ни в разделе com портов , ни в других . Может вы сталкивались с подобной проблемой ? Если нет – в любом случае еще раз спасибо за проделанную работу .

Сначала не смог реализовать данный пример на SystemWorkbench в части приёма данных и передачи их из функции приёма в main посредством массива str_rx с модификатором extern – компилятор ругается на использование неопределённых переменных, а если задать ему какие-нибудь значения, то только эти заданные значения и будут передаваться. Вышел из положения объявив массив обмена str_rx в заголовочном файле usbd_cdc_if.h

Спасибо.Я сделал так.В хидер usbd_cdc_if.h добавил две строчки
extern uint8_t UserRxBufferFS[1000];
uint8_t receiveBufLen;
В метод CDC_Receive_FS добавил перед return receiveBufLen = *Len;
И в main ловил данные просто одним условием
if(receiveBufLen > 0)// если получены данные от ПК
<
HAL_Delay(250);
CDC_Transmit_FS((uint8_t*) UserRxBufferFS,receiveBufLen);
// эхо для наглядности
receiveBufLen = 0;// сброс получения
>
Всё просто,а UserRxBufferFS чистить не нужно от мусора,он сам чистится.

может в usbd_cdc_if.c ?

Здравствуйте! Спасибо огромное за ваши уроки, тут пожалуй лучший ресурс с уроками по стм32!
Хочу спросить, а как использовать CDC_Receive_FS в main.c? Я проделал в usbd_cdc_if.c «эхо», но мне нужно принимать из него и гнать дальше. Наверное вопрос больше в целом по си чем по контроллеру, а то иначе мне получается надо много всего переносить в usbd_cdc_if.c.

Читайте также:  Как настроить экран почты

Думаю, что следует добавить в main.c функцию, а в файле usbd_cdc_if.c – на неё прототип и вызвать её в CDC_Receive_FS, И весь свой пользовательский код затем писать в файле main.c.
Это именно СИ. Так что обязательно подтяните свои знания по языку.

Ох, видимо сперва надо читать коментарии, прочитал тот что выше.

При переходе на USB cтолкнулся с такой проблемой. Скажем, конструкция, приведённая в примере, а именно
sprintf(str_tx,»USB Transmit\r\n»);
CDC_Transmit_FS((unsigned char*)str_tx, strlen(str_tx));
работает без проблем. Но, если я делаю так
sprintf(str_tx,»USB Transmit»);
CDC_Transmit_FS((unsigned char*)str_tx, strlen(str_tx));
CDC_Transmit_FS((unsigned char*)»\r\n», 2);
то CDC_Transmit_FS((unsigned char*)»\r\n», 2); не срабатывает (не успевает) и данные летят без переноса строки. Если ставить задержку, то работает как надо. По неопытности, может, это я и принял бы как должное, если бы перед этим не работал бы с UART где такая же конструкция работает без проблем. Для работы с UART уже написана довольно хорошая часть программы и менять её структуру очень не хочется, тем более, что данные передаются не в текстовом формате а в посылке имеется несколько меток. Что можно сделать, чтобы посылки могли идти подряд без задержки?

Скорей всего придется делать конкатенацию передаваемых строк с помощью strcat. Была аналогичная проблема при использовании CDC. Автор применял этот метод в одном из уроков.

Здравствуйте
А если я хочу передавать данные с микроконтроллера на компьютер?

Константин:
А мы их туда и передали.

Установил различные драйвера VCP от STM, но при этом плата не определяется при подключении её к компьютеру. только виден STLink Virtual COM Port. Кто уже сталкивался с такой проблемой.

Оказалась, что проблема с дровами. Надо их полностью сносить и устанавливать заново.

Hello, I’m new to STM32. How do I send int32_t value via usb CDC from ADC input ? or How to convert int32_t to char?

You can use(for example):

sprintf(str_tx,»ADC:%d \r\n»,ADC_Data);
CDC_Transmit_FS((unsigned char*)str_tx, strlen(str_tx));

where ADC_Data is your ADC value.

Спасибо за примеры. С USB в базовой библиотеке что-то не так. При первом подключении ком порт работает, но при передергивании USB – становится неизвестным устройством, иногда не сразу а через 5-10 секунд после повторного подключения…
Сейчас копаю в сторону функций вызываемых на отключение и подключение USB. Первое что кажется подозрительным, то что на подключение вызывается инициализация а на отключение USBD_LL_Suspend, затем на подключение снова инициализация, хотя есть USBD_LL_Resume. Пока дальнейших идей нет. Может что-то подскажете?

Читайте также:  Часы касио женские как настроить время

могу скачать драйвера для виртуального ком порта. У меня STM32F415RG, может есть у кого?

Источник

Не работает порт stm32

int main() <
SystemInit();

RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
GPIOB->CRL |= GPIO_CRL_MODE3;

Реклама
Reflector
Говорящий с текстолитом

Карма: 21
Рейтинг сообщений: 224
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 1602
Рейтинг сообщения: 0

Реклама

JLCPCB, всего $2 за прототип печатной платы! Цвет — любой!

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/cwc

Alex-Elektron
Встал на лапы

Зарегистрирован: Сб янв 11, 2014 21:25:55
Сообщений: 113
Рейтинг сообщения: 0

Глянул, на PB3 болтается ЖЖитаг, как и на PB4. Но при этом на PB4 кнопка работает. Ремап не помог, или я что-то не так делаю.

Вложения:
2018-03-21_15-09-33.png [46.73 KiB]
Скачиваний: 671
Вернуться наверх
Реклама

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Мурик
Друг Кота

Карма: 3
Рейтинг сообщений: 140
Зарегистрирован: Пн окт 11, 2010 19:00:08
Сообщений: 3179
Рейтинг сообщения: 0

Реклама

Компэл 28 октября приглашает всех желающих принять участие в вебинаре, где будет рассмотрена новая и перспективная продукция компании Traco. Мы подробно рассмотрим сильные стороны и преимущества продукции Traco, а также коснемся практических вопросов, связанных с измерением уровня шумов, промывкой изделий после пайки и отдельно разберем, как отличить поддельный ИП Traco от оригинала.

Reflector
Говорящий с текстолитом

Карма: 21
Рейтинг сообщений: 224
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 1602
Рейтинг сообщения: 0

JTDO на PB3 — это выход, а JNTRST на PB4 — вход, потому не удивительно, что кнопка работает.

Реклама
Реклама

Замена традиционных реле и предохранителей в автомобильных системах распределения питания и управления нагрузками, а также в промышленных системах электропитания постоянного тока на интеллектуальные силовые ключи – массово идущий процесс. Ведущую роль в нем играют силовые ключи PROFET производства Infineon. Специалисты компании отвечают на основные вопросы, возникающие при этом у разработчиков.

Alex-Elektron
Встал на лапы

Зарегистрирован: Сб янв 11, 2014 21:25:55
Сообщений: 113
Рейтинг сообщения: 0

int main() <
SystemInit();

RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;

AFIO->MAPR |=AFIO_MAPR_SWJ_CFG_JTAGDISABLE;
GPIOB->CRL |= GPIO_CRL_MODE3;

while(1) <
for(uint32_t i=0; i ODR ^= GPIO_ODR_ODR3;
>
>

но пока максимум, что я вижу, это меандр амплитудой 200 мВ и частотой 417Гц

Реклама

Reflector
Говорящий с текстолитом

Карма: 21
Рейтинг сообщений: 224
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 1602
Рейтинг сообщения: 0

Реклама

Alex-Elektron
Встал на лапы

Зарегистрирован: Сб янв 11, 2014 21:25:55
Сообщений: 113
Рейтинг сообщения: 0

Добавлено after 3 minutes 3 seconds:
Баллииин, CNF3 не вырубил. Всё, решена задачка, спасибо большое!

Реклама

Страница 1 из 1 [ Сообщений: 8 ]

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

Кто сейчас на форуме

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

Источник

Оцените статью