Рейтинг
28.46
голосов: 30

О блоге

Работа с ядром CortexM3 и периферией STM

Администраторы (1)

Модераторы (0)

Модераторов здесь не замечено

Читатели (266)

ploop _YS_ m3hc Krieger Tabke marvin_yorke Ultrin WildCat hexanaft Vga Alatar mzw Reverb grand1987 dievgen woogle PahanMenski anper citizen ZiB

Все читатели блога

USB HID для микроконтроллеров STM32F103 без использования библиотек

Однажды озадачившись подключением микроконтроллера к ПК через USB, я обнаружил, что это непростая задача. По сравнению с USART, SPI и.т.п., программирование USB оказалось на порядок сложнее. Поиск примеров в интернете практически не дал никаких результатов. Имеющиеся примеры, как правило, основаны на использовании больших и сложных библиотек, которые очень трудно применить, а тем более модифицировать под свои нужды. Также эти примеры обычно состоят из множества файлов, так что даже понять структуру проекта, а не то что принцип работы, USB из них не представляется возможным. Есть неплохие статьи по USB, однако ответа на вопрос, как реализовать обмен данными на конкретном контроллере они не дают. В итоге пришлось самостоятельно, путем длительных экспериментов пытаться запустить USB.
Используемый контроллер STM32F103C8T6. Это наверное самый распространенный и дешевый контроллер с модулем USB. Конкретно использовалась вот такая плата:
ru.aliexpress.com/item/STM32F103C8T6-ARM-STM32-DIY-KIT/32839140960.html?spm=a2g0v.search0104.3.14.1a477b81mKd6hC&ws_ab_test=searchweb0_0%2Csearchweb201602_9_10065_10068_319_317_10696_453_10084_454_10083_10618_10307_10301_537_536_10902_10059_10884_10889_10887_321_322_10915_10103_10914_10911_10910%2Csearchweb201603_58%2CppcSwitch_0&algo_pvid=551618bd-fcbf-49a9-9147-692e88feb8ce&algo_expid=551618bd-fcbf-49a9-9147-692e88feb8ce-5
Цена такой платы практически равна цене микросхемы отдельно. Реализуемый класс устройств HID. Преимущества HID известны. Это отсутствие необходимости использования драйверов на ПК и относительная простота реализации. К недостаткам можно отнести низкую скорость передачи данных. В качестве среды программирования использован CooCox. Программа со стороны ПК компилировалась в Borland C++ 5.5.
Программа для CooCox состоит из одного файла и не использует никаких библиотек (кроме RCC, которая нужна лишь ради функции SystemInit(); в начале программы). Также не используются прерывания, поскольку, на мой взгляд, их использование, затрудняло бы понимание кода и отладку. VID и PID взяты от какого-то STM-овского устройства. При их смене, нужно так-же сменить их и в программе на ПК, поскольку поиск устройства происходит по VID и PID.
Работа рассматриваемой пары программ состоит в следующем. Программа со стороны ПК посылает целое число в контроллер. Контроллер делает инкремент полученного числа и отправляет его назад в ПК. Затем этот цикл повторяется снова и снова. В окне программы выводится полученное число. Дополнительно реализовано управление светодиодом на плате (PC13).
Данная программа не претендует на полное соответствие протоколу USB. В ней реализована обработка ограниченного набора запросов (только тех, что реально попадались при отладке). Как показала практика, набор запросов может различаться на разных компьютерах. Кроме того несмотря на то что удалось добиться работоспособности данной программы, многие вопросы касающиеся USB для меня так и остались непонятными. Этот пример, скорее полуфабрикат, требующий дальнейшей доработки.
Файлы проекта:
drive.google.com/drive/folders/1b3E0YwgRlacK2K2Qykc7OxS11ocNuWig?usp=sharing
  • +8
  • 27 марта 2019, 17:29
  • VVK
  • 1

Очередная багофича HAL

Наткнулся на новый косяк библиотеки HAL в функции HAL_I2S_Transmit. Есть у нее параметр uint16_t Size, который удваивается в случае работы с данными 24 или 32 бита

// stm32f4xx_hal_i2s.c line 537
if((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B))
{
  hi2s->TxXferSize  = (Size << 1U);
  hi2s->TxXferCount = (Size << 1U);
}
else
{
  hi2s->TxXferSize  = Size;
  hi2s->TxXferCount = Size;
}


Проблема в том, что переменные TxXferSize и TxXferCount имеют тип uint16_t. И если на вход HAL_I2S_Transmit передать размер 0x8000 и более, то после сдвига влево результат превращается в тыкву.

// stm32f4xx_hal_i2s.h line 110
typedef struct __I2S_HandleTypeDef
{
  SPI_TypeDef                *Instance;    /*!< I2S registers base address        */
  I2S_InitTypeDef            Init;         /*!< I2S communication parameters      */
  uint16_t                   *pTxBuffPtr;  /*!< Pointer to I2S Tx transfer buffer */
  __IO uint16_t              TxXferSize;   /*!< I2S Tx transfer size              */
  __IO uint16_t              TxXferCount;  /*!< I2S Tx transfer Counter           */

Микроконтроллеры STM32F7/STM32H7 семейства Value Line

Вебинар рассчитан на технических специалистов и тех, кто хорошо знаком с семейством STM32, интересуется как работать с кодом во внешней памяти на базе контроллеров с Cortex-M7. Мы покажем как настроить среду разработки, как использовать GCC в составе Atollic TrueStudio, как настроить процессор на максимальную производительность и расскажем о тонкостях работы с модулем защиты памяти.

Содержание
-Использование компилятора GCC в составе AtollicTrueStudio;
-Проверка эффективности компилятора и самого микроконтроллера STM32F7/STM32H7 Value line при различных стратегиях размещения кода:
-Внутренняя память FLASH;
-Внешняя QSPI flash;
-Внешняя SDRAM.



На сайте Компэла вы также найдете вопросы-ответы, которые задавались в процессе вебинара, а также исходный код и дополнительные материалы:
-Программные коды, использованные на вебинаре
-Разработка графических устройств на STM32. Выбираем графическую библиотеку
-Отладочные платы на базе микроконтроллеров STM32
-Новая доступная среда разработки для микроконтроллеров STM32
-STM32F7 & H7 Value line: бюджетные версии микроконтроллеров высокой производительности
-Микроконтроллеры STM32 теперь работают с голосовым сервисом Alexa

CS32F103C8T6, GD32F103 и другие китайские клоны STM32F103C8T6 за ~$0.80

Сегодня наткнулся на такое чудо: https://ru.aliexpress.com/item/CS32F103C8T6-Completely-replace-STM32F103C8T6-STM32F103-LQFP-48-In-Stock-ARM-based-32-bit-MCU-with-Flash/32952782064.html
Известный китайский продавец «улучшенных» микроконтроллеров соблазняет ценой и уверяет что оно полностью совместимо с STM32F103C8T6.
При поверхностном знакомстве с даташитом создается впечатление что вроде бы так оно и есть.

Интересно что же у него внутри?
Я вангую что китайцы «одалживают» неразрезанные кремниевые пластины с фабрики где делают STM32 и сами их корпусируют. Да и продавец у себя на сейте пишет что они electronic technology research company and SMT production plant.
Хотелось бы подтвердить или опровергнуть эту версию. Дайте знать в комментариях если найдете фото кристалла этого CS32F103C8T6.

Кноны встречаются также под именем «GD32F130C8T6» но внутри него свое, китайское ядро:
У GD32F103C8 только 64КБ флэш-памяти, а не 128КБ как у большинства STM32F103C8
Большим преимуществом GD32F103 является то, что он может работать на более высокой тактовой частоте 108 МГц вместо 72 МГц на STM32, кроме того, он может быть разогнан до 120 МГц с сохранением работоспособности USB.
Что интересно — у него zero wait state у флеша что позволяет работать значительно быстрее STM32 даже на частоте 72 МГц. Изначально все думали что у GD32 просто быстрая флеш-память. Однако было обнаружено что GD32 использует SRAM для памяти программ и что содержимое флэш-памяти копируется в SRAM во время запуска и затем процессор выполняет программу из ОЗУ.

Вместо 2-х настроек делителя тактовых импульсов (clock divider settings) доступно 4. Это позволяет GD32 работать на 48, 72, 96 и 120 МГц и иметь рабочий USB. (Обратите внимание, что при максимальной тактовой частоте 108 МГц соответствующая настройка делителя отсутствует. Таким образом, максимальная тактовая частота в пределах спецификации на которой процессор может работать с USB составляет 96 МГц — однако это все же быстрее, чем 72 МГц STM32F103.

Фото кристалла Giga Devices GD32F103CBT6:



Читать дальше

Если не дружат HAL и SDIO

Потомкам, которые это нагуглят. Если вы третий день пытаетесь запустить FatFS SDIO в HAL STM32F4 и ничего не получается, то включите DMA. Версия HAL 1.21



Включать раздельные DMA не обязательно, можно один SDIO. В общем пробуйте, у вас получится.

Захват изображения с USB камеры при помощи STM32

image
Для собственного самообразования решил подключить USB камеру (вебкамеру) к STM32. У меня уже была отладочная плата на базе STM324F429, способная выводить изображение на VGA монитор, так что для проверки работы камеры я использовал именно ее.


Читать дальше
  • +9
  • 29 сентября 2018, 22:18
  • citizen

ST прикупает Atollic и...


Новость надеюсь приятная — теперь Atollic TRUE Studio V9.0 для STM32 PRO версия бесплатна!


Читать дальше

STM32F4Discovery+LabWindowsCVI. Урок 1. Часть 0. Введение

Для тех, кому лень изучать С++ и С#...

Многие начинающие или даже имеющие за плечами большой опыт программирования программисты микроконтроллеров сталкиваются с проблемой написания более менее рабочего оконного приложения для управления микроконтроллером с ПК и отображения телеметрии. В большинстве случаев для этого нужно изучать языки программирования высокого уровня, такие как С++ и C#. Процесс изучения этих языков может привести программиста, который всю жизнь программировал только на С в ступор, потому что они очень сильно отличаются от обычного С, а изучение этих языков займет у него очень много времени.
Именно для таких людей компания NationalInstruments выпустила программу LabWindowsCVI, в которой весь код пишется на простом С и человек, который программировал только на С очень легко в ней разберется…

В этом топике хочу представить вам цикл уроков по программированию LabWindowsCVI с использованием отладочной платы STM32F4Discovery…

В процессе работы мы напишем простое приложение :

С помощью этого приложения мы сможем:
    -Управлять состоянием светодиодов;
    -Управлять яркостью синего светодиода;
    -Получать значения угловых ускорений со встроенного акселерометра;
    -Изменять значения на выходе ЦАП и изменять его с помощью АЦП.

Видео, демонстрирующее работу приложения представлено ниже:


Спасибо за внимание!

CAN + CANOpen + CANfestival + STM32. Часть первая

CANOpen
Вы когда-нибудь участвовали в форумных склоках на тему «Что лучше — написать свое или взять готовое?». Лично я обожаю подобные вещи, причем я больше предпочитаю наблюдать, нежели участвовать. Ведь это так весело, сначала обсуждаются технические детали, потом постепенно переходят на личности, потом кого-то банят… Вы скажете, что я второсортное быдло, которому нравятся такие же второсортные развлечения? Знаете, а зачем это отрицать, зачем заниматься самообманом? Лучше принять себя таким, какой я есть, и гордо нести это как знамя: «Да, я — быдло!». Поэтому вместо самоотрицания я попытаюсь «набросить», и если мне повезет, то там, в комментариях разгорится такой спор переходящий от технический деталей к личным оскорблениям.
Так что может послужить предпосылкой такого спора? Ну вот, например, такая тема. Есть у вас в микроконтроллере замечательная штука — интерфейс CAN, помощью которого можно сделать массу замечательных вещей: шину для связи между модулями в умном доме, между узлами в собственном роботе, между модулями в ПЛК, между электроникой в автомобиле и т.д. и т.п. Но что пустить «поверх» CAN: свой самодельный протокол или взять готовый. А если готовой протокол, то что лучше свой самописный стек или готовый? Займу пожалуй одну из крайних позиций — все готовое, и протокол и стек к нему, а именно CANOpen и CANFestival.


Читать дальше

STM32 + Параллельная NAND Flash + файловая система Yaffs. Часть третья


Обещанный пример порта Yaffs под STM32F429, память NAND128-A, интерфейс FMC, доступ к регистрам через библиотеку SPL. Надеюсь никто не будет против, если я не стану прикреплять архив с исходниками, просто дам ссылку на публичный репозитарий. Схему подключения не стану приводить — не вижу никакого смысла, в документации все есть.


Читать дальше