STM32 и USB. Часть 1. Проект для Keil.

Связанные статьи:
STM32 и USB. Часть 2. Немного о драйверах и софте.

Введение

После того как я вдоволь наковырялся с STM32 и USB, решил что было бы неплохо поделитсья опытом с окружающими. Тем более, что все делалось аж под три разные платы и две разные линейки процессоров: High-Density (STM32F103RET6, STM32F103VET6) и Connectivity-Line (STM32F107VCT6).

Платы у меня в руках оказались следующие:

1) STM32 Development Board MINI (512K Flash 64K SRAM) 2.4-inch QVGA TFT module
(ссылка 1) (ссылка 2)
На ней стоит микроконтроллер STM32F103VET6

Плата 1
2) Embest EM-STM32C (EM-STM3210C)
(ссылка)
На ней стоит микроконтроллер STM32F107VCT6 — Connectivity Line

Плата 2

3) Встраиваемый модуль TE-STM32F103 — Махаон, от фирмы Terraelectronica.
(ссылка)
Соответственно, на ней стоит контроллер STM32F103RET6

Плата 3

Запустить проект из примеров, который использует USB, на любой из этих плат, задача не такая уж и сложная.
Куда сложнее встроить эти примеры в свои проекты, так как часто они бывают очень запутанно завязаны на конкретных платах. Еще сложнее собрать проект с нуля, используя библиотеки драйверов от STM — все равно без примеров обойтись сложно.

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

Между первой и третьей платой отличий мало: похожие контроллеры, отличающиеся лишь числом ног, у обоих выведен USART1. А вот второй отличается сильно: это контроллер Connectivity Line, с поддержкой USB On-The-Go, из-за чего работа с USB построена по-другому, а также вместо USART1 выведен USART2, да еще и с ремапом пинов на другие, отличные от дефолтных, ноги.

На всех платах есть светодиоды в разном количестве: 1, 4 и 3 соответственно.
Поэтому было принято решение сделать банальную вещь — устройтво, светодиоды которого управляются с компьютера по USB.

Прежде чем продолжать, рекомендую вкратце ознакомиться с тем, что же из себя представляет USB.
Самая лучшая, на мой взгляд, статья по этому вопросу — «USB in a NutShell». Ее перевод можно найти тут.

Если совсем упрощенно, то каждое USB-устройство имеет некоторое количество оконечных точек — Endpoint-ов, которые бывают следующих типов:
  • Control. Endpoint такого типа, с номером 0, обязательно должен присутствовать в любом USB-устройстве.
  • Interrupt. Название, в принципе, говорит само за себя. Более подробно читайте в статье.
  • Isochronous. Гарантированные передачи через равные промежутки времени. Обычно используется для передачи аудио и видео.
  • Bulk. Самый простой для реализации вариант. Применяется широко. Подробнее в статье. С ним мы и будем работать.


Проект для Keil

В результате некоторых ковыряний и копипасты с примеров, редактирования, кодинга и прочих мучений, получилось следующее:
USB_SampleSomeDevice_src.rar (зеркало 1)

Структура файлов такая же, как и во многих примерах:
\Libraries\ — папка с библиотеками (CMSIS, Standart Peripheral Driver, USB OTG Full speed Device Driver)
\Project\ — папка для проектов. Их может быть много и все они могут использовать одни и те же библиотеки. Но у нас проект один.
\Project\SampleSomeDevice\ — папка с проектом
\Project\SampleSomeDevice\Doc\ — краткие описания
\Project\SampleSomeDevice\driver\ — драйвер устройства для Windows (подробнее о драйверах и софте в ч.2, когда ее напишу)
\Project\SampleSomeDevice\inc\ — заголовки .h
\Project\SampleSomeDevice\src\ — файлы исходников .c
\Project\SampleSomeDevice\RVMDK\ — файлы проекта и выходные файлы

Распаковываем проект и открываем.
Смотрим на вкладку Project, видим там несколько групп:
User — Основные исходники проекта.
User_headers — Заголовочные файлы. Вынес в отдельную группу для быстрого и удобного доступа к ним.
USB-FS-Device_Driver — файлы библиотеки USB.
StdPeriph_Driver — файлы библиотеки стандарной периферии.
RVMDK — startup-файлы для каждой линейки контроллеров. Обратите внимание, что только один, соответствующий вашему контроллеру должен компилиться.
Doc — Краткие описания.

По умолчанию проект сконфигурирован под плату TE-STM32F103.

Конфигурируем проект

под другой контроллер и плату.

1) Надо знать название контроллера и его линейку. Поддерживаются практически все контроллеры 103 серии (кроме XL-density), а также 105 и 107 серия — Connectivity Line.
Даташиты, предварительно скачанные с сайта ST:
STM32F103x4x6.pdf (зеркало 1) — STM32 Low-density performance line (краткое обозначение LD)
STM32F103x8xB.pdf (зеркало 1) — STM32 Medium-density performance line (краткое обозначение MD)
STM32F103xCxDxE.pdf (зеркало 1) — STM32 High-density performance line (краткое обозначение HD)
STM32F105_F107.pdf (зеркало 1) — STM32 Connectivity line (краткое обозначение CL)

Все, что связано с линейкой контроллера, содержит в себе краткое обозначение.
Например, startup-файл для Medium-density performance line будет называться startup_stm32f10x_md.s
Или глобальный define для Connectivity line — STM32F10X_CL

В Keil правым кликом по Target заходим в опции, выбираем вкладку Device и ищем там свой контроллер.

Device Select

Далее, открываем файл Doc\sample_global_defines.txt и, в зависимости от линейки контроллера, платы и необходимости вывода отладочных сообщений, выбираем нужную строку и копируем.
Если ни одна из этих плат не используется, просто копируем любую строку, исправив define линейки процессора и выкинув define, содержащий _BOARD.
Вставляем строку в опции, во вкладку С/С++
Defines

Следующий шаг — выбираем используемый JTAG для прошивки и отладки.
Я использую TE-ARM-LINK, отечественный клон J-LINK.

JTAG 1
JTAG 2

Последний шаг в данном пункте — выбрать нужный startup-файл в группе RVMDK, соответствующий линейке контроллера, включить его в сборку проекта, отключив при этом все остальные:

RVMDKRVMDK

Следующие пункты — настройка платы.
открываем файл platform_config.h, ищем кусок кода:

#else// Дефолтная конфигурация - сделано под TE-STM32F103_BOARD

	#define USB_DISCONNECT                      GPIOB  
	#define USB_DISCONNECT_PIN                  GPIO_Pin_5
	#define USB_DISCONNECT_LOG1		    DISABLE
	#define RCC_APB2Periph_GPIO_DISCONNECT      RCC_APB2Periph_GPIOB

	#define LED1				    0
	#define LED1_GPIO_PORT              	    GPIOA
	#define LED1_GPIO_CLK               	    RCC_APB2Periph_GPIOA  
	#define LED1_GPIO_PIN               	    GPIO_Pin_4

	#define LED2				    1
	#define LED2_GPIO_PORT       	            GPIOA
	#define LED2_GPIO_CLK              	    RCC_APB2Periph_GPIOA  
	#define LED2_GPIO_PIN         		    GPIO_Pin_5

	#define LED3				    2
	#define LED3_GPIO_PORT       	            GPIOA
	#define LED3_GPIO_CLK              	    RCC_APB2Periph_GPIOA  
	#define LED3_GPIO_PIN         		    GPIO_Pin_6

	#define USE_USART1_DEFAULT_PA9_PA10

#endif


2) Узнаем куда выведен USART. Для общего развития полезно также знать, используется ли при этом ремап пинов. При включенном дефайне _DEBUG_ на него выводится различная информация, которая может быть полезна.
Открываем схему платы и смотрим. Предположим, выяснили, что выведен USART2, TX — PB5, RX — PB6.
Смотрим комментарии вначале файла platform_config.h:

// Варианты конфигурации USART

// USE_USART1_DEFAULT_PA9_PA10
// USE_USART1_REMAP_PB6_PB7

// USE_USART2_DEFAULT_PA2_PA3
// USE_USART2_REMAP_PD5_PD6

// USE_USART3_DEFAULT_PB10_PB11
// USE_USART3_REMAP1_PC10_PC11
// USE_USART3_REMAP2_PD8_PD9


Выбираем подходящий и заменяем в последнем дефайне. В данном случае это будет так:

#define USE_USART2_REMAP_PD5_PD6


USART сконфигурирован на скорость 115200, 8 бит, 1 стоп, No Parity.

3) Смотрим сколько на плате светодиодов и куда они подключены. Правим соответствующие дефайны. Число светодиодов должно быть не более 4х, начинаться с
#define LED1			0
и идти по порядку. Также не забываем вместе с правкой порта, поправить и RCC_APB2Periph_GPIOx

4) Проверяем, есть ли на контроллере пин, отвечающий за программный коннект/дисконнект USB и где он расположен. Схема может выглядеть так:
USB Disconnect

Если пина нету, просто удаляем дефайны, отвечающие за него.

Вот, в принципе и все. Осталось залить прошивку в контроллер. Если есть JTAG — это не проблема.
Если оного нету, не все потеряно:

USB_DfuSe.part1.rar (зеркало 1) — Софт для прошивки STM32 Connectivity line по USB. Часть 1
USB_DfuSe.part2.rar (зеркало 1) — Часть 2

COM_FlashLoader.zip (зеркало 1) — Софт для прошивки STM32 (103 серия) по UART

Не забудьте перед прошивкой этим способом перевести девайс в DFU-Mode, корректно выставив джамперы BOOT0 — BOOT1.

О софте и драйверах я напишу в другой раз, однако уже можно скачать программу, которая общается с любым количеством подключенных девайсов с данной прошивкой:
Soft

SomeUsbDev_1.0.0_src.rar (зеркало 1) — Проект для Visual Studio 2010
SomeUsbDev_1.0.0_bin.rar (зеркало 1) — Исполняемые файлы
.NET Framework 4.0

Ковыряемся в проекте


Поскольку каждую строчку кода расписывать долго, да и исходники полны в том числе и моих комментариев, приведу здесь список основных файлов проекта и их назначение.
User:
— main.c — очевидно.
— hw_config.c — конфигурация контроллера (периферия, прерывания, клоки и так далее)
— stm32f10x_it.c — обработчики прерываний
— usb_???.c — конфигурация и работа USB посредством драйвера.
— user_usb.c — пользовательская работа с USB — разбор пакетов с данными и обработка команд.
— led.c — работа со светодиодами. Включение, выключение, непрерывное мигание.

User_headers:
— platform_config.h — конфигурация платы.

Для более удобного поиска я добавил в код комментарии следующего вида:
#define BTABLE_ADDRESS      (0x00)

// $USBCONFIG - при изменении числа ендпойнтов, нужно подправить эту таблицу
// и задать верные адреса для буферов с учетом максимального размера пакета.

/* EP0  */
/* rx/tx buffer base address */
//#define ENDP0_RXADDR        (0x18)
#define ENDP0_RXADDR        (0x40)
#define ENDP0_TXADDR        (0x80)

Слово, начинающееся с $ — ключевое для поиска. При помощи поиска по всем файлам можно найти важные куски кода, которые надо проверить, при внесении в проект изменений.
$BOARDSPECIFIC — код, который зависит от того, какая плата выбрана
$USBCONFIG — код, который нужно проверить поправить для изменения конфигурации USB-устройства.

Проект собран так, что USB-устройство, помимо нулевой контрольной, содержит 4 оконечных точки типа bulk, попарно на прием и передачу.
В проекте используются первые две, по которым при помощи несложного протокола передаются команды управления светодиодами на плате.
Краткое описание протокола можно найти в Doc\protocol.txt

И что дальше?


Ну а дальше — куда приведет фантазия. Ковырять USB рекомендую начинать с файла дескрипторов usb_desc.c, потом поиграться с ендпоинтами.
Если есть желание — можно попробовать реализовать один из стандартных классов USB-устройств, или не париться и сделать свой протокол под свои задачи.

На этом пока все. Если эта статья покажется кому-то интересной и полезной, во второй части немного напишу о драйверах и софте.

Файлы, используемые в статье собраны тут

P.S.: Хоть это и первый блин, конструктивная критика, естественно, принимается.

  • +4
  • 09 сентября 2011, 20:19
  • Ezhik
  • 3

Комментарии (52)

RSS свернуть / развернуть
Перенес в блог STM32. Вам в него тоже следует вступить и следующие статьи по STM32 постить туда.
0
> \\Project\\SampleSomeDevice\\
В превьюшке даблбэкслеш показывается как одиночный, но в статье таки как двойной. Поправь на одинарный, тогда в статье нормально будет.
Поддерживаются практически все контроллеры 103 серии (кроме XL-density)
А XL а что так? Это, как я понимаю, наиболее богатые памятью камни?
Если есть желание — можно попробовать реализовать один из стандартных классов USB-устройств, или не париться и сделать свой протокол под свои задачи.
Учитывая, что под свой протокол нужны и свои дрова, разработка которых под винду не самая простая задача, то «не париться» — это как раз таки реализовать стандартный класс :) Алсо, для руления светодиодиками вроде обычно HID юзают.
0
  • avatar
  • Vga
  • 10 сентября 2011, 05:30
В превьюшке даблбэкслеш показывается как одиночный, но в статье таки как двойной.
Поправил, спасибо.

А XL а что так? Это, как я понимаю, наиболее богатые памятью камни?
В моем CMSIS нету startup-файла под них. Хотя, в принципе, если его туда прикрутить, то, возможно, будет работать. Надо проверять.

Учитывая, что под свой протокол нужны и свои дрова, разработка которых под винду не самая простая задача, то «не париться» — это как раз таки реализовать стандартный класс :) Алсо, для руления светодиодиками вроде обычно HID юзают.
Это если писать драйвер с нуля, используя WDK/DDK, то да, задача сложная. А если заюзать одну из многочисленных библиотек, то вся работа с USB сведется к чтению и записи в ендпойнты. Когда руки дойдут — напишу об этом в следующей статье.
Про HID и светодиоды знаю, но цель была — создать проект-«рыбу», который можно было бы легко расширить под какие-то конкретные, возможно, более сложные задачи :)
0
Мне лично схема подключения 1.5к резюка к линии d+ не нравится совсем. Зачем так сложно? Можно ж было один pnp транзистор и два резистора воткнуть
0
В первой плате так и сделано.
А эта — схема TE-STM32F103, так что вопрос к Терраэлектронике :)
0
Во второй ссылке на даташит (STM32F103x8xB.pdf) случайно оказалась пара тэгов, из-за которых ссылка не работает.
0
Поправил, спасибо.
0
Отлично. Спасибо за статью. Как раз дошёл до ЮСБ на СТМ32, да как-то заковырялся.
0
О, спасибо за статью, тема очень интересна.
0
  • avatar
  • _YS_
  • 11 сентября 2011, 17:41
Пока возился со своим проектом, выяснил что уже вышли новые версии библиотек стандартной периферии и USB. Постараюсь в ближайшее время пофиксить проект под них, плюс расписать как сделать свой проект с нуля и подключить эти библиотеки, чтобы они работали :)
0
  • avatar
  • Ezhik
  • 12 сентября 2011, 09:43
Почему XL-density не поддерживается?
0
  • avatar
  • sqzd0
  • 22 сентября 2011, 14:29
Если последнюю версию скачаете отсюда, там уже есть startup-файлы для XL.
0
спасибо
0
В примерах USB_OTG от стм, проект для кейла есть. Так там у многих файлов ключик показывается в значке. И они заблокированы для изменения. Не знаете как устранить данную настройку?!
0
Это просто данные файлы имеют атрибут «Только чтение», снимите его в окне свойств файлов.
0
Вы не файлы самой библиотеки менять собрались, случайно?
0
хотел подредактировать stm_eval под свою плату))
0
Не подскажете, как адаптировать код для младших процессоров (F102C8 в частности)?
Проц в Device выбран, startup_stm32f10x_md.s — указан по аналогии — результата ноль, девайс не появляется.
Pin USBConnect не используется (pullup 1,5к — коммутируется вручную) — исходный девайс на F103RE — нормально стартует.
0
  • avatar
  • ozzyk
  • 19 октября 2011, 19:18
Надо же, STM клепают все новые и новые контроллеры!

Вообще этот контроллер без моей прошивки, то есть с какой-нибудь другой нормально работает? С тем же стартап-файлом?
0
Это то ли у меня глюки, то ли в первой версии либов — сейчас взял вашу версию 1.1 — скомпилил, залил — все ок (причем даже ни чип, ни стартап не менял ради интереса). Поменял на 102С8 и стартап — _MD тож работает.
Спасибо за исходник, хоть что-то рабочее нашлось в чем можно дальше разбираться (примеры из кейла раньше тоже запускались через пень-колоду- то стартанет, то нет, то отваливается, то стринги никакие из девайса не читаются).
0
не совсем ОК оказалось — проц ресетится ~420 ms период светодиодов), импульс ресета на соотв входе виден отлично, но из девайсов не успевает пропасть, и переконекчивается по USB.соответсвенно в отладке через RS232, последний статус USB(он же первый) который успевает пройти — USB_DISCONNECTED. Как-то так…
Отключение светодиодов (//#define USE_LEDS) тож ничего не дает. Пошел искать этот таймер…
0
Да, в первой версии не было поддержки новых камней.
Про юсб не очень понял. То есть, когда делаете ресет, юсб не работает корректно, не сбрасывается?
0
Похоже это просто совпадение с таймингами — ни LED, ни USB тут не при чем — просто проц каждые 420 ms ресетится софтово — и к флагам (Remove reset flag и PIN reset flag -которые выставлены обычно при ресете по кнопке) добавляется флаг Software Reset flag (RCC_CSR_SFTRSTF) — откуда он берется — от вопрос так вопрос… В исходнике ж никаких таких ресетов в помине нет…
Так оно и стартует в цикле бесконечно, но естественно успевает законнектится по ЮСБ, ну и разумеется через постоянный пуллап уже не отваливается.От такие пирожки…
0
Упс… обсчитался битами — флажок RCC_CSR_IWDGRSTF таки выставляется — ну хоть какая то логика появилась, буду искать этот вотчдог…
ЗЫ
вставил в код такую плюшку — if (RCC->CSR&RCC_CSR_RMVF) {printf(" Remove reset flag " ); NextLine();}
if (RCC->CSR&RCC_CSR_PINRSTF) {printf(" PIN reset flag " ); NextLine();}
if (RCC->CSR&RCC_CSR_PORRSTF) {printf(" POR/PDR reset flag " ); NextLine();}
if (RCC->CSR&RCC_CSR_SFTRSTF) {printf(" Software Reset flag " ); NextLine();}
if (RCC->CSR&RCC_CSR_IWDGRSTF) {printf(" Independent Watchdog reset flag" ); NextLine();}
if (RCC->CSR&RCC_CSR_WWDGRSTF) {printf(" Window watchdog reset flag " ); NextLine();}
if (RCC->CSR&RCC_CSR_LPWRRSTF) {printf(" Low-Power reset flag " ); NextLine();}
0
Похоже что этот самый Independent Watchdog в F102 в отличие от F103 по умолчанию активен — необходимо его периодически сбрасывать (IWDG->KR = 0xAAAA;), либо явным образом отключить. В библиотеке IWDG есть функция IWDG_Enable(), но IWDG_Disable() — нет. Простая запись RCC->CSR&=~(1<<29) — ничего не дала.

Уф… Вообщем как-то так…
0
Есть у меня сомнения что это Watchdog. Может просто где-то переполняется стек и камень уползает в ресет?
Попробуйте поиграться с размером стека и хипа, может поможет.

Ну и попробуйте помигать светодиодами вообще отключив USB.
0
Точно IWDG — включение IWDG->KR = 0xAAAA; в цикл while(1) однозначно помогает, ресетов больше нет — девайс и коннектится отлично, и работает (сделал из него HID (joystick)) -«сыплет» input-пакетами как и положено.
Ещё — не знаю насколько для F102 необходимы эти строки, но включил их в код в начале инициализации по образцу и подобию примера из офсайта Кейла:
if (RCC->CSR & (1<<29)) { // IWDG Reset Flag set
RCC->CSR |= (1<<24); // Clear Reset Flags
А пущай будут, для порядку...:)
Может кому то эти «грабли» F102-х пригодятся.

ЗЫ: почему то новая версия либов компилится значительно больше по размеру ( почти 5к в плюсе), в этом плане старая была поинтересней — наверно на ней и останусь.

Ещё раз спасибо за исходники, старт с STM32 может и не получился «быстрым», но уж небесполезным точно.
0
Пытаюсь поменять в файле usb_desc.c содержимое Some_Dev_StringVendor хоть одну буковку — все равно в Эвересте вижу «OAO Vendor»… может не там меняю?
МК stmf103C6. Кстати, программулька для Винды из этой статьи видеть устройство не хочет. jungo драйвер делает и, видимо, устанавливает, но никаких эндпойнов дальше не видать…
0
доходчиво и полезно!
но одного не возьму в толк зачем ещё ларку УСБишную через транс кудато подтягивать? например в AT90USB162 ненадо ничего делать просто Д+ Д- и всё работает.
я то слышал о выборе скорости путём подтяжки одной из лапок… но вродебы это всё в нутри или как?
0
чтобы программно коннектить-дисконнектить без передергивания кабеля.
0
тоесть стартануть CDC я смогу без всего этого?
0
внимательнее ;)
4) Проверяем, есть ли на контроллере пин, отвечающий за программный коннект/дисконнект USB и где он расположен. Схема может выглядеть так:

Если пина нету, просто удаляем дефайны, отвечающие за него.

т.е. да.
0
Ну, отсутствие необходимости в управлении подтяжкой не означает отсутствия необходимости в самой подтяжке. Может, при отсутствии управляющего пина надо все же резистор припаять напрямую, без транзистора?
А то я тут повторил плату ДиХальта, из easyelectronics.ru/arm-uchebnyj-kurs-podklyuchenie-kontrollera-i-demoplata.html — так USB никак не запускается, комп на втыкание устройства никак не реагирует.
А вот когда я пробовал просто светодиодом мигать из своего проекта, и по невнимательности повесил диод на USB-линию (они ж вместе со всеми на гребенку выведены) — так комп заорал, что найдено неопознанное устройство…
0
Во, припаял резистор — втыкание стало определяться.
Только энумерация не проходит. Вот что USBView говорит:

Device Descriptor:
bcdUSB: 0x0000
bDeviceClass: 0x00
bDeviceSubClass: 0x00
bDeviceProtocol: 0x00
bMaxPacketSize0: 0x00 (0)
idVendor: 0x0000
idProduct: 0x0000
bcdDevice: 0x0000
iManufacturer: 0x00
iProduct: 0x00
iSerialNumber: 0x00
bNumConfigurations: 0x00

ConnectionStatus: DeviceFailedEnumeration
Current Config Value: 0x00
Device Bus Speed: Low
Device Address: 0x00
Open Pipes: 0
0
Разобрался. Воткнул терминалку в УАРТ, а там мусор. Поглядел осциллом на длительность бита на УАРТе — а там все 166 кбод вместо 115. А ведь в плате ДиХальта частота кварца — 12 МГц, вместо стандартных 8 — как раз то соотношение. Прописал в терминалке скорость в эти самые 166 кило — стали проскакивать осмысленные куски, правда, замусоренные.

А я ведь в свойствах проекта поправлял Xtal на 12 МГц — видимо, не учитывается.

Перепаял кварц на 8 — устройство благополучно опозналось как «Sample some device», как и положено. Восстановил в терминалке 115200 — лезет бред, в котором очень редко попадаются смысловые куски.
Примеры:
\0>\0Starting system\r\n\0½ª9=õªEõEõEõECTEü

\0UMUMUýB Changåþ\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0üüüüü\0\0€€€€ð
0
Да, все отлично работает пока не нужно програмно переключаться между типами устройств. Вот та конструкция на паре транзисторов, как раз, и занимается эмуляцией аппаратного дисконнекта. Хотя, на самом деле, эта конструкция может быть значительно проще, достаточно ногу контроллера через резистор 1.5К завести на D+. Только логика работы инвертируется (та пара транзисторов работает как инвертор). Но если контроллер из Connectivity Line (F107) или F2xx/F4xx, то там даже этого не нужно, соответствующая схема есть в пузе контроллера и управляется специально обученным битом в одном из регистров USB (лень в доку лезть за точными подробностями).
0
Кто нибудь делал IAD или composite device на F103?
0
  • avatar
  • x893
  • 08 ноября 2012, 20:15
Пример dual CDC (composite) на STM32F103
akb77.com/g/stm32/stm32f103-cdc/
0
Используя пример в статье, Кто нибудь пробовал передать на хост к примеру 90 байт? (режим передачи BULK)
0
Я пробовал. Не получилось.
Скорее всего надо реализовывать вывод по частям, блоками по 64 байт.
0
Подскажите, как прикрутить данный пример к контроллеру STM32F407, StdPerif_lib CMSIS поменять это понятно, а как быть с библиотеками USB?
0
Всем доброго времени суток.

Подскажите, пожалуйста, как быть с такой платой
www.ebay.com/itm/321358378367?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1439.l2649?
Перепробовала все примеры из библиотеки STM32_USB-FS-Device_Lib_V4.0.0, результат — новое устройство не появляется ((.
Прикладываю фотографию настроенного проекта из этой шикарной статьи.
i56.fastpic.ru/big/2014/0502/1e/c3861bcdefab436dee8096c2f500251e.jpg

Перед этим я пробовала на этой плате писать программы без использования USB: cloud.mail.ru/public/788318a48fde/20140428_141304.mp4
Перепробовала все порты на обеих своих платах и выяснилось, что не получатся управлять портами: PA13, PA14, PB3 и PB4.
Может они задействованы в USB?

Помогите, пожалуйста, так же найти даташит на плату.
Буду очень благодарна за помощь!
0
PA13, PA14, PB3 задействованы под SWD, ищите лучше даташит на контроллер
0
А хотя бы ругается на то что устройство не опознано?
0
Судя по картинке там вообще может быть не разведен USB. Возможно только как питание используется, хотя это странно.
0
Даташит на плату надо спрашивать у продавца.
0
Ребята, спасибо Вам за ответы!

я растроена. на плате USB действительно не разведен. висит в воздухе(
0
Набросьте пару перемычек. Я думаю это реально.
0
USB достаточно капризен к прокладке линий данных. Просто два проводка могут и не заработать. Нужно проложить витую пару с проводниками равной длины.
0
При длине 5-8 см ничего не будет. Это ведь не полноскоростной.
0
Во первых, на STM32F1 стоит как раз полноскоростной USB-device (хотя возможно тут он сконфигурирован как LS, не помню). Во вторых, есть отзывы, когда неравные длины линий данных аукались даже на AVR с V-USB, который LS.
Хотя, возможно, работать и будет. Вот HS на 5см неправильной линии уже глючит гарантированно.
0
Да работал и с AVR V USB и с AT91SAM9260 — и проводочки нормально переваривались и несимметричность линии и даже жидкий флюс :)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.