Полезные советы. Программы. Настройка. Железо. Windows
  • Главная
  • Windows 
  • Прошивка ARM Cortex M3 на примере STM32 и LPC1300. Защита прошивки от копирования Прошивка STM32 с помощью ST-Link программатора под Windows

Прошивка ARM Cortex M3 на примере STM32 и LPC1300. Защита прошивки от копирования Прошивка STM32 с помощью ST-Link программатора под Windows

Некоторые из микроконтроллеров stm32 поддерживают USB DFU протокол (их список можно посмотреть в app note AN3156), в такие МК прошивку можно заливать через обычный USB, используя например DFuSe demo от ST, либо опенсурсный dfu-util. С этим вариантом все понятно и описывать его я не буду.

Для тех же МК (в частности и того, который используется в плате BluePill — STM32F103C8T6), которые обделены поддержкой DFU, так или иначе нужен программатор, например ST-Link V2 Mini

Распиновка устройства:

Подключается к плате просто:

ST-Link STM32F103C8T6 3.3V --- 3.3V GND --- GND SWDIO --- DIO SWCLK --- DCLK

Также нужна утилита ST-Link Utility, скачать ее можно с официального сайта st.com — ссылка . При первом подключении неплохо было бы обновить firmware самого программатора. Выбираем ST-LINK -> firmware update, если доступна более свежая firmware, то будет что-то подобное:

Выбираем Yes >>>>, прошивка обновляется.

Далее открываем собственно файл с прошивкой, и выбираем Target -> Connect. В окне состояния утилиты появится информация и вашем МК — это значит, что программатор подключен корректно и утилита может контактировать с МК. Пример:

Затем нужно сделать полную очистку чипа, выбираем Target -> Erase Chip

В случае, если например, моя прошивка из поста контроллере педалей и кнопок уже была залита и ее нужно обновить или перезалить, то программатор не сможет так просто подключиться к плате (потому что я использую пины SWD как обычные GPIO). В этом случае есть два варианта:

  1. переставить оба желтых джампера. Плата в этом случае загрузится у вас сразу во внутренний бутлоадер
  2. можно сделать так называемый Connect under Reset. Для него последовательность будет такая:
  • в ST-Link Utility выбираем Target -> Settings
  • в Reset Mode выбираем Hardware Reset
  • нажимаем и держим кнопку Reset на плате
  • нажимаем OK в ST-Link Utility
  • отпускаем кнопку Reset на плате

PS. Если у вас есть плата для разработчиков SMT32F4Discovery, то она уже имеет в себе программатор и его также можно использовать для прошивки другой платы. В данном случае нужно использовать разъем SWD у STM32F4Discovery и убрать обе перемычки CN3. Разъем SWD имеет следующую распиновку:

Любой микроконтроллер stm32 можно прошивать через USART_1 и другие интерфейсы, подробно смотрите в . Для этого в МК есть специальный системный загрузчик, который зашивается в System memory (спец. область памяти) на этапе производства, его нельзя удалить или изменить. Это загрузчик инициализируется путём «подтягивания» пина BOOT_0 к «плюсу», после чего он ожидает поступления прошивки.

Через USART можно загружать любые.bin или.hex файлы.

Описание сделано на примере платы Blue Pill , однако всё сказанное справедливо для любого stm32 .

Фирменные платы типа Discovery и Nucleo тоже можно прошивать через USART.

Для работы потребуется USB to UART конвертер…

Если такой штуковины нет, то есть два варианта превращения ардуины в конвертер…

превращение

1 . Замкнуть RESET на GND (может не прокатить) .
2 . Загрузить в неё вот такой незамысловатый скетч:

Void setup() { pinMode(0, INPUT); pinMode(1, INPUT); } void loop() {}

Чтобы проверить работает ли ардуина в качестве конвертера, замкните RX и TX, откройте и отправьте какие-нибудь символы. Если они вернулись, значит всё работает.

Перед прошивкой необходимо подтянуть пин BOOT0 к «плюсу», это переведёт МК в режим «системного бутлоадера». На описываемой плате это осуществляется перестановкой джампера…

Если плата фирменная

На фирменных платах (Discovery, Nucleo) тоже нужно подтянуть пин BOOT0 к плюсу, но просто так это сделать не получится. Возьмите схему вашей платы и найдите там соответствующие перемычки…

Искать надо что-то вроде этого:

Не помню от какой платы эта схема, но суть такая: в данном случае пин BOOT_0 подтянут к «минусу» через резистор R16 и перемычку SB16. Если убрать перемычку SB16, то пин подтянется к «плюсу» через резистор R17 и можно прошивать. После прошивки надо вернуть всё на место.

Перемычка может выглядеть как резистор.

Соединяем конвертер и STM следующим образом…

картинка

Конвертер RX <-> PA9 STM
Конвертер TX <-> PA10 STM
Конвертер GND <-> GND STM

… и подключаем конвертер и STM к компьютеру.

Инструкция по прошивке для

Если хотите, можете взять с сайта ST (в самом низу страницы).

Нажмите Reset на плате.

Перейдите в папку Flash Loader Demonstrator и запустите Flash Loader Demonstrator.exe

Выбираем СОМ-порт конвертера и жмем Next ...

WARNING Remove Protection (защита от записи)

Такое сообщение…

… означает, что плата, залочена. Ничего страшного нет, просто снимите защиту кнопкой Remove protection и следом нажмите ОК .

Защита снята.


Если выдаёт ещё какие-то ошибки, то либо не нажали Reset, либо что-то с конвертером.

Если светофор даёт зеленый свет, то смело жмите Next ...

Жмем Next ...

В пункте Download to device указываем путь к нужному.bin или.hex файлу и жмем Next ...

Всё готово, верните джампер в исходное положение и нажмите Reset.

Инструкция по прошивке для

Скачайте и распакуйте куда-нибудь.

Из папки соответствующей вашей ОС скопируйте файл stm32flash в домашнюю папку.

Эта утилита есть в репах ubuntu, в других дистрах не знаю, поэтому выкладываю.

Перед прошивкой всегда нажимайте Reset на плате.

В терминале дайте команду:

./stm32flash -w /home/dima/myfile.bin -v -g 0x0 /dev/ttyUSB0
Название и путь к файлу у вас будет свой. HEX-файлы тоже можно прошивать этой утилитой.

Если будет ругаться на права, тогда дайте команду…

Sudo chmod 777 /dev/ttyUSB0

… или запускайте утилиту через sudo .

Защита от записи

Если появилось вот такое сообщение…

… тогда дайте по очереди две команды:

./stm32flash -u /dev/ttyUSB0 ./stm32flash -k /dev/ttyUSB0

Первая снимает защиту от записи, вторая от чтения.

Если у Вас стоял ардуиновский загрузчик, то он будет затёрт, чтоб его востановить просто залейте описанным выше способом этот

Опубліковано 09.08.2016

Микроконтроллеры STM32 приобретают все большую популярность благодаря своей мощности, достаточно разнородной периферии, и своей гибкости. Мы начнем изучать , используя бюджетную тестовую плату, стоимость которой не превышает 2 $ (у китайцев). Еще нам понадобится ST-Link программатор, стоимость которого около 2.5 $ (у китайцев). Такие суммы расходов доступны и студентам и школьникам, поэтому именно с такого бюджетного варианта я и предлагаю начать.


Этот микроконтроллер не является самым мощным среди STM32 , но и не самый слабый. Существуют различные платы с STM32 , в томе числе Discovery которые по цене стоят около 20 $. На таких платах почти все то же, что и на нашей плате, плюс программатор. В нашем случае мы будем использовать программатор отдельно.

Микроконтроллер STM32F103C8. Характеристики

  • Ядро ARM 32-bit Cortex-M3
  • Максимальная частота 72МГц
  • 64Кб Флеш память для программ
  • 20Кб SRAM памяти
  • Питание 2.0 … 3.3В
  • 2 x 12-біт АЦП (0 … 3.6В)
  • DMA контролер
  • 37 входов / выходов толерантных к 5В
  • 4 16-розрядних таймера
  • 2 watchdog таймера
  • I2C – 2 шины
  • USART – 3 шины
  • SPI – 2 шины
  • USB 2.0 full-speed interface
  • RTC – встроенные часы

На плате STM32F103C8 доступны

  • Выводи портов A0-A12 , B0-B1 , B3-B15 , C13-C15
  • Micro-USB через который можно питать плату. На плате присутствует стабилизатор напряжения на 3.3В. Питание 3.3В или 5В можно подавать на соответствующие выводы на плате.
  • Кнопка Reset
  • Две перемычки BOOT0 и BOOT1 . Будем использовать во время прошивки через UART .
  • Два кварца 8Мгц и 32768 Гц. У микроконтроллера есть множитель частоты, поэтому на кварце 8 МГц мы сможем достичь максимальной частоты контроллера 72Мгц.
  • Два светодиода. PWR – сигнализирует о подачи питания. PC13 – подключен к выходу C13 .
  • Коннектор для программатора ST-Link .

Итак, начнем с того, что попробуем прошить микроконтроллер. Это можно сделать с помощью через USART, или с помощью программатора ST-Link .

Скачать тестовый файл для прошивки можно . Программа мигает светодиодом на плате.

Прошивка STM32 с помощью USB-Uart переходника под Windows

В системной памяти STM32 есть Bootloader . Bootloader записан на этапе производстве и любой микроконтроллер STM32 можно запрограммировать через интерфейс USART с помощью USART-USB переходника. Такие переходники чаще всего изготавливают на базе популярной микросхем FT232RL . Прежде всего подключим переходник к компьютеру и установим драйвера (если требуется). Скачать драйвера можно с сайта производителя FT232RL – ftdichip.com . Надо качать драйвера VCP (virtual com port). После установки драйверов в компьютере должен появиться виртуальный последовательный порт.


Подключаем RX и TX выходы к соответствующим выводам USART1 микроконтроллера. RX переходника подключаем к TX микроконтроллера (A9). TX переходника подключаем к RX микроконтроллера (A10). Поскольку USART-USB имеет выходы питания 3.3В подадим питания на плату от него.

Чтобы перевести микроконтроллер в режим программирования, надо установить выводы BOOT0 и BOOT1 в нужное состояние и перезагрузить его кнопкой Reset или выключить и включить питание микроконтроллера. Для этого у нас есть перемычки. Различные комбинации загоняют микроконтроллер в различные режимы. Нас интересует только один режим. Для этого у микроконтроллера на выводе BOOT0 должно быть логическая единица, а на выводе BOOT1 – логический ноль. На плате это следующее положение перемычек:

После нажатия кнопки Reset или отключения и подключения питания, микроконтроллер должен перейти в режим программирования.

Программное обеспечение для прошивки

Если используем USB-UART переходник, имя порта буде примерно такое /dev/ttyUSB0

Получить информацию о чипе

Результат:

Читаем с чипа в файл dump.bin

sudo stm32flash -r dump.bin /dev/ttyUSB0

Пишем в чип

sudo stm32flash -w dump.bin -v -g 0x0 /dev/ttyUSB0

Результат:

Stm32flash 0.4 http://stm32flash.googlecode.com/ Using Parser: Raw BINARY Interface serial_posix: 57600 8E1 Version: 0x22 Option 1: 0x00 Option 2: 0x00 Device ID: 0x0410 (Medium-density) - RAM: 20KiB (512b reserved by bootloader) - Flash: 128KiB (sector size: 4x1024) - Option RAM: 16b - System RAM: 2KiB Write to memory Erasing memory Wrote and verified address 0x08012900 (100.00%) Done. Starting execution at address 0x08000000... done.

Прошивка STM32 с помощью ST-Link программатора под Windows

При использовании программатора ST-Link выводы BOOT0 и BOOT1 не используются и должны стоять в стандартном положении для нормальной работы контроллера.

(Книжка на русском языке)

Маркировка STM32

Device family Product type Device subfamily Pin count Flash memory size Package Temperature range
STM32 =
ARM-based 32-bit microcontroller
F = General-purpose
L = Ultra-low-power
TS = TouchScreen
W = wireless system-on-chip
60 = multitouch resistive
103 = performance line
F = 20 pins
G = 28 pins
K = 32 pins
T = 36 pins
H = 40 pins
C = 48/49 pins
R = 64 pins
O = 90 pins
V = 100 pins
Z = 144 pins
I = 176 pins
B = 208 pins
N = 216 pins
4 = 16 Kbytes of Flash memory
6 = 32 Kbytes of Flash memory
8 = 64 Kbytes of Flash memory
B = 128 Kbytes of Flash memory
Z = 192 Kbytes of Flash memory
C = 256 Kbytes of Flash memory
D = 384 Kbytes of Flash memory
E = 512 Kbytes of Flash memory
F = 768 Kbytes of Flash memory
G = 1024 Kbytes of Flash memory
I = 2048 Kbytes of Flash memory
H = UFBGA
N = TFBGA
P = TSSOP
T = LQFP
U = V/UFQFPN
Y = WLCSP
6 = Industrial temperature range, –40…+85 °C.
7 = Industrial temperature range, -40…+ 105 °C.
STM32 F 103 C 8 T 6

Как снять защиту от записи / чтения?

Если вы получили плату с STM32F103, а программатор ее не видит, это означает, что китайцы защитили Флеш память микроконтроллера. Вопрос “зачем?” оставим без внимания. Чтобы снять блокировку, подключим UART переходник, будем программировать через него. Выставляем перемычки для программирования и поехали:

Я это буду делать из под Ubuntu с помощью утилиты stm32flash.

1. Проверяем видно ли микроконтроллер:

Sudo stm32flash /dev/ttyUSB0

Должны получить что-то такое:

Stm32flash 0.4 http://stm32flash.googlecode.com/ Interface serial_posix: 57600 8E1 Version: 0x22 Option 1: 0x00 Option 2: 0x00 Device ID: 0x0410 (Medium-density) - RAM: 20KiB (512b reserved by bootloader) - Flash: 128KiB (sector size: 4x1024) - Option RAM: 16b - System RAM: 2KiB

2. Снимаем защиту от чтения а затем от записи:

Sudo stm32flash -k /dev/ttyUSB0 stm32flash 0.4 http://stm32flash.googlecode.com/ Interface serial_posix: 57600 8E1 Version: 0x22 Option 1: 0x00 Option 2: 0x00 Device ID: 0x0410 (Medium-density) - RAM: 20KiB (512b reserved by bootloader) - Flash: 128KiB (sector size: 4x1024) - Option RAM: 16b - System RAM: 2KiB Read-UnProtecting flash Done. sudo stm32flash -u /dev/ttyUSB0 stm32flash 0.4 http://stm32flash.googlecode.com/ Interface serial_posix: 57600 8E1 Version: 0x22 Option 1: 0x00 Option 2: 0x00 Device ID: 0x0410 (Medium-density) - RAM: 20KiB (512b reserved by bootloader) - Flash: 128KiB (sector size: 4x1024) - Option RAM: 16b - System RAM: 2KiB Write-unprotecting flash Done.

Теперь можно нормально работать с микроконтроллером.

Ответы на часто задаваемые вопросы:

  • 1. Для кого предназначен этот FAQ?

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

  • 2. Для чего и от кого делается защита микроконтроллеров?

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

  • 3. Что представляет собой защита от копирования в микроконтроллере, и почему я сам не могу считать защищенную микропрограмму (прошивку)?

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

  • 4. Что дает мне снятие защиты от чтения микропрограммы (прошивки)?

    Допустим, у Вас есть устройство, которое Вы приобрели у одного из производителей электронных устройств и Вы хотите производить такое же, но модифицированное устройство. Но исходников микропрограммы или готовой прошивки у Вас естественно нет, и Вам будет необходимо полностью с нуля разрабатывать и отлаживать микропрограмму. На это, по сравнению с копированием электронной составляющей устройства (схемы), придется потратить много денег и времени. Пользуясь нашими профессиональными услугами, Вы сэкономите и деньги и время на разработку устройства. При наличии устройства или его электрической схемы мы можем восстановить полностью алгоритм его работы и текст микропрограммы на языке программирования Си или Ассемблер.

  • 5. Какова законность таких действий с точки зрения законодательства?

    Все микропрограммы (прошивки) мы считываем по заказу клиента с целью ремонта его устройства, либо для ознакомления с алгоритмом работы микропрограммы. Вся дальнейшая ответственность за незаконное распространение микропрограммы или иные действия с ней или с её помощью ложится полностью на заказчика.

    Наша компания работает на территории РФ, поэтому ниже приведем цитату из закона. Законодательство других стран декларирует аналогичную позицию.

    Статья 1280 ГК РФ. "Свободное воспроизведение программ для ЭВМ и баз данных. Декомпилирование программ для ЭВМ".

    2. Лицо, правомерно владеющее экземпляром программы для ЭВМ, вправе без согласия правообладателя и без выплаты дополнительного вознаграждения изучать, исследовать или испытывать функционирование такой программы в целях определения идей и принципов, лежащих в основе любого элемента программы для ЭВМ, путем осуществления действий, предусмотренных подпунктом 1 пункта 1 настоящей статьи.

    3. Лицо, правомерно владеющее экземпляром программы для ЭВМ, вправе без согласия правообладателя и без выплаты дополнительного вознаграждения воспроизвести и преобразовать объектный код в исходный текст (декомпилировать программу для ЭВМ) или поручить иным лицам осуществить эти действия, если они необходимы для достижения способности к взаимодействию независимо разработанной этим лицом программы для ЭВМ с другими программами, которые могут взаимодействовать с декомпилируемой программой...

  • 6. Что представляет собой дополнительная защита от чтения и почему она лучше обычной?

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

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

    Второй уровень делает невозможной процедуру считывания программатором без специальных дорогостоящих инструментов.

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

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

  • 7. Я хочу установить дополнительную защиту, но я боюсь, что вы считаете мою суперсекретную программу перед установкой защиты. Есть ли какой-то способ установить дополнительную защиту на микросхему, перед тем как я ее окончательно запрограммирую?

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

  • В последнее время на хабре появилось много статей по STM32 (). В комментариях неоднократно упоминается сложность STM32 по сравнению с AVR. Эта тема особенно влияет на новичков, которые хотят начать изучение микроконтроллеров, и, видя такое мнение, выбирают для изучения AVR. Давайте разберемся, так ли сложен этот зверь - STM32?

    Для этого выберем недорогой вариант платы и напишем прошивку в десяток-другой байт (да-да, мигание светодиодом в 2 килобайта сродни «Hello world» в сотни килобайт x86 для неумех). Также научимся писать программы на любом языке программирования для STM32.

    Вступление

    Какой тип микроконтроллеров изучать? Этот вопрос, по-моему, аналогичен вопросам типа «Какой язык программирования изучать?», «Какой иностранный язык учить?». ИМХО, изучать нужно тот, который нужнее в данную минуту, для данной задачи. Когда знаешь что-то одно, изучение второго дастся намного легче, а на счет третьего и не задумаешься.

    Итак, в чем же сложность STM32? Наиболее часто звучит мнение о сложности программирования его периферии. Количество и тип периферии STM32 и AVR примерно одинаков. Конфигурирование ее также не сильно отличается. Так в чем же сложность? В микроконтроллерах STM32 всю периферию нужно предварительно включать. Вот и вся сложность.

    Я сравниваю AVR с общественными зданиями: все двери нараспашку, везде мониторы сверкают рекламой и свет горит, а STM32 с личным домом: хочешь телевизор посмотреть - включи сначала, потом переключай каналы, захотел пи-пи - открой дверь и включи там свет, руки помыть - открой воду, и так далее. Не верите? Убедимся вместе.

    Обзор платы

    Я выбрал самую дешевую плату из предложенных на aliexpress (рисунок выше). Чуть дороже $2, 180 рублей в декабре 2015. На борту минимальная обвязка: два кварцевых резонатора - высокочастотный на 8МГц и часовой на 32.768Гц, кнопка «сброс», два джампера выбора режима загрузки, пара светодиодов - на питание и на ножке PC13 и набор разъемов: microUSB, отладочный, две гребенки для всех выводов микроконтроллера.

    Дешевле только купить все детали, сделать самому плату и спаять. Чем шить и отлаживать? Если есть ST-LINK, то лучше им, нет - не беда, есть еще несколько вариантов, например через USB-USART переходник, нет и его - можно напрямую через USB, правда нужно самому написать драйвер для такого случая, никто пока не озаботился. ST-LINK достаточно дешев, да и входит во все платы серии DISCOVERY. Вот и я воспользовался таким.

    Подключаем питание, светодиод весело мигает, плата исправна. Скачиваем и устанавливаем программу-программатор (масло-масляное) «STM32 ST-LINK Utility» (все программы и документы берем на сайте производителя). Пытаемся считать прошивку… Программа защищена от чтения. Видимо, недаром все говорят о сложности написания программ для STM32, даже китайцы защитили эту сверхсложную программу от взлома. Или там спрятана закладка-вирус? Разбираться не будем, снимаем защиту и получаем девственно чистый микроконтроллер STM32F103C8T6.

    Первая программа

    Давайте тоже помигаем светодиодом, сделаем, так сказать, реверс-инжиниринг в уме родной прошивки. Чем? Чтобы не городить споры по выбору среды разработки, я это сделаю в родной Visual Studio Community. Мне кажется, для Windows лучше для мужчины нет.

    Как там программа мигания для ардуины? Конфигурируем ножку на выход и в цикле переключаем ее с нуля на единицу и обратно.
    А как будет выглядеть она же для STM32? Намного сложнее. Сначала включим свет в комнате конфигурации ножек микроконтроллера, а затем «Конфигурируем ножку на выход и в цикле переключаем ее с нуля на единицу и обратно». Я понимаю, сложно… Но мы справимся.

    В документе «RM0008. Reference Manual» на наш микроконтроллер посмотрим карту памяти для нужных нам регистров.

    - Пойдем простым и логическим ходом.
    - Пойдем вместе.

    1. Включим тактирование порта C (наш светодиод висит на ножке 13 порта C). Смотрим документ. Нужный нам регистр RCC_ABP2ENR (переводим: регистр сброса и тактирования - вторая низкоскоростная шина периферии). Адрес порта - 0x40021018, нужный бит IOPCEN (порт ввода-вывода C - бит разрешения) четвертый - 0x00000010.

    Отступление

    У микроконтроллеров все как у взрослых процессоров. Есть высокоскоростная шина AHB aka «Северный мост» и низкоскоростная APB aka «Южный мост». Сам процессор микроконтроллера умеет все для ускорения работы: имеет предвыборку команд, конвейер выполнения команд. Нет кеша, но процессор не намного быстрее памяти, и чтение-запись в память успевает выполняться за один такт. Так что, можно сказать, вся память микроконтроллера - это один большой кеш. Ладно-ладно, не один и не большой. Два маленьких кеша.
    Вся периферия отображена (маппирована) на адресное пространство. По сравнению с x86 нет команд in-out, но и Intel оставил их только для совместимости, сейчас они практически не используются.


    2. Сконфигурируем ножку на вывод. Смотрим документ. Нужный нам регистр GPIOC_CRH (переводим: регистр порта ввода-вывода C - конфигурационный регистр для старшей половины ножек). Адрес порта - 0x40011004, за конфигурацию каждой ножки отвечают 4 бита, значение для переключения ножки на выход - 0001b, для ножки 13 значение - 0x00100000.

    3. Как переключить логическое значение на ножке. Смотрим документ. Нужный нам регистр GPIOC_ODR (переводим: регистр порта ввода-вывода C - регистр вывода данных). Адрес порта - 0x4001100С, его значение напрямую выводится в ножки микроконтроллера, для ножки 13 значение - 0x00002000. Все готово для написания программы (не забыть выложить проект на github):

    Int main(void) { *((int*)0x40021018) = 0x00000010; // RCC_APB2ENR = RCC_APB2ENR_IOPCEN *((int*)0x40011004) = 0x00100000; // GPIOC_CRH = MODER_OUTPUT_13 while(1) { *((volatile int*)0x4001100C) ^= 0x00002000; // GPIOC_ODR ^= BIT_13 int i; for (i=1000000; i>0; i--) ; } } extern int _eram; __attribute__ ((section(".isr_vector"))) int g_pfnVectors = { (int)&_eram, // начальное значение стека (int)main // Reset Handler };
    С векторами прерываний, надеюсь все понятно? Мы используем только два из них, поэтому незачем занимать память пустышками. Все остальные прерывания включаются программно, не включали - значит они никогда не сработают. Исключение - третий вектор HardFault, если случилось - микроконтроллер неисправен или сбоит, для простых проектов (не космос-авиация, не медицина) можно не обрабатывать.

    Это учебный проект, конечно следует оформить все адреса как символические константы в отдельный h-файл с большим количеством дефайнов, как это сделано в CMSIS. Можно взять их и приспособить для своих нужд. Для компиляции использую gcc, прошивка с помощью «STM32 ST-LINK Utility». Прошивка заняла 56 байт (привет, ассемблер).

    Еще отступление

    Еще одно утверждение о сложности STM32 - мало документации на русском языке. Спорно. Необходимы только два документа - Datasheet и Reference Manual на нужный микроконтроллер. Язык на котором он написан сложно назвать английским. Я изучал язык по непереведенным игрушкам, уровень английского остался на том же уровне, но даташиты я читаю без проблем, незнакомые термины понятны из контекста.



    Вроде много получилось, тогда на сегодня все.

    Во второй половине расскажу о программировании STM32 на любом языке программирования.

    Теги: STM32, микроконтроллеры-это-просто, ардуино-не-надо

    Лучшие статьи по теме