Записки дилетанта

Содержание

Так вийшло що я цікавлюся безліччю речей, але так ні в чому не став професіоналом. Однак впорядкувати думки та поділитися ними з друзями та знайомими іноді хочеться.

четвер, 14 грудня 2017 р.

USB VCP інших плат сімейства STM32 Discovery

"USB Zoo"

Мікроконтролери навіть в межах одного сімейства трішки відрізняються один від одного. Якщо користуватися HAL, портабельність буде високою, але, все ж, не абсолютною. Вирішив повторити описане в попередньому пості, про USB на STM32F3Discovery, для інших плат, обладнаних роз’ємом USB, поміж описаних тут. Їх три (Blue pill поки не розглядав):

  • STM32F4Discovery, із MCU STM32F407VG — ARM Cortex M4F,
  • STM32F072BDiscovery, із MCU STM32F072RBT6 — ARM Cortex M0,
  • 32L0538Discovery, із STM32L053C8T6 — ARM Cortex M0+.

STM32F4Discovery

Виглядає адекватним, тому так і залишив.

По великому рахунку, все. Генеруємо код, копіюємо у директорію проекту наші ringbuf.c, syscall_null.c, syscall_semih.c, syscall_usb.c, syscalls.c, sh_cmd.s, ringbuf.h, runtime_config.h, syscall_impl.h із попереднього проекту. (Про вміст syscalls*.* , як обіцяв, напишу окремо. У них — реалізація системних викликів, більш універсальна, ніж попередня, але поки зовсім сира). В syscall_semih.c — файл із реалізацією обміну семихостингом, слід включити правильний файл заголовків, із відповідною версією CMSIS. Деякі вже додано, якщо вашого там немає, зробіть аналогічно:

В принципі, як виявилося, usbd_cdc_if.h і usbd_cdc_if.c можна було теж скопіювати — вони однакові для обох плат, але я таки акуратно переніс нові рядочки. Вписуємо в main.c тестовий код — той же, що і раніше.

Компілюємо, випробовуємо — все працює. Так ще й після заливки нової прошивки перепід’єднується автоматично — залишається лише на емуляторі термінала наново під’єднатися, (так як віртуальний COM-порт зникає-з’являється, емулятор губить із ним зв’язок, але двічі клікнути мишкою простіше, ніж фізично пересмикувати кабель).

В такі моменти починаєш цінити HAL — не зважаючи на його громіздкість і певну недолугість (з точки зору пуританина, звичного думати асемблером — особливо :-).

32F072BDiscovery

Обидві вже розглянуті плати містять MCU, що базується на ARM Cortex M4. STM32F072BDiscovery містить процесор сімейства ARM Cortex M0, помітно примітивніший, слід враховувати це, якщо вам крім USB потрібен ще й семіхостинг. Але, з точки зору використання USB різниці не буде. Ну, майже — про це трішки нижче.

Цей мікроконтролер, як і попередній, підтримує Soft Disconnect, правда, "API" інший. В регістрі USB_BCDR (Battery charging detector) є біт DPPU ( DP pull-up control), коли він рівний 0 — хост вважає пристрій від’єднаними, коли 1 — присутнім. (І ім’я інше, і значення біта інвертоване в порівнянні із STM32F4). Однак, HAL та Middleware про нього потурбуються самостійно.

Тактування ядра взято від HSI, хоча, можна і від HSI48. Детальніше — див. документацію.
Клікабельно!

Хоча, будь таке бажання виникне, MCO програматора доступний:

text data bss dec hex filename
25492 1156 11940 38588 96bc usb_vcp_demo_f072.elf

Це ж, на хвилиночку, майже 12Кб, із яких де ділися 12 — 8 = 4Кб, не зрозуміло.

Зверху видно всілякі буфери, типу UserTxBufferFS — вони найбільші, але далі стає трохи складніше — розміри об’єктів даних перемішано разом із розмірами функцій. На щастя, в ARM-ів пам’ять програм та оперативна пам’ять рознесені в адресному просторі, RAM матиме адресу 2000xxxx, тому, щоб не мудрувати, зробимо:

Видно, що так просто, без серйозного занурення в код USB Middleware та стандартної бібліотеки (див. __global_locale — от на що воно 364 байти витратило?!) зробити щось важко. Звичайно, можна позбутися грубої "потрійної" буферизації, що теж вимагатиме доволі ґрунтовної переробки коду. Але залишається простий, хоч і неелегантний трюк — зменшити розміри всіх буферів. Він порушуватиме стандарт USB, який вимагає 2Кб буферів, але проблеми, на практиці і у таких простих пристроях, малоймовірні, а це дасть нам зекономити 4 або й 6Кб.

Результат став кращим. Правда, зміна розміру дескриптора ні на що видиме не вплинула, але лінь було ще раз скрішот робити. 🙂

Ще пару байт може зекономити LTO (link time optimization, вмикається прапорцем -flto для компілятора і лінкера), але може і не зекономити. Експериментуйте. (Мінус використання LTO — виконувати код в дебаггері стане багато важче). Як би там не було, доводиться бути акуратним із пам’яттю та добре думати, що із стандартної бібліотеки точно потрібно, а без чого краще обійтися.


Источник: indrekis2.blogspot.com