stm — functionality specific to STM32 MCUs¶
This module provides functionality specific to STM32 microcontrollers, including direct access to peripheral registers.
Memory access¶
The module exposes three objects used for raw memory access.
Read/write 8 bits of memory.
Read/write 16 bits of memory.
Read/write 32 bits of memory.
Use subscript notation [. ] to index these objects with the address of interest.
These memory objects can be used in combination with the peripheral register constants to read and write registers of the MCU hardware peripherals, as well as all other areas of address space.
Peripheral register constants¶
The module defines constants for registers which are generated from CMSIS header files, and the constants available depend on the microcontroller series that is being compiled for. Examples of some constants include:
Base address of the GPIOA peripheral.
Base address of the GPIOB peripheral.
Offset of the GPIO bit set/reset register.
Offset of the GPIO input data register.
Offset of the GPIO output data register.
Constants that are named after a peripheral, like GPIOA , are the absolute address of that peripheral. Constants that have a prefix which is the name of a peripheral, like GPIO_BSRR , are relative offsets of the register. Accessing peripheral registers requires adding the absolute base address of the peripheral and the relative register offset. For example GPIOA + GPIO_BSRR is the full, absolute address of the GPIOA->BSRR register.
# set PA2 high stm.mem32[stm.GPIOA + stm.GPIO_BSRR] = 1 2 # read PA3 value = (stm.mem32[stm.GPIOA + stm.GPIO_IDR] >> 3) & 1
Functions specific to STM32WBxx MCUs¶
These functions are available on STM32WBxx microcontrollers, and interact with the second CPU, the RF core.
Returns the status of the second CPU as an integer (the first word of device info table).
stm. rfcore_fw_version ( id ) ¶
Get the version of the firmware running on the second CPU. Pass in 0 for id to get the FUS version, and 1 to get the WS version.
Returns a 5-tuple with the full version number.
stm. rfcore_sys_hci ( ogf , ocf , data , timeout_ms = 0 ) ¶
Execute a HCI command on the SYS channel. The execution is synchronous.
Returns a bytes object with the result of the SYS command.
© Copyright — The MicroPython Documentation is Copyright © 2014-2023, Damien P. George, Paul Sokolovsky, and contributors. Last updated on 14 Jul 2023.
STM32 и Питон
Оказывается, существует реализация интерпретатора Python3.х для STM32. Сайт проэкта находится здесь. Проэкт стартовал на Кикстартере, были собраны средства (в декабре 2013 года) и софт на данный момент уже доступен для свободного скачивания в GitHub (Прямая ссылка для скачивания архива с исходниками).
Микропитон это легковесная имплементация стандартной версии интерпретатора CPython. На данный момент реализована полная поддержка синтаксиса интерпретатора версии 3.4. Поддерживаемые типы данных: str(пока что без поддержки Юникода), bytes, bytearray, tuple, list, dict, set,
array.array, collections.namedtuple, classes and instances.
Встроенные в платформу модули это: sys, time и struct.
Реализация встроенных модулей неполная. Они не содержат всех аттрибутов, которые содержит их компьютерная версия. А реализованные функции или классы не всегда имеют полноценную версию или полный набор методов соответственно. Ограничено все по понятным причинам из за сложности реализации или же по причине бессмысленности определенных атрибутов на подобного рода платформах. Более подробно с набором аттрибутов можно ознакомиться с помощью терминала и встроенной функции dir() языка Питон а также читая документацию на Микропитон.
Выполнение программы может происходить как с внутренней памяти микроконтроллера так и с внешней карты памяти. Файлы просто записываются на устройство либо на карту памяти, а интерпритатор после загрузки устройства начинает их выполнять. Выполнение всегда начинается с файла boot.py и далее, если это явно не указано, выполняется main.py.
Следует заметить что проект еще находится в стадии ранней беты, и функциональность может расширятся со временем.
Официально поддерживаемая плата это pyboard v1.0 (на плате STM32F405R, акселерометр Freescale MMA7660, 2 кнопки и 4 светодиода), но проэкт планируется для перевода на другие распространенные отладочные платы — список здесь. В этом списке можно увидеть, что уже существует порт в частности и под демоборду STM32F4DISCOVERY.
Теперь подробнее о запуске питона на STM32F4DISCOVERY.
Для того, чтобы получить прошивку для целевой платы STM32F4DISCOVERY, проект нужно сначала собрать. Для сборки используется кросс компилятор gcc-arm-none-eabi.
Собирать проэкт нужно с папки /stmhal утилитой make. По умолчанию проэкт собирается для официальной платы, и для того чтобы собрать проэкт под нашу платформу, нужно указать это явно. Команда для сборки будет иметь уже следующий вид: make BOARD=STM32F4DISC. Результаты сборки будут находиться в /stmhal/build-STM32F4DISC. В этой папке, помимо обьектных файлов, находятся бинарники firmware0.bin и firmware1.bin а также файл firmware.elf. Бинарники по какой то причине разделены, поэтому прошивку заливать нужно из «исполняемого» файла firmware.elf. С firmware.dfu я не разбирался, но в туториалах с его помощью шьют через USB в режиме бутлоадера. Так как наша плата имеет ST-Link2 на борту, то прошивка через него, как по мне, актуальнее потому что не требует лишних «аппаратных» телодвижений ). Предварительно нужно «извлечь» прошивку в формате .hex из файла .elf через arm-none-eabi-objcopy firmware.elf -O ihex firmware.hex. Можно загрузить прямо с исполняемого файла через GDB сервер и arm-none-eabi-gdb — кто как любит. Далее прошиваем через встроенный отладчик с помощью ST-Link Utility или другой программы. Выходим с режима отладки и перезагружаем контроллер.
Теперь при подключении к microUSB разьему плата определяется как медиа устройство на 115кБ. Также поддерживается работа с платой в режиме терминала. Подключение к REPL Promt смотрим здесь. Выглядит это все таким образом:
Целевая плата STM32F4DISCOVERY «из коробки» поддерживает не весь функционал оригинальной платы. Из модуля поддержки платы pyb (описание) нету поддержки Accel(акселерометр, хоть оный и есть на плате но от другого производителя), Servo(сервомашинки) и почему то DAC(встроенные в чип ЦАПы). Нету также поддержки внешней карты памяти.
Теперь попробуем написать простой пример. К порту PC1 подключен потенциометр. Каждые 500мс на канале PC1 выполняется преобразование АЦП и результат пишется во внутренню память в adc.dat. При этом моргает желтый светодиод. По нажатию пользовательской кнопки преобразования прекращаются и пишется время остановки. Загорается синий светодиод. Код выглядит так:
Файл с данными:
Таким образом можно организовать лог данных с АЦП. Благодаря мощным типам данных языка Питон их легко преобразовывать, фильтровать, искать пиковые значения и т.п… Код выглядит при этом компактнее чем на С.
P. S.
Конечно похоже это все на очередную Ардуину. Функционал достаточно упрощенный, а возможности чипа используются очень минимально. Скорость выполнения так же относительно невысокая по сравнению с программой на С (тест).
С другой стороны интересна сама возможность и особенности работы интерпретатора на «железной» платформе. Возможно очень легко организовать лог каких то пользовательских данных с привязкой ко времени, например с датчика со SPI интерфейсом. Полезно будет для какой то пользовательской автоматики, где зачастую нужно поддерживать какой то параметр на уровне с определенным алгоритмом, так как высокая частота там в основном не нужна, а язык программирования достаточно мощный, чтобы абстрагироваться от низкоуровневых типов данных С и быстро написать и развить идею в физическую реализацию.
Micro Python на STM32F4 Discovery
Micro Python суть реализация Python 3 для ARM-самодельщиков. Упоминался на хабре тут: habrahabr.ru/post/225131. По сути, проект micropython.org состоит из платы и софта. Так вот, платы у нас нет, а софт мало того, что доступен, так еще и неплохо работает (акселерометр не взлетает!) на STM32F4 Discovery. О том, как это завести, и расскажу вкратце. Принципиально нового ничего не скажу, описанное ниже — компиляция из следующих англоязычных источников:
Процесс
0. Для утех использовалась отладочная плата STM32F4 Discovery, приобретенная у китайцев.
В качестве «большого брата» — ноутбук, работающий под управлением Linux Mint 17. Еще понадобятся два кабеля — miniUSB и microUSB.
1. Подготавливаем «большого брата» для издевательств над маленьким.
sudo apt-get install gcc-arm-none-eabi
sudo apt-get install gdb-arm-none-eabi
Здесь есть документированная бага: если GDB уже установлен, то возникает конфликт man-ов. Решается путем загрузки и принудительной перезаписи пакета.
sudo apt-get install -d gdb-arm-none-eabi sudo dpkg -i --force-overwrite /var/cache/apt/archives/gdb-arm-none-eabi_.deb
git clone https://github.com/texane/stlink cd stlink ./autogen.sh ./configure make sudo make install
2. Собираем Micro Python.
git clone https://github.com/micropython/micropython.git cd stmhal make BOARD=STM32F4DISC
Здесь у меня вылезла ошибка компиляции, на форуме Micro Python решение имеется — нужен пакет libnewlib-arm-none-eabi.
В итоге в build-STM32F4DISC должен лежать firmware.elf
3. Заливаем прошивку в STM32F4 Discovery
Подключаем плату по miniUSB. Запускаем в терминале sudo st-util (оно начинает слушать порт 4242). В другом терминале запускаем GDB. Подключаемся к st-util и заливаем.
arm-none-eabi-gdb /build-STM32F4DISC/firmware.elf target extended localhost:4242 load
Процесс заливки сопровождается веселым морганием разноцветным светодиодом. По окончанию прибиваем GDB и st-util.
Подключаем microUSB. Передергиваем miniUSB (если я правильно понимаю, он начинает работать только на питание). И тут у нас появляется съемный накопитель с boot.py и main.py. На этом этапе можно переходить к официальному туториалу Micro Python: micropython.org/doc/tut-contents.
stm — functionality specific to STM32 MCUs¶
This module provides functionality specific to STM32 microcontrollers, including direct access to peripheral registers.
Memory access¶
The module exposes three objects used for raw memory access.
Read/write 8 bits of memory.
Read/write 16 bits of memory.
Read/write 32 bits of memory.
Use subscript notation [. ] to index these objects with the address of interest.
These memory objects can be used in combination with the peripheral register constants to read and write registers of the MCU hardware peripherals, as well as all other areas of address space.
Peripheral register constants¶
The module defines constants for registers which are generated from CMSIS header files, and the constants available depend on the microcontroller series that is being compiled for. Examples of some constants include:
Base address of the GPIOA peripheral.
Base address of the GPIOB peripheral.
Offset of the GPIO bit set/reset register.
Offset of the GPIO input data register.
Offset of the GPIO output data register.
Constants that are named after a peripheral, like GPIOA , are the absolute address of that peripheral. Constants that have a prefix which is the name of a peripheral, like GPIO_BSRR , are relative offsets of the register. Accessing peripheral registers requires adding the absolute base address of the peripheral and the relative register offset. For example GPIOA + GPIO_BSRR is the full, absolute address of the GPIOA->BSRR register.
# set PA2 high stm.mem32[stm.GPIOA + stm.GPIO_BSRR] = 1 2 # read PA3 value = (stm.mem32[stm.GPIOA + stm.GPIO_IDR] >> 3) & 1
Functions specific to STM32WBxx MCUs¶
These functions are available on STM32WBxx microcontrollers, and interact with the second CPU, the RF core.
Returns the status of the second CPU as an integer (the first word of device info table).
stm. rfcore_fw_version ( id ) ¶
Get the version of the firmware running on the second CPU. Pass in 0 for id to get the FUS version, and 1 to get the WS version.
Returns a 5-tuple with the full version number.
stm. rfcore_sys_hci ( ogf , ocf , data , timeout_ms = 0 ) ¶
Execute a HCI command on the SYS channel. The execution is synchronous.
Returns a bytes object with the result of the SYS command.
© Copyright — The MicroPython Documentation is Copyright © 2014-2023, Damien P. George, Paul Sokolovsky, and contributors. Last updated on 14 Jul 2023.