Программатор st link v2 инструкция на русском

Самый недорогой программатор/отладчик ST-Link V2 на примере STM32F103CBT6.

Обязательно меняем провода на короткие

Итак первым делом меняем провода для соединения ST-LINK V2 с STM32F103C8T6 на короткие 10см.

Используем для соединения с STM32F103C8T6 только 4 провода (SWD интерфейс):

3.3V — 3.3V
GRD — GRD
SWDIO- DIO
SWCLK- CLK

Нет SWO трассировки

То есть не выведен отдельный провод PB3 SWO из программатора наружу.

Но в принципе программно SWO реализован внутри программатора. Только воспользоваться им нельзя. Белый провод это он и есть, а как подпаятся к ножке микросхемы программатора вопрос ?..

Как обновить внутреннее ПО

через программу ST-LINK Utility

Проверяем сначала связь с контроллером программой ST-LINK Utility:

Обе перемычки на STM32F103C8T6 в положении 0
запускаем, жмем Connect и все определяется ОК
щелкаем Settings и видим, что устройство определяется автоматически корректно (см.скриншот) , port = SWD, target Voltage=3.2V и т.д.

Обновление внутреннего ПО

Чтобы сделать Firmware Update в программе ST-LINK Utility надо установить перемычку в положение 1 (режим DFU). В результате должно получится примерно так, кнопка Yes активна:

Иногда , почему-то не удается сделать Firmware Update. Но помогает — закрытие всех программ, перезагрузка ПК (танцы с бубном).

По-видимому надо разобраться что устанавливать? — Hardware Reset (при SoftWare Reset у меня не срабатывает).

Важно! — в ST-Link V2 после прошивки (через Stm32-Link Utility) сохраняются старые настройки Mode (Normal|Hot Plug|Connect Undr Reset) и Reset Mode (Software System Reset|Core Reset|Hardware Reset).

Если не работает ничего — пытаемся разобраться с дополнительными настройками

Mode : Connect Under Reset можно выставить только с Reset Mode : Hardware Reset (Похоже по смыслу , что это тот самый режим когда надо ручками кнопку Reset нажимать и перемычка в 1 д/б).

The “Connect Under Reset” option allows to connect to the target using a reset vector catch before executing any instruction. This is useful in many cases like when the target contains a code that disables the JTAG/SWD pins.

Т.е. это похоже когда программа в начале своего исполнения отключает SWD возможности. Понятно отладка тут не будет возможна.

Mode : Normal возможен с Reset Mode : (Software System Reset|Core Reset|Hardware Reset) .
With “Normal” connection mode, the target is rest then halted. The type of reset is selected using the “reset Mode” option.

Mode : Hot Plug возможен с Reset Mode : (Software System Reset|Core Reset|Hardware Reset)

The “Hot Plug” option allows to connect to the target without halt or reset. This is useful to update the RAM addresses or the IP registers while the application is running.
И мы понимаем, что Hot Plug — пока этот режим нам не нужен никак.

Итак режим (Mode) и Reset Mode настраивается именно в ST-Link V2 через Stm32-Link Utility.

В Keil надо соответственно этому указать настройки.

Возиться с Arduino приятно и весело, но через некоторое время вы доходите до точки, когда требуется более низкоуровневое и гибкое управление, и это прекрасный момент, чтобы уйти от высокоуровневых предостережений, которые предоставляет Arduino IDE. Хорошим началом в мире более сложного программирования микроконтроллеров могут стать устройства STM32 на основе ядра ARM Cortex-M.

Почему STM32?

STM32 – это семейство микроконтроллеров от STMicroelectronics, и эти микроконтроллеры являются 32-разрядными. 32-битные микроконтроллеры – это хорошо, но главное, что меняет правила игры – это скорость выполнения вашей программы и степень гибкости, которую микроконтроллер обеспечивает с точки зрения аппаратных поддерживаемых протоколов, таких как I2C, SPI, CAN, I2S, UART и многих других. Конкретная отладочная плата, которую мы будем использовать в этом проекте – это «Blue Pill», отладочная плата с STM32F103, работающим на частоте 72 МГц. Вам также понадобятся перемычки и ST-Link для программирования платы.

CUBE IDE

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

Настройка среды разработки для STM32

Откройте IDE и нажмите «Start a New STM32 Project», затем в левой части IDE вы увидите панель поиска, которая представляет собой поиск по наименованию компонента, введите STM32F103C8, и справа появится компонент, выберите его. Нажмите «Next». Затем создайте проект и назовите его, после этого вы получите всплывающее окно с надписью «Open Associated Perspective», нажмите «Yes», после чего будут установлены файлы, относящиеся к нашей среде разработки.

После завершения загрузки и распаковки нам нужно выполнить обычную настройку, характерную для нашей платы разработки. Вы увидите меню, содержащее вкладку распиновки и конфигурации, а внутри него вы увидите вертикальное меню с двумя вкладками, «Category» и «A-Z», нажмите «A-Z» и выберите «RCC», внутри него в раскрывающемся меню «High-Speed Clock» выберите «Crystal/Ceramic Resonator», отключите «Low-Speed Clock».

Теперь заходим в настройки SYS, меняем Debug на Serial Wire. Теперь с правой стороны вы увидите схематическое представление распиновки микросхемы микроконтроллера, которую мы используем. Нажмите на PC13, из появившегося списка выберите или назначьте его «GPIO_Output». Теперь нажмите на вкладку Clock Configuration, в которой под PLL Source Mux по умолчанию выбран HSI, поставьте галочку выбора на HSE и в HCLK вместо «16» напишите «72». В System Clock Mux выберите PLLCLK.

Базовое руководство по работе с микроконтроллерами STM32 для новичков

Базовое руководство по работе с микроконтроллерами STM32 для новичков

Базовое руководство по работе с микроконтроллерами STM32 для новичков

Базовое руководство по работе с микроконтроллерами STM32 для новичков

Приступаем к программированию микроконтроллера STM32

Крайний левый вертикальный столбец расширяет Core-SRC, затем вы увидите main.c, дважды щелкните по нему, вы увидите много кода по умолчанию, который IDE написал для вас. Но нас интересует непрерывный цикл, цикл while 1 можно найти в том же main.c, здесь пишем следующий код, и ВАЖНО: сохраняем и генерируем код, собирая проект через Build.

HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);

 HAL_Delay(2000);

Базовое руководство по работе с микроконтроллерами STM32 для новичков

Сборка проекта

Перейдите в Project-Build Project и в окне консоли вы должны увидеть что-то вроде этого: 17:19:35 Build Finished. 0 errors, 0 warnings. (took 1s.612ms).

Базовое руководство по работе с микроконтроллерами STM32 для новичков

Отладка проекта STM32

Перейдите в Run-Debug Configurations из вертикального меню во вновь открывшемся окне, внутри STM32 Cortex M вы увидите имя файла, над которым вы работаете, выберите его, теперь перейдите на вкладку Debugger, в раскрывающемся списке Debug probe выберите ST-LINK (OpenOCD) и ниже внутри сценария конфигурации нажмите «Show generator options», а в раскрывающемся списке «Reset Mode» «Select software system reset». Примените настройки и закройте.

Базовое руководство по работе с микроконтроллерами STM32 для новичков

Базовое руководство по работе с микроконтроллерами STM32 для новичков

Подключите STM32 к программатору ST-Link

Подключите линии микроконтроллера STM32 к выводам программатора ST-Link следующим образом:

3.3V-3.3V

GND — GND

SWDIO — SWDIO

SWCLK — SWCLK

Базовое руководство по работе с микроконтроллерами STM32 для новичков

После выполнения этих подключений подключите ST-Link к USB-порту вашего компьютера с CUBE IDE.

Запускаем программу на микроконтроллере STM32

Нажмите на крошечную кнопку отладки (Debug), IDE попросит вас переключиться, нажмите «Yes», и появится новое окно и панель инструментов, нажмите кнопку «Resume», и ваш код будет запущен на микроконтроллере.

Базовое руководство по работе с микроконтроллерами STM32 для новичков

Базовое руководство по работе с микроконтроллерами STM32 для новичков

STM32 Minikit

Модуль с микроконтроллером STM32F103C8T6

590,00 

Программатор ST-Link V2

ST-Link V2 для программирования микроконтроллеров STM8 и STM32

750,00 

Привет, Хабр!

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

А какой программатор вы используете?

Разумеется данный вопрос коснулся и Автора статьи. Сначала, сидя на табуретке, держа в одной руке стипендию, а в другой желание программировать железку, хочется начать изучение «по уму», однако жизненные факторы на раннем этапе развития заставляют себя ограничивать… Поэтому идеальный вариант — дешёвый китайский программатор ST-Link V2Был…


Введение

В данной статье речь пойдёт о самодельном программаторе ST-Link V2.1.

Всё дело в том, что со временем приходит усталость от пользования дешёвыми китайскими программаторами ST-Link V2. У них нет поддержки SWO (Serial Wire Output), VCO (Virtual COM Port) и MSC (Mass Storage Class). Покупать оригинальный программатор ST-Link V2 совсем не тянет, тратить в 10 раз больше практически за те же возможности, что у китайского программатора, тоже не вариант.

Сущетсвует также ST-Link V3, он сомещает все те функции, которых лишён ST-Link V2. но цена его просто космос.

Подробнее см. Сравнение с аналогами.

Поэтому со временем возможно каждому приходит потребность как-то выкручиваться и делать себе модифицированный программатор. Кто-то делает ST-Link V2.1 из китайского «свистка» путём разрезания дорожек и напаивания дополнительных проводов и подтягивающего резистора, кто-то делает j-link программатор из BluePill и т.д. Можно конечно ещё себе купить DISCOVERY или NUCLEO с встроенным ST-Link V2-1 и вообще горя не знать. Это и программатор почти со всеми возможностями, и универсальная плата для разных семейств STM32. Однако снова же, цена…

Ссылки на другие статьи Хабр по модификации ST-Link V2 в версию V2.1

В связи с вышеизложенным было принято решение сделать себе полноценный, практичный и надёжный программатор ST-Link V2.1. Особенности: интерфейс SWD, функция виртуального COM-порта, поддержка SWO, функция MSC (mass storage class), низкая цена (4-5$ за плату).

Нюанс стоимости

Конечно, в реальности делать платы, это где-то 15$ за 10 штук + компоненты где-то 30-35$ на все платы, если нужно кому-то отослать по почте — ещё сверху стоимость упаковки и отправки. Если всё сложить и высчитать примерную стоимость отправки кому-нибудь в любую точку Земного шара по почте, затем разделить на 10 (кол-во плат) получим среднюю стоимость платы: 5$ с учётом того, что паять придётся самому, при желании можно отправить уже запаянную, но это дороже.

Краткий обзор оригинального ST-Link V2-1 в платах NUCLEO

Прежде чем разбирать самодельный ST-Link V2.1, взглянем на оригинальную схему принципиальную данного программатора входящего в состав платы NUCLEO и DISCOVERY:

Оригинальная схема электрическая принципиальная программатора ST-Link V2.1

Оригинальная схема электрическая принципиальная программатора ST-Link V2.1

Рассматривать схему здесь может быть неудобно, все материалы есть на GitHub.

Рассмотрим основные моменты:

  1. Собран на базе STM32F103CBT6. Версия «CB» использована потому, что у всем привычного «С8» не хватит памяти для загрузки прошивки «STM32+MSD+VCP». В дешёвый «С8» хорошо вмещается прошивка «STM32+STM8», чем успешно пользуются китайцы, делая свои дешёвые «свистки»;

  2. Интерфейс программирования: SWD;

  3. Подтяжка к +D (DP) шины USB делается через транзистор. Это сделано для возможности аппаратного переподключения программатора через USB. Это обычный кусок в схеме, но китайцы им не пользуются.

  4. Использован бедный разъём micro-USB без защиты от статического напряжения (об этом позже).

В целом всё, ничего особенного за исключением отсутствия возможности отладки по SWO.

Обзор самодельного ST-Link V2.1

1. Анализ схемы электрической принципиальной

За основу схемы электрической принципиальной был взят строенный в NUCLEO ST-Link. Что-то было скопировано, что-то добавлено или модифицировано:

Самодельный ST-Link V2.1

Самодельный ST-Link V2.1

Рассматривать схему здесь может быть неудобно, все материалы есть на GitHub.

Рассмотрим отличные особенности самодельного ST-Link V2.1:

  1. Разъём USB Type C с защитой от статического напряжения (вещь маленькая и копеечная, но стоит того);

  2. Есть поддержка VCP и добавлена индикация передачи данных по линии RX, TX;

  3. Добавлены диоды Шоттки на линию +5В и +3.3В для защиты от переполюсовки. Если нужно исключить диоды и падение напряжение, параллельно им добавлены перемычки;

  4. Имеется вывод SWO на краевом разъёме (printf теперь реальность);

  5. Имеется кнопка отключения программатора от ПК по линии USB.

Сравнение с аналогами

1. Достоинства и недостатки китайского ST-Link V2

Достоинства китайского ST-Link V2:

  1. Подходит для программирования STM32 и STM8;

  2. Дешёвый и легко доступный;

  3. И всё, прикиньте.

окончены

Недостатки китайского ST-Link V2:

  1. Отсутствие вывода SWO (Serial Wire Output). Любителей использовать внутренний терминал и функцию printf() увы данный программатор сильно разочарует, а у новичков нередко данный факт вызывал желение забросить изучение такой замечательной сфере деятельности.

  2. Отсутствие выводов под UART (Universal Asynchronous Receiver Transmitter): RX и TX. Отсюда следует, что Вам не доступен VCO (Virtual COM Port) и это на самом деле крик души, ибо это надёжный и удобный способ ввода/вывода информации. Тем более, особенно когда начинающие смотрят примеры в интернете, скорее пример кода написан на HAL с использованием функции HAL_UART_Transmit() для вывода информации в терминал. Увы…

  3. Очень неудобен в использовании: программатор нужно сразу втыкать в разъём компьютера (или придётся обзавестить хорошим экранированным USB-USB удлинителем). Далее ведём китайские проводки к микроконтроллеру, по пути 100500 раз их перекрещивая, поскольку выводы на программаторе растрассированы таким образом, что нельзя взять 4 провода и провести их эстетично напрямую к отладочной плате BluePill или BlackPill, или иной другой. Почему бы китайцам не установить разъём USB Type-C на программатор, чтобы можно было подключиться через длинный уже универсальный кабель, а также сделать нормальнную трассировку своего программатора.

    «C’mon, you sell thousands of st-links from AliExpress to all over the world and you can’t develop new better version? This will take about 2 hours at all, guys!»

    Random User

  4. Не оригинальный камень STM32 в 95% программаторах. Часто могут возникать проблемы с отказом ПК определить данный программатор по USB. Кроме этого китайцы часто отправляют уже бракованный программатор, не убедившись в его исправности перед отправкой. Более того, пайка и сборка корпуса данного программатора зачастую оставляет желать лучшего: может быть плохо запаен USB разъём, из-за чего при снятии металлического корпуса разъём будет болтаться, пока не оторвутся контактные площадки с дорожками.

2. Достоинства и недостатки оригинального ST-Link V2

Достоинства:

  1. Подходит для программирования STM32 и STM8;

  2. Доступно два интерфейса программирования: SWD и JTAG;

  3. Можно подключить через кабель mini-USB Type B к ПК.

Недостатки:

  1. Высокая цена (от 20$);

  2. Нет VSP, MSD и SWO.

  3. Разъём подключения mini-USB Type B без защиты от статического напряжения.

3. Достоинства и недостатки оригинального ST-Link V3

Достоинства:

  1. Подходит для программирования STM32 и STM8;

  2. Можно подключить через кабель micro-USB к ПК;

  3. Доступно два интерфейса программирования: SWD и JTAG;

  4. Доступен VCP.

Недостатки:

  1. Высокая цена (от 50$);

  2. Нет поддержки SWO;

  3. Разъём подключения micro-USB Type B без защиты от статического напряжения.

На запрос «Купить ST-Link V3 недорого» выбивиает это:

Смотреть другие источники не имеет смысла, на чип дип цена от 100$ до 200$ в других магазинах не лучше.

Прошивка программатора

На GitHub есть бутлоадер, скачиваете его и заливаете в камень через любой имеющийся ST-Link под рукой. Обновление программатора делаем по типу уже имеющихся статей на Хабр:

https://habr.com/ru/articles/442290/

Обновлени программатора

Обновлени программатора
Ожидание завершения обновления

Ожидание завершения обновления

Подведение итогов

В целом всё, все материалы есть на GitHub: схема принципиальная, гербер файлы, бутлоадер, драйвера и установочник ST-Link Utility v4.3, по схеме и фотографиям видны элементы, которые нужно установить.

Я не стал забивать статью кучей разной информацией, поскольку тема не является сложной, а по материлам на GitHub понятны особенности программатора, методика изготовления и отладки. Кроме всего я добавил файл корпуса для печати на 3Д принтере. Выглядит он так:

Существует более свежая версия данного программатора от того же автора, я лично ей не пользовался, она ничем не отличается от этой, краевым разъёмом. На мой взгляд описываемая версия будет удобнее своим краевым разъёмом. Вот ссылка для сравнения.

Если вам чего-то не хватает в данной статье, пишите комментарии я дополню её дополнительными главами при необходимости.

P.S. Данная статья не вышла бы, если бы не просьба моих читателей. Спасибо за вашу активность!

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Каким программатором пользуетесь Вы?

18.56% Оригинальный ST-Link V236

62.37% Китайский ST-Link V2121

21.65% Используете плату NUCLEO или DISCOVERY с встроенным ST-Link42

10.31% Прошиваете через USB в режиме DFU20

11.86% Прошиваете через UART23

9.79% Собираюсь сделать себе описываемый программатор в статье19

Проголосовали 194 пользователя. Воздержались 17 пользователей.

ST-LINK/V2 это внутрисхемный отладчик и программатор для микроконтроллеров STM8 и STM32. Однопроводный интерфейс (single wire interface module, SWIM) и JTAG/SWD (SWD это сокращение от serial wire debugging) реализуют коммуникацию с любым микроконтроллером STM8 или STM32, работающим на плате конечной системы.

В дополнение к функционалу ST-LINK/V2, новая версия ST-LINK/V2-ISOL реализует изоляцию цифрового интерфейса между PC и целевой программируемой платой. Изоляция выдерживает напряжения до 1000 VRMS.

Интерфейс USB full-speed осуществляет обмен между компьютером PC разработчика и:

• Устройствами STM8 через ПО ST Visual Develop (STVD) или ST Visual Program (STVP). Это ПО поставляется компанией STMicroelectronics (ST).
• Устройствами STM32 в средах разработки Atollic®, IAR™, Keil® и TASKING®.

Рис. 1. Отладчики ST-LINK/V2 и ST-LINK/V2-ISOL.

Отладчик ST-LINK также встроен в оценочные платы разработчика STM32Fxxx Discovery [2]. Вот так выглядит отладчик ST-LINK/V2-B на плате STM32F429 Discovery (компоненты отладчика выделены желным прямоугольником):

Функциональные возможности ST-LINK:

• Питание 5V подается от хоста PC через коннектор USB.

• Подключение USB 2.0 full speed через кабель USB standard A — Mini-B.

• Функции интерфейса отладки SWIM:

   – поддерживаются уровни от 1.65V до 5.5V;
   – поддерживаются режимы скорости SWIM low-speed и high-speed;
   – скорость программирования: 9.7 килобайт/сек на low speed и 12.8 килобайт/сек на high speed;
   – подключение к отлаживаемой плате осуществляется через кабель стандартный вертикальный ERNI (ref: 284697 или 214017) или горизонтальный (ref: 214012), либо через коннектор со стандартным шагом выводов 2.54 мм.

• Функции интерфейса отладки JTAG/SWD:

   – поддерживаются уровни 1.65V .. 3.6V на выходах, и входы допускают напряжения до 5V (5V tolerant inputs);
   – 20-выводный JTAG кабель с шагом выводов 2.54 мм;
   – поддерживаются коммуникации JTAG, SWD и SWV.

• Поддерживается непосредственное обновление прошивки (Direct Firmware Update, DFU).

• Светодиоды состояния (Status LED), которые мигают во время обмена с PC.

• Рабочий диапазон температур 0 .. 50°C.

Таблица 1. Информация для закупки.

Order code Описание варианта ST-LINK

ST-LINK/V2 Внутрисхемный отладчик/программатор.

ST-LINK/V2-ISOL Внутрисхемный отладчик/программатор с гальванической развязкой.

[Что входит в комплект отладчика]

Поставляемые компоненты показаны на рис. 2 и рис. 3. Это следующие элементы (перечислены слева направо):

• Стандартный кабель USB A — USB Mini-B (A).
• Отладчик ST-LINK/V2 (B).
• Коннектор SWIM (C).
• Плоский кабель SWIM со стандартным коннектором ERNI (D).
• Плоский кабель JTAG или SWD и SWV flat ribbon with a 20-pin connector (E).

ST LINK V2 product contents fig02

Рис. 2. Комплект ST-LINK/V2.

ST LINK V2 ISOL product contents fig03

Рис. 3. Комплект ST-LINK/V2-ISOL.

[Конфигурирование]

ST-LINK/V2 разработан на микроконтроллере STM32F103C8 (высокопроизводительное ядро Arm®(a) Cortex®-M3). Он доступен в корпусе TQFP48. Как показано на рис. 4, у ST-LINK/V2 есть два коннектора:

• Коннектор STM32 для интерфейса JTAG/SWD и SWV.
• Коннектор STM8 для интерфейса SWIM.

У ST-LINK/V2-ISOL один коннектор для интерфейсов STM8 SWIM, STM32 JTAG/SWD и SWV.

ST LINK connectors fig04

Рис. 4. Коннекторы ST-LINK/V2 (слева) и ST-LINK/V2-ISOL (справа).

A: Коннектор STM32 JTAG и SWD для подключения к целевой плате.
B: Коннектор STM8 SWIM для подключения к целевой плате.
C: Коннектор STM8 SWIM, STM32 JTAG и SWD для подключения к целевой плате.
D: светодиод, показывающий активный обмен.

Для разработки приложений на микроконтроллерах STM8 отладчик ST-LINK/V2 можно подключить к целевой плате двумя разными кабелями, в зависимости от того, какой коннектор установлен на плате устройства. Это следующие кабели:

• Плоский кабель SWIM, на одном из концов которого стоит стандартный коннектор ERNI.
• 4-контактный кабель SWIM с шагом 2.54 мм или кабель SWIM с отдельными проводами.

На рис. 5 показано, как подключить ST-LINK/V2, если на целевой плате находится стандартный коннектор ERNI 4-pin SWIM.

ST LINK ERNI connection fig05

Рис. 5. Соединение ERNI.

A: целевая плата системы с коннектором ERNI.
B: кабель с коннектором ERNI.
C: целевой коннектор STM8 SWIM.

Также см. рис. 11 во врезке «Дополнительная техническая информация».

Рис. 6 показывает, что на целевом коннекторе ST-LINK/V2-ISOL вывод 16 отсутствует. Этот отсутствующий вывод используется как ключ безопасности коннектора, гарантирующий правильную ориентацию коннектора SWIM при подключении. Этот ключ безопасности используется на кабелях SWIM и JTAG.

Рис. 6. Ключ безопасности на коннекторах.

Дешевый вариант SWIM-подключения. Рис. 7 показывает, как подключить ST-LINK/V2, если на плате стоит 4-выводный коннектор с шагом выводов 2.54 мм.

ST LINK low cost connection fig07

Рис. 7. Недорогое SWIM-подключение.

A: целевая плата системы, на которой установлен коннектор с шагом выводов 2.54 мм.
B: 4-проводный кабель, или подключение отдельными проводами.
C: целевой коннектор STM8 SWIM.

Также см. рис. 12 во врезке «Дополнительная техническая информация».

Сигналы и соединения SWIM. Таблица 2 дает общее описание SWIM: имена сигналов, функции и сигналы целевой платы при использовании 4-проводного кабеля и 4-выводного коннектора.

Таблица 2. SWIM-соединение с ST-LINK/V2.

Pin Имя сигнала Функция Соединение с целевой платой
1 VDD VCC целевой платы(1) VCC микроконтроллера
2 DATA SWIM Вывод SWIM микроконтроллера
3 GND Земля GND
4 RESET Сброс Вывод RESET микроконтроллера

Примечание (1): источник питания целевой платы подключен к плате отладчика ST-LINK/V2 для гарантии совместимости уровней между платой и отладчиком.

Рис. 8. Целевой коннектор SWIM.

Таблица 3 показывает имена сигналов, функции и соединения сигналов с целевой платой при использовании кабеля с отдельными проводами. Поскольку у кабеля SWIM с отдельными проводами есть независимые коннекторы для каждого сигнала, то можно подключить ST-LINK/V2-ISOL к целевой плате, на которой нет стандартного SWIM-коннектора. На таком плоском кабеле все сигналы имеют разные цвета и отдельную метку, что упрощает подключение к целевой системе.

Таблица 3. Соединения ST-LINK/V2-ISOL недорогим кабелем SWIM.

Цвет Имя сигнала кабеля Функция Соединение с целевой платой
Красный TVCC VCC целевой платы(1) VCC микроконтроллера
Зеленый UART-RX Не используется Зарезервировано(2) (не подключается к целевой плате)
Синий UART-TX
Желтый BOOT0
Оранжевый SWIM SWIM Вывод SWIM микроконтроллера
Черный GND Земля GND
Белый SWIM-RST RESET Вывод RESET микроконтроллера

Примечания:

(1) Источник питания целевой платы подключен к плате отладчика ST-LINK/V2 для гарантии совместимости уровней между платой и отладчиком.
(2) BOOT0, UART-TX и UART-RX зарезервированы для использования в будущих разработках.

TVCC, SWIM, GND и SWIM-RST могут быть подключены дешевым коннектором с шагом 2.54 мм, установленным на целевой плате.

Для разработки программ на основе микроконтроллеров STM32 отладчик ST-LINK/V2 должен быть подключен к целевой системе стандартным 20-выводным плоским кабелем JTAG.

Таблица 4 показывает имена сигналов, функции и соединения сигналов с целевой платой при использовании стандартного 20-выводного кабеля JTAG.

Таблица 4. Соединения кабелем JTAG/SWD.

Pin Коннектор ST-LINK/V2 (CN3) Функция ST-LINK/V2 Соединение с целевой платой JTAG Соединение с целевой платой SWD
1 VAPP VCC целевой платы
VDD микроконтроллера(1) VDD микроконтроллера(1)
2
3 TRST TRST JTAG JNTRST GND(2)
4 GND(3) GND(3) GND(3)(4) GND(3)(4)
5 TDI JTAG TDO JTDI GND(2)
6 GND(3) GND(3) GND(3)(4) GND(3)(4)
7 TMS_SWDIO JTAG TMS, SWDIO JTMS SWDIO
8 GND(3) GND(3) GND(3)(4) GND(3)(4)
9 TCK_SWCLK JTAG TCK, SWCLK JTCK SWCLK
10 GND(5) GND(5) GND(4)(5) GND(4)(5)
11 Не подключено
12 GND GND GND(4) GND(4)
13 TDO_SWO JTAG TDI, SWO JTDO TRACESWO(6)
14 GND(5) GND(5) GND(4)(5) GND(4)(5)
15 NRST NRST NRST NRST
16 GND(3) GND(3) GND(3)(4) GND(3)(4)
17 Не подключено
18 GND GND GND(4) GND(4)
19 VDD(3) VDD (3.3 V)(3) Не подключено
20 GND GND GND(4) GND(4)

Примечания:

(1) источник питания целевой платы подключен к плате отладчика ST-LINK/V2 для гарантии совместимости уровней между платой и отладчиком.
(2) Подключается к GND для снижения шума в кабеле.
(3) Доступно только на ST-LINK/V2, не подключено на ST-LINK/V2-ISOL.
(4) Для правильной работы как минимум один вывод должен быть подключен к земле (рекомендуется подключить все).
(5) GND ST-LINK/V2, используемый SWIM на ST-LINK/V2-ISOL (см. таблицу 3).
(6) Опционально: для трассировки Serial Wire Viewer (SWV).

Рис. 9 показывает, как соединить ST-LINK/V2 с целевой системой кабелем JTAG.

ST LINK JTAG and SWD connection fig09

Рис. 9. Соединение JTAG и SWD.

A: целевая отлаживаемая плата с коннектором JTAG.
B: плоский 20-выводный кабель JTAG/SWD.
C: целевой коннектор STM32 JTAG и SWD.

Рис. 10. Нумерация выводов коннектора JTAG (вид на контакты коннектора с верхней стороны платы).

Для некоторых систем стандартный 20-выводный коннектор с шагом выводов 2.54 мм слишком велик, и разработчики часто предпочитают коннектор с уменьшенным количеством выводов (например 10 контактов вместо 20). Для отладчиков ST-LINK/V2 или ST-LINK/V2-ISOL есть адаптер Tag-Connect и кабель, упрощающие подключение отладчика к целевой плате без необходимости установки на плату большого разъема.

Для дополнительной информации об этом решении и цоколевке посетите сайт www.tag-connect.com. Компоненты, совместимые с интерфейсами JTAG и SWD:

a) Адаптер TC2050-ARM2010 (переходник 20 в 10 выводов).
b) TC2050-IDC или TC2050-IDC-NL (No Legs, без ножек), 10-выводный кабель.
c) TC2050-CLIP с клипсой для использования с TC2050-IDC-NL (опционально).

Индикационный светодиод ST-LINK/V2. Светодиод, помеченный «COM» на верхней стороне ST-LINK/V2, показывает его состояние (независимо от типа соединения):

• Светодиод мигает красным: происходит энумерация USB на хосте PC.
• Светодиод красный: установлено соединение между PC и ST-LINK/V2 (энумерация закончилась).
• Светодиод мигает зеленым/красным: идет обмен между целевой платой и PC.
• Светодиод зеленый: последнее соединение прошло успешно.
• Светодиод оранжевый: обмен ST-LINK/V2 с целевой платой был неудачным.

[Обновление прошивки]

В ST-LINK/V2 встроен механизм обновления прошивки отладчика (firmware) через порт USB. Поскольку firmware во время жизни продукта ST-LINK/V2 может развиваться (новый функционал, исправление ошибок, добавление поддержки новых семейств микроконтроллеров, …), то рекомендуется периодически посещать специальные странички www.st.com, чтобы следить за появлением свежей версии firmware.

[Средства разработки]

Для STM8. См. ST toolset Pack24 с патчем 1 или более свежий, который включает в себя ST Visual Develop (STVD) и ST Visual Programmer (STVP).

Для STM32 и программирования Flash. Инструментарий сторонних производителей: Atollic® TrueSTUDIO®, IAR™ EWARM, Keil® MDK-ARM™ и TASKING® VX-toolset поддерживают ST-LINK/V2 в соответствии с версиями, как это показано в таблице 5.

Таблица 5. Поддержка сторонними разработчиками ST-LINK/V2.

Разработчик Тулчейн/IDE Версия
Atollic® TrueSTUDIO® 2.1
IAR™ EWARM 6.20
Keil® MDK-ARM™ 4.20
TASKING® VX-toolset for Arm® Cortex®-M 4.0.1

Отладчик ST-LINK/V2 требует для себя специального драйвера USB. Если установленный инструментарий также устанавливает этот драйвер автоматически, то он записывает файл stlink_winusb.inf в каталог inf папки Windows.

Если инсталлятор не устанавливает драйвер, то драйвер можно найти на сайте www.st.com:

1. Откройте в браузере страничку www.st.com.
2. На закладке «Поиск» (search), в поле part number найдите ST-LINK/V2.
3. Кликните на ссылку в столбце Generic Part Number для ST-LINK/V2.
4. На закладке «Design support», в секции «SW drivers» кликните на иконку загрузки, чтобы загрузить архив с драйвером (файл с именем наподобие en.stsw-link009.zip).
5. Распакуйте и запустите инсталлятор dpinst_x86.exe или dpinst_amd64.exe в зависимости от 32-битной или 64-битной версии операционной системы Windows.

ST LINK V2 SWIM standard ERNI cable fig11

Рис. 11. Стандартный кабель SWIM ST-LINK/V2 с коннектором ERNI.

ST LINK V2 SWIM low cost cable fig12

Рис. 12. Дешевый кабель SWIM ST-LINK/V2.

VDD: сигнал для определения напряжения питания целевой платы.
DATA: сигнал данных SWIM DATA для обмена между целевой платой и отладчиком.
GND: напряжение земли.
RESET: сигнал сброса целевой платы.

[Ссылки]

1. UM1075 User manual ST-LINK/V2 in-circuit debugger/programmer for STM8 and STM32 site:st.com.
2. STM32F429 Discovery.

разделы: STM32 , STM32duino , среда разработки , дата: 14 октября 2016г.

рекомендуется к прочтению

Архитектуру STM32 можно мысленно разделить на две части. Первая часть, это ядро Cortex-M3, которое спроектировали в ARM и которое примерно одинаковое для всех. «Примерно», потому что, содержит опциональные модули которые могут быть у одного производителя и отсутствовать у другого. Вторая часть, это периферия знакомая по STM8, с тем отличием, что был добавлен USB2.0 интерфейс, хотя точнее было бы сказать, что этот интерфейс был «откручен» от STM8(такая у STM политика: хочешь аппаратный USB, используй STM32).

    Справочники и руководства которые нужны для работы c STM32F103x8/STM32F103xB:

  1. Справочное руководство по 32-битным микроконтроллерам серий STM32F10x Reference Manual. STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced ARM®-based 32-bit MCUs
    или RM 0008
  2. Руководство на чипы STM32F103x8/STM32F103xB STM32F103x8 STM32F103xB Medium-density performance line ARM®-based 32-bit MCU with 64 or 128 KB Flash, USB, CAN, 7 timers, 2 ADCs, 9 com. interfaces
  3. Ядро Cortex — МЗ компании ARM. Полное руководство. Книга не обязательная, но на мой взгляд очень полезная.
    Небльшой ликбез по ARM и Cortex-M3 в частности:

  • Cortex-M3 основан на архитектуре ARMv7 и является усеченным вариантом архитектуры ARMv7 специально для микроконтроллеров. По сравнению с полноценным ЦПУ Cortex-A, здесь отсутствует кеш и 32-битный альтернативный набор команд ARM. Также могут отсутствовать некоторые модули, такие как модуль зашиты памяти — MPU (Memory Protect Unit).
  • Cortex-M3 включает в себя 16-битный набор команд, оптимизированный для систем с малым объемом памяти, Thumb и 32-битный дополнительный набор Thumb-2. Здесь 16-битная команда означает, что ее двоичное представление будет занимать в памяти 16-бит, т.е. она более компактная. Программный код может состоять из произвольного набора 16-битных команд Thumb и 32-битных Thumb 2.
  • В Cortex-M3 имеется аппаратное деление и умножение. Урезанная, удешевленная версия Cortex-M0 базируется на архитектуре ARMv6 и таких инструкций не имеет. ARMv6 отличается от ARMv7 отсутствием набора инструкций Thumb-2. Cortex-M4, напротив, дополнен DSP модулем, а Cortex-M4F также включает в себя FPU модуль, т.е. он аппаратно поддерживает числа с плавающей запятой.
  • Номера процессоров ARM никак не согласованы с версиями архитектур. Процессоры ARM11 имеют архитектуру ARMv6, а ARM9 имели архитектуру ARMv4.
  • Cortex-M3 имеет единую адресную 32-битную шину, которая может адресовать 4Гб памяти. Процессор построен по гарвардской архитектуре и имеет отдельные шины для памяти данных SRAM и памяти программ Flash. Программа может быть запущена из SRAM, тогда будет задействована только одна шина и код будет выполняться медленнее.
  • Cortex-M3 имеет шестнадцать 32-битных РОН (регистров общего назначения) R0-R15. Команды из набора инструкций Thumb могут обращаться только к регистрам R0-R7. Команды из набора Thumb-2 могут обращаться ко всем регистрам. При этом, регистр r13 — это указатель стека, r14 — регистр связи(хранит адрес возврата из подпрограммы), r15 — счетчик команд.

Немного о STM32:

Выпускаемые линейки микроконтроллеров изображены на следующей картинке:

Это не полный перечень, но представление давать должен. Кроме линеек, микроконтроллеры делятся по размерам flash-памяти. Чем больше flash-пямять, тем больше остальной периферии. Для 103-й линейки это выглядит так:

Блок-схема устройства STM32F103 представлена на картинке ниже:

Во всем этом хозяйстве нас будет больше всего интересовать периферия подключенная к периферийным шинам APB1 и APB2. Также полезно будет запомнить внутреннюю шину AHB.

Имеющаяся в чипах периферия перечислена в следующей табличке:

Выбор «железа»

Чип который у меня оказался под рукой — STM32F103CBT6 запаянный в плату Maple Mini:

 

Заказав его год назад на Али, я ради интереса загрузил в него несколько скетчей, и набалововшись бросил на полку. За этот год проект Leaf Maple накрылся медным тазом, сайт поменял содержимое, а поддержку железа передали на следующий форум: STM32 for Arduino. Я особо не расстроился, т.к. не питал особых надежд на этот проект, и планировал плату использовать для Си-программирования.

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

Если у кого-то имеется под рукой «Blue Pill», то это не беда, там установлен чип STM32F103C8T6 который от STM32F103CBT6 отличается только уменьшенным до 64кБ размером flash-памяти. Еще там светодиод подключен на PC13, в то время как на MapleMini он на PB1, и кроме этого у Maple Mini имеется кнопка на PB8.

Зато на «Blue Pill» имеется штыревой разъем для подключения программатора ST-LINK, в то время как Maple Mini нужно устанавливать в макетку что бы прошить по SWD. Прозвонкой чипа было выяснено, что на Mapple Mini SWDIO контакт «висит» на 22-pin, а SWCLK на 21-м. Но заставить работать ST-LINK с Maple Mini оказалось не просто.

Прошивка чипов через программатор ST-LINK v2

STM32 можно прошить либо через UART встроенным загрузчиком, либо через SWD-интерфейс программатором ST-LINK. Меня интересовал второй вариант, т.к. был скромным владельцем клона ST-LINK v2.

В Windows прошить STM32 через ST-LINK можно воспользовавшись фирменной утилитой «STM32 ST-LINK Utility», или непосредственно из среды разработки IAR for ARM. В Linux можно воспользоваться консольной утилитой sy-flash.

Если у вас «Blue Pill» или еще какая-либо плата отличная от Leaf Maple, то никаких проблем не будет, их можно сразу прошивать. Моя же Maple Mini никак не хотела видеться программатором, пока я не догадался во время загрузки программы из IAR в чип, несколько раз нажать на кнопку Reset на плате. После чего Maple Mini начала свободно прошиваться, но родной USB-загрузчик был на этом этапе потерт. Но это мелочи.

Ок. Посмотрим как чипы прошиваются в Windows. Войдя на сайт http://my.st.com и залогинившись, введем в строку поиска «st-link». На выходе получим такую табличку:

Щелкнув мышкой по второй строчке и промотав открывшуюся страницу книзу, увидим список предлагаемого ПО для программатора:

STSW-LINK004 — это утилита для прошивки STM32 чипов. STSW-LINK007 утилита для обновления прошивки программатора, STSW-LINK009 — драйвера для различных версий Windows. Немного выше предлагаются свежие прошивки для самого программатора. ST-LINK v2.

Как установить драйвер для ST-LINK v2 я рассказывал здесь: STM8 + IAR + ST-LINK2: программирование, прошивка и отладка из под Windows, поэтому далее будем считать, что драйвер уже установлен.

После установки и запуска «STM32 ST-LINK Utility» следует подключить ST-LINK v2 к компьютеру или виртуальной машине(мой случай), а к ST-LINK в свою очередь, должен быть подключен чип который следует прошить:

После чего следует пройти по меню: «меню-> Target — > Settings…» и должно появится такое окно:

Во-первых, сам программатор ST-LINK V2 должен быть опознан программой, показана версия его прошивки. Во-вторых должен быть опознан чип подключенный к программатору. В третьих, рабочий протокол должен быть установлен как SWD, а не JTAG.

Когда я впервые воткнул ST-LINK полученный год назад с Али, мне вместо номера прошивки показывало что-то вроде «Old firmware», поэтому мне пришлось воспользоваться утилитой обновления прошивки ST-LINK, что бы флешеры нормально работали с моим клоном ST-LINK. К сожалению у меня не сохранились скрины.

Здесь у меня изначальная версия прошивки(цифра после буквы J) была то ли 20, то ли 21. В итоге меня обновили то текущей версии. Кстати, из под виртуальной машины обновляется прошивка без проблем.

Вернемся к STM32 ST-LINK Utility. После нажатия кнопки «Ок» в окне «Settings», появится рабочее окно программы:

Следует запомнить, что стартовый адрес флеш-памяти начинается с 0x08000000. Встроенная оперативка начинается c 0x20000000. Чтобы программа стартовала с оперативки, контакты boot0 и boot1 должны быть сконфигурированы специальным образом.

Щелкнув по вкладке «binary file» можно выбрать файл с прошивкой, затем пройдя по «меню->Target->Program…» эту прошивку можно прошить в микроконтроллер:

Наряду со знакомым форматом прошивок HEX, в stm32 широко используется бинарный raw-формат «*.bin».

Через меню «File->Save As» можно сохранить прошивку чипа в файл:

Если честно, слить пошивку с чипа и потом залить ее обратно так, чтобы она работала, мне не удалось. Нужно будет разбираться.

Еше интересной штукой являются Option Bytes знакомые по STM8:

Пока не будем их трогать.

Теперь, что касается st-flash для Linux, то там с одной стороны все проще, а с другой — сложнее. Сложнее, потому что глючит. Может к этим глюкам как-то можно привыкнуть, но я пока не сумел.

darkstar:~: st-flash
invalid command line
stlinkv1 command line: ./st-flash [--debug] [--reset] [--format ] {read|write} /dev/sgX   
stlinkv1 command line: ./st-flash [--debug] /dev/sgX erase
stlinkv2 command line: ./st-flash [--debug] [--reset] [--serial ] [--format ] {read|write}   
stlinkv2 command line: ./st-flash [--debug] [--serial ] erase
                       Use hex format for addr,  and .
                       Format may be 'binary' (default) or 'ihex', although  must be specified for binary format only.

удачная прошивка:

 st-flash write ./blink.bin  0x08000000
2016-10-11T09:02:47 INFO /home/flanker/mydev/tools/stlink/src/common.c: Loading device parameters....
2016-10-11T09:02:47 INFO /home/flanker/mydev/tools/stlink/src/common.c: Device connected is: F1 Medium-density device, id 0x20036410
2016-10-11T09:02:47 INFO /home/flanker/mydev/tools/stlink/src/common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 1024 bytes
2016-10-11T09:02:47 INFO /home/flanker/mydev/tools/stlink/src/common.c: Attempting to write 5832 (0x16c8) bytes to stm32 address: 134217728 (0x8000000)
Flash page at addr: 0x08001400 erased
2016-10-11T09:02:48 INFO /home/flanker/mydev/tools/stlink/src/common.c: Finished erasing 6 pages of 1024 (0x400) bytes
2016-10-11T09:02:48 INFO /home/flanker/mydev/tools/stlink/src/common.c: Starting Flash write for VL/F0/F3 core id
2016-10-11T09:02:48 INFO /home/flanker/mydev/tools/stlink/src/flash_loader.c: Successfully loaded flash loader in sram
  5/5 pages written
2016-10-11T09:02:49 INFO /home/flanker/mydev/tools/stlink/src/common.c: Starting verification of write complete
2016-10-11T09:02:49 INFO /home/flanker/mydev/tools/stlink/src/common.c: Flash written and verified! jolly good!

неудачная прошивка:

 st-flash write ./blink.bin  0x08000000  
2016-10-11T09:05:50 INFO /home/flanker/mydev/tools/stlink/src/common.c: Loading device parameters....
2016-10-11T09:05:50 INFO /home/flanker/mydev/tools/stlink/src/common.c: Device connected is: F1 Medium-density device, id 0x20036410
2016-10-11T09:05:50 INFO /home/flanker/mydev/tools/stlink/src/common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 1024 bytes
2016-10-11T09:05:50 INFO /home/flanker/mydev/tools/stlink/src/common.c: Attempting to write 5832 (0x16c8) bytes to stm32 address: 134217728 (0x8000000)
Flash page at addr: 0x08001400 erased
2016-10-11T09:05:50 INFO /home/flanker/mydev/tools/stlink/src/common.c: Finished erasing 6 pages of 1024 (0x400) bytes
2016-10-11T09:05:50 INFO /home/flanker/mydev/tools/stlink/src/common.c: Starting Flash write for VL/F0/F3 core id
2016-10-11T09:05:50 INFO /home/flanker/mydev/tools/stlink/src/flash_loader.c: Successfully loaded flash loader in sram
2016-10-11T09:06:56 ERROR /home/flanker/mydev/tools/stlink/src/flash_loader.c: flash loader run error
2016-10-11T09:06:56 ERROR /home/flanker/mydev/tools/stlink/src/common.c: stlink_flash_loader_run(0x8000000) failed! == -1
stlink_fwrite_flash() == -1

Пока я обнаружил такую закономерность, команда очистки флеш-памяти «st-flash erase» помогает избавиться от глюков:

Программирование STM32 с помощью IAR и SPL в Windows

Если на сайте http://my.st.com ввести в строку поиска «stm32f10x standard peripheral library» то нам предложат скачать SPL для чипов STM32F10x:

В отличии от SPL для STM8, библиотека разделена на CMSIS и саму SPL. CMSIS (Cortex® Microcontroller Software Interface Standard) — это стандарт описания периферии микроконтроллера, то что в STM8 размещалось в файлах stm8s.h/stm8l.h

Подключить SPL к IAR достаточно просто, в сети множество видео и пошаговых инструкций. Я лично делал по этому видео:
STM32 Discovery IAR and StdPeriph Lib настройка и загрузка проекта

Исходник Blink:

#include "stm32f10x.h"
void  dummy_loop(uint32_t count){
  while(--count);
}

int main()
{
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  
  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

  for(;;){
     GPIO_SetBits(GPIOB,GPIO_Pin_1);
     dummy_loop(600000);
     GPIO_ResetBits(GPIOB,GPIO_Pin_1);
     dummy_loop(600000);

}

Проект компилируется и заливается в чип, после чего успешно работает. Наверное больше и не надо, но я предлагаю забрать результирующий объектный файл с расширением *.out и перенести его в Linux, для внимательного изучения:

Программирование STM32 с помощью Eclipse и SPL в Linux

В Linux попробуем посмотреть, что за файл генерирует на выходе IAR:

$ file  ./first_project.out
./first_project.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped

Как видим, это обыкновенный эльф. Смотрим дальше:

$ arm-none-eabi-readelf ./first_project.out -A
Attribute Section: aeabi
File Attributes
  Tag_conformance: "2.10"
  Tag_CPU_arch: v7
  Tag_CPU_arch_profile: Microcontroller
  Tag_THUMB_ISA_use: Thumb-2
  Tag_PCS_config: Bare platform
  Tag_ABI_align_needed: 8-byte
  Tag_ABI_align_preserved: 8-byte, except leaf SP
  Tag_ABI_enum_size: small
  Tag_ABI_VFP_args: compatible
  Tag_CPU_unaligned_access: v6
  Tag_DIV_use: Not allowed

Из «эльфа» мы всегда можем получить файл прошивки в HEX формате:

arm-none-eabi-objcopy ./first_project.out -O ihex ./first_project.hex

или бинарный файл:

arm-none-eabi-objcopy ./first_project.out -O binary ./first_project.bin

Также можно посмотреть ассемблерный код:

$ arm-none-eabi-objdump ./first_project.out -S > ./first_project.asm

показать ассемблерный код

./first_project.out:     file format elf32-littlearm


Disassembly of section A0 rw:

08000000 <__vector_table>:
 8000000:   00 08 00 20 d9 01 00 08 a7 01 00 08 a9 01 00 08     ... ............
 8000010:   ab 01 00 08 ad 01 00 08 af 01 00 08 00 00 00 00     ................
    ...
 800002c:   b1 01 00 08 b3 01 00 08 00 00 00 00 b5 01 00 08     ................
 800003c:   b7 01 00 08                                         ....

Disassembly of section P1 ro:

08000040 <GPIO_Init>:
 8000040:   b470        push    {r4, r5, r6}
 8000042:   2200        movs    r2, #0
 8000044:   2500        movs    r5, #0
 8000046:   2300        movs    r3, #0
 8000048:   2600        movs    r6, #0
 800004a:   2400        movs    r4, #0
 800004c:   2500        movs    r5, #0
 800004e:   78ca        ldrb    r2, [r1, #3]
 8000050:   f012 020f   ands.w  r2, r2, #15
 8000054:   78cb        ldrb    r3, [r1, #3]
 8000056:   06db        lsls    r3, r3, #27
 8000058:   d501        bpl.n   800005e <GPIO_Init+0x1e>
 800005a:   788b        ldrb    r3, [r1, #2]
 800005c:   431a        orrs    r2, r3
 800005e:   780b        ldrb    r3, [r1, #0]
 8000060:   061b        lsls    r3, r3, #24
 8000062:   d021        beq.n   80000a8 <GPIO_Init+0x68>
 8000064:   6804        ldr r4, [r0, #0]
 8000066:   2300        movs    r3, #0
 8000068:   e006        b.n 8000078 <GPIO_Init+0x38>
 800006a:   78cd        ldrb    r5, [r1, #3]
 800006c:   2d48        cmp r5, #72 ; 0x48
 800006e:   d102        bne.n   8000076 <GPIO_Init+0x36>
 8000070:   2501        movs    r5, #1
 8000072:   409d        lsls    r5, r3
 8000074:   6105        str r5, [r0, #16]
 8000076:   1c5b        adds    r3, r3, #1
 8000078:   2b08        cmp r3, #8
 800007a:   d214        bcs.n   80000a6 <GPIO_Init+0x66>
 800007c:   2501        movs    r5, #1
 800007e:   fa15 f603   lsls.w  r6, r5, r3
 8000082:   880d        ldrh    r5, [r1, #0]
 8000084:   4035        ands    r5, r6
 8000086:   42b5        cmp r5, r6
 8000088:   d1f5        bne.n   8000076 <GPIO_Init+0x36>
 800008a:   009e        lsls    r6, r3, #2
 800008c:   250f        movs    r5, #15
 800008e:   40b5        lsls    r5, r6
 8000090:   43ac        bics    r4, r5
 8000092:   fa12 f506   lsls.w  r5, r2, r6
 8000096:   432c        orrs    r4, r5
 8000098:   78cd        ldrb    r5, [r1, #3]
 800009a:   2d28        cmp r5, #40 ; 0x28
 800009c:   d1e5        bne.n   800006a <GPIO_Init+0x2a>
 800009e:   2501        movs    r5, #1
 80000a0:   409d        lsls    r5, r3
 80000a2:   6145        str r5, [r0, #20]
 80000a4:   e7e7        b.n 8000076 <GPIO_Init+0x36>
 80000a6:   6004        str r4, [r0, #0]
 80000a8:   880b        ldrh    r3, [r1, #0]
 80000aa:   2bff        cmp r3, #255    ; 0xff
 80000ac:   dd26        ble.n   80000fc <GPIO_Init+0xbc>
 80000ae:   6844        ldr r4, [r0, #4]
 80000b0:   2300        movs    r3, #0
 80000b2:   e020        b.n 80000f6 <GPIO_Init+0xb6>
 80000b4:   2501        movs    r5, #1
 80000b6:   f113 0608   adds.w  r6, r3, #8
 80000ba:   fa15 f606   lsls.w  r6, r5, r6
 80000be:   880d        ldrh    r5, [r1, #0]
 80000c0:   4035        ands    r5, r6
 80000c2:   42b5        cmp r5, r6
 80000c4:   d116        bne.n   80000f4 <GPIO_Init+0xb4>
 80000c6:   009e        lsls    r6, r3, #2
 80000c8:   250f        movs    r5, #15
 80000ca:   40b5        lsls    r5, r6
 80000cc:   43ac        bics    r4, r5
 80000ce:   fa12 f506   lsls.w  r5, r2, r6
 80000d2:   432c        orrs    r4, r5
 80000d4:   78cd        ldrb    r5, [r1, #3]
 80000d6:   2d28        cmp r5, #40 ; 0x28
 80000d8:   d104        bne.n   80000e4 <GPIO_Init+0xa4>
 80000da:   2501        movs    r5, #1
 80000dc:   f113 0608   adds.w  r6, r3, #8
 80000e0:   40b5        lsls    r5, r6
 80000e2:   6145        str r5, [r0, #20]
 80000e4:   78cd        ldrb    r5, [r1, #3]
 80000e6:   2d48        cmp r5, #72 ; 0x48
 80000e8:   d104        bne.n   80000f4 <GPIO_Init+0xb4>
 80000ea:   2501        movs    r5, #1
 80000ec:   f113 0608   adds.w  r6, r3, #8
 80000f0:   40b5        lsls    r5, r6
 80000f2:   6105        str r5, [r0, #16]
 80000f4:   1c5b        adds    r3, r3, #1
 80000f6:   2b08        cmp r3, #8
 80000f8:   d3dc        bcc.n   80000b4 <GPIO_Init+0x74>
 80000fa:   6044        str r4, [r0, #4]
 80000fc:   bc70        pop {r4, r5, r6}
 80000fe:   4770        bx  lr

08000100 <GPIO_SetBits>:
 8000100:   b289        uxth    r1, r1
 8000102:   6101        str r1, [r0, #16]
 8000104:   4770        bx  lr

08000106 <GPIO_ResetBits>:
 8000106:   b289        uxth    r1, r1
 8000108:   6141        str r1, [r0, #20]
 800010a:   4770        bx  lr

0800010c <dummy_loop>:
 800010c:   1e40        subs    r0, r0, #1
 800010e:   2800        cmp r0, #0
 8000110:   d1fc        bne.n   800010c <dummy_loop>
 8000112:   4770        bx  lr

08000114 <main>:
 8000114:   b580        push    {r7, lr}
 8000116:   2101        movs    r1, #1
 8000118:   2008        movs    r0, #8
 800011a:   f000 f821   bl  8000160 <RCC_APB2PeriphClockCmd>
 800011e:   2002        movs    r0, #2
 8000120:   f8ad 0000   strh.w  r0, [sp]
 8000124:   2003        movs    r0, #3
 8000126:   f88d 0002   strb.w  r0, [sp, #2]
 800012a:   2010        movs    r0, #16
 800012c:   f88d 0003   strb.w  r0, [sp, #3]
 8000130:   4669        mov r1, sp
 8000132:   480a        ldr r0, [pc, #40]   ; (800015c <.text_4>)
 8000134:   f7ff ff84   bl  8000040 <GPIO_Init>
 8000138:   2102        movs    r1, #2
 800013a:   4808        ldr r0, [pc, #32]   ; (800015c <.text_4>)
 800013c:   f7ff ffe0   bl  8000100 <GPIO_SetBits>
 8000140:   f64e 2060   movw    r0, #60000  ; 0xea60
 8000144:   f7ff ffe2   bl  800010c <dummy_loop>
 8000148:   2102        movs    r1, #2
 800014a:   4804        ldr r0, [pc, #16]   ; (800015c <.text_4>)
 800014c:   f7ff ffdb   bl  8000106 <GPIO_ResetBits>
 8000150:   f64e 2060   movw    r0, #60000  ; 0xea60
 8000154:   f7ff ffda   bl  800010c <dummy_loop>
 8000158:   e7ee        b.n 8000138 <main+0x24>
    ...

0800015c <.text_4>:
 800015c:   40010c00    .word   0x40010c00

08000160 <RCC_APB2PeriphClockCmd>:
 8000160:   b2c9        uxtb    r1, r1
 8000162:   2900        cmp r1, #0
 8000164:   d005        beq.n   8000172 <RCC_APB2PeriphClockCmd+0x12>
 8000166:   4906        ldr r1, [pc, #24]   ; (8000180 <.text_53>)
 8000168:   6809        ldr r1, [r1, #0]
 800016a:   4308        orrs    r0, r1
 800016c:   4904        ldr r1, [pc, #16]   ; (8000180 <.text_53>)
 800016e:   6008        str r0, [r1, #0]
 8000170:   e005        b.n 800017e <RCC_APB2PeriphClockCmd+0x1e>
 8000172:   4903        ldr r1, [pc, #12]   ; (8000180 <.text_53>)
 8000174:   6809        ldr r1, [r1, #0]
 8000176:   ea31 0000   bics.w  r0, r1, r0
 800017a:   4901        ldr r1, [pc, #4]    ; (8000180 <.text_53>)
 800017c:   6008        str r0, [r1, #0]
 800017e:   4770        bx  lr

08000180 <.text_53>:
 8000180:   40021018    .word   0x40021018

08000184 <?main>:
 8000184:   f000 f80b   bl  800019e <__low_level_init>
 8000188:   2800        cmp r0, #0
 800018a:   d001        beq.n   8000190 <_call_main>
 800018c:   f3af 8000   nop.w

08000190 <_call_main>:
 8000190:   2000        movs    r0, #0
 8000192:   f3af 8000   nop.w
 8000196:   f7ff ffbd   bl  8000114 <main>

0800019a <_main>:
 800019a:   f000 f802   bl  80001a2 <exit>

0800019e <__low_level_init>:
 800019e:   2001        movs    r0, #1
 80001a0:   4770        bx  lr

080001a2 <exit>:
 80001a2:   f000 b809   b.w 80001b8 <_exit>

080001a6 <NMI_Handler>:
 80001a6:   4770        bx  lr

080001a8 <HardFault_Handler>:
 80001a8:   e7fe        b.n 80001a8 <HardFault_Handler>

080001aa <MemManage_Handler>:
 80001aa:   e7fe        b.n 80001aa <MemManage_Handler>

080001ac <BusFault_Handler>:
 80001ac:   e7fe        b.n 80001ac <BusFault_Handler>

080001ae <UsageFault_Handler>:
 80001ae:   e7fe        b.n 80001ae <UsageFault_Handler>

080001b0 <SVC_Handler>:
 80001b0:   4770        bx  lr

080001b2 <DebugMon_Handler>:
 80001b2:   4770        bx  lr

080001b4 <PendSV_Handler>:
 80001b4:   4770        bx  lr

080001b6 <SysTick_Handler>:
 80001b6:   4770        bx  lr

080001b8 <_exit>:
 80001b8:   4607        mov r7, r0

080001ba <.text_4>:
 80001ba:   4638        mov r0, r7
 80001bc:   f000 f802   bl  80001c4 <__exit>
 80001c0:   e7fb        b.n 80001ba <.text_4>
    ...

080001c4 <__exit>:
 80001c4:   b580        push    {r7, lr}
 80001c6:   f3af 8000   nop.w
 80001ca:   4a02        ldr r2, [pc, #8]    ; (80001d4 <__exit+0x10>)
 80001cc:   0011        movs    r1, r2
 80001ce:   2018        movs    r0, #24
 80001d0:   beab        bkpt    0x00ab
 80001d2:   e7fb        b.n 80001cc <__exit+0x8>
 80001d4:   00020026    .word   0x00020026

080001d8 <__iar_program_start>:
 80001d8:   f3af 8000   nop.w
 80001dc:   f3af 8000   nop.w
 80001e0:   f7ff ffd0   bl  8000184 <?main>

Даже можно попытаться загрузить на чип в режиме отладки. Для этого понадобиться сервер st-util который входит в набор утилит st-flash и сам отладчик gdb.

Запускаем сервер:

$ st-util                      
2016-10-12T03:33:50 INFO /home/flanker/mydev/tools/stlink/src/usb.c: -- exit_dfu_mode
2016-10-12T03:33:50 INFO /home/flanker/mydev/tools/stlink/src/common.c: Loading device parameters....
2016-10-12T03:33:50 INFO /home/flanker/mydev/tools/stlink/src/common.c: Device connected is: F1 Medium-density device, id 0x20036410
2016-10-12T03:33:50 INFO /home/flanker/mydev/tools/stlink/src/common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 1024 bytes
2016-10-12T03:33:50 INFO /home/flanker/mydev/tools/stlink/src/gdbserver/gdb-server.c: Chip ID is 00000410, Core ID is  1ba01477.
2016-10-12T03:33:50 INFO /home/flanker/mydev/tools/stlink/src/gdbserver/gdb-server.c: Listening at *:4242...

Запускаем отладчик:

$ arm-none-eabi-gdb ./first_project.out 
GNU gdb (GNU Tools for ARM Embedded Processors) 7.10.1.20160616-cvs
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-linux-gnu --target=arm-none-eabi".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
.
Find the GDB manual and other documentation resources online at:
.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./first_project.out...done.
(gdb) 

Подключаемся к ранее запущенному серверу:

(gdb) target remote localhost:4242
Remote debugging using localhost:4242
0x08000220 in ?? ()
(gdb) 

Загружаем прошивку:

(gdb) load
Loading section A0 rw, size 0x40 lma 0x8000000
Loading section P1 ro, size 0x1a4 lma 0x8000040
Start address 0x80001d8, load size 484
Transfer rate: 1 KB/sec, 242 bytes/write.
(gdb)

Ставим точку останова и запускаем на исполнение:

(gdb) break main
Breakpoint 1 at 0x8000116: file C:\Program Files\IAR Systems\project/main.c, line 8.
(gdb) continue
Continuing.
Note: automatically using hardware breakpoints for read-only addresses.

Breakpoint 1, main () at C:\Program Files\IAR Systems\project/main.c:8
8       C:\Program Files\IAR Systems\project/main.c: Нет такого файла или каталога.
(gdb) 

Но при попытке распечатать исходный листинг программы выдаст сообщение об ошибке:

(gdb) list
3       in C:\Program Files\IAR Systems\project/main.c
(gdb)

кое-что сделать конечно можно

(gdb) info breakpoint
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08000116 in main at C:\Program Files\IAR Systems\project/main.c:8
        breakpoint already hit 1 time
(gdb) info registers
r0             0x0      0
r1             0x8000400        134218752
r2             0x0      0
r3             0x23     35
r4             0x40022000       1073881088
r5             0x0      0
r6             0xf484929a       4102328986
r7             0xe03acba1       3761949601
r8             0xfffeef9d       4294897565
r9             0xffffffff       4294967295
r10            0x9ae315e4       2598573540
r11            0xc2eae1f4       3270173172
r12            0xffff7fdf       4294934495
sp             0x200007f8       0x200007f8
lr             0x800019b        134218139
pc             0x8000116        0x8000116 
cpsr           0x61000000       1627389952
(gdb) disass
Dump of assembler code for function main:
   0x08000114 <+0>:     push    {r7, lr}
=> 0x08000116 <+2>:     movs    r1, #1
   0x08000118 <+4>:     movs    r0, #8
   0x0800011a <+6>:     bl      0x8000160 
   0x0800011e <+10>:    movs    r0, #2
   0x08000120 <+12>:    strh.w  r0, [sp]
   0x08000124 <+16>:    movs    r0, #3
   0x08000126 <+18>:    strb.w  r0, [sp, #2]
   0x0800012a <+22>:    movs    r0, #16
   0x0800012c <+24>:    strb.w  r0, [sp, #3]
   0x08000130 <+28>:    mov     r1, sp
   0x08000132 <+30>:    ldr     r0, [pc, #40]   ; (0x800015c <.text_4>)
   0x08000134 <+32>:    bl      0x8000040 
   0x08000138 <+36>:    movs    r1, #2
   0x0800013a <+38>:    ldr     r0, [pc, #32]   ; (0x800015c <.text_4>)
   0x0800013c <+40>:    bl      0x8000100 
   0x08000140 <+44>:    movw    r0, #60000      ; 0xea60
   0x08000144 <+48>:    bl      0x800010c 
   0x08000148 <+52>:    movs    r1, #2
   0x0800014a <+54>:    ldr     r0, [pc, #16]   ; (0x800015c <.text_4>)
   0x0800014c <+56>:    bl      0x8000106 
   0x08000150 <+60>:    movw    r0, #60000      ; 0xea60
   0x08000154 <+64>:    bl      0x800010c 
   0x08000158 <+68>:    b.n     0x8000138 
End of assembler dump.
(gdb) n
13      in C:\Program Files\IAR Systems\project/main.c
(gdb) info registers pc
pc             0x800011e        0x800011e 
(gdb) 

На этом этапе думаю лучше оставить прошивку с IAR в сторону, и попытаться скомпилировать нормальный объектный файл в Linux.

некоторые не ищут легких путей…

Проблема в том, что нельзя вот так просто взять компилятор, исходный текст и скомпилировать прошивку для stm32. Почему? Потому что в опциях gcc компилятора можно указать только тип архитектуры «cortex-m3», а чипов на этой архитектуре выпускаются различными фирмами — тьма тьмущая. И у всех них разные карты памяти и периферия. Как минимум понадобиться скрипт линкера для вашего чипа.

О масштабах проблемы можно почитать например тут: ARM-ы для самых маленьких: тонкости компиляции и компоновщик. Более-менее толковый самопальный Makefile который мне удалось найти можно взять тут: Еще один шаблон проекта под STM32 на gcc.

После некоторых размышлений я решил взять в качестве основы сборочные файлы из какого-нибудь IDE. Традиционным IDE для ARM в Linux стал Eclipse, который ненавидят наверно все linux-пользователи за глючность и тормознутость. Справедливости ради, должен упомянуть, что генерации проектов существует специальная фирменная утилита STM32CubeMX. Но может ли она генерировать проекты для gcc или нет, я не знаю.

Поддержка ARM в Eclipse ставится через плагин: GNU ARM Eclipse

На странице установки предлагается несколько способов установки ARM плагина. Но, например, на LinuxMint мне этот плагин установить не удалось. В репозитории какая-то древняя версия Eclipse 3.8, это версия от 2012(!) года. И установка плагина заканчивается фейлом:

Поэтому пришлось вспомнить про старую добрую Slackware GNU/Linux. В этом году вышла новая версия 14.2.

Для начала нужно будет скачать ARM toolchain c сайта ARM:

Скачанный архив я распаковал в /usr/local

Теперь чтобы скачать Eclipse, зайдем в репозиторий и введем в строку поиска «eclipse-cpp»:

После чего попадаем на страницу с пакетом:

Т.к. уменя Слакваръ 64-битная, то для установки выполняем следующие манипуляции:

darkstar:~: su
Пароль: 
darkstar:/home/flanker# cd /tmp
darkstar:/tmp# curl https://slackbuilds.org/slackbuilds/14.2/development/eclipse-cpp.tar.gz|tar xvz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6964  100  6964    0     0   8246      0 --:--:-- --:--:-- --:--:--  8451
eclipse-cpp/
eclipse-cpp/doinst.sh
eclipse-cpp/README
eclipse-cpp/eclipse-cpp.png
eclipse-cpp/eclipse-cpp.info
eclipse-cpp/slack-desc
eclipse-cpp/eclipse-cpp.SlackBuild
eclipse-cpp/eclipse-cpp.desktop
darkstar:/tmp# cd eclipse-cpp/
darkstar:/tmp/eclipse-cpp# wget http://download.eclipse.org/technology/epp/downloads/release/mars/2/eclipse-cpp-mars-2-linux-gtk-x86_64.tar.gz
--2016-10-12 14:53:25--  http://download.eclipse.org/technology/epp/downloads/release/mars/2/eclipse-cpp-mars-2-linux-gtk-x86_64.tar.gz
Resolving download.eclipse.org (download.eclipse.org)... 198.41.30.199
Connecting to download.eclipse.org (download.eclipse.org)|198.41.30.199|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 191591158 (183M) [application/x-gzip]
Saving to: ‘eclipse-cpp-mars-2-linux-gtk-x86_64.tar.gz’

eclipse-cpp-mars-2-linux-gtk-x86_64.tar 100%[=============================================================================>] 182.71M  91.1KB/s    in 26m 42s 

2016-10-12 15:20:08 (117 KB/s) - ‘eclipse-cpp-mars-2-linux-gtk-x86_64.tar.gz’ saved [191591158/191591158]
darkstar:/tmp/eclipse-cpp# sh ./eclipse-cpp.SlackBuild
darkstar:/tmp/eclipse-cpp# installpkg /tmp/eclipse-cpp-4.5.2-x86_64-1_SBo.tgz 
Verifying package eclipse-cpp-4.5.2-x86_64-1_SBo.tgz.
Installing package eclipse-cpp-4.5.2-x86_64-1_SBo.tgz:
PACKAGE DESCRIPTION:
# eclipse-cpp (Eclipse IDE for C/C++ Developers)
#
# The CDT is Eclipse's C/C++ Development Tooling project. 
# It is an industrial-strength C/C++ IDE that also serves 
# as a platform for others to provide value-added tooling 
# for C/C++ developers. 
# 
#
# Homepage: http://www.eclipse.org/cdt
#
Executing install script for eclipse-cpp-4.5.2-x86_64-1_SBo.tgz.
Package eclipse-cpp-4.5.2-x86_64-1_SBo.tgz installed.

Поставив Eclipse мы сделали полдела. Еще нужно поставить jdk. C 6-й и 8-й версии JDK Eclipse отказывался работать и вылетал. С 7-й тоже глючит, но кое-как работает. В гугл вбиваем «java jdk 7 download» попадем на страницу: Java SE Development Kit 7 Downloads

darkstar:/tmp/eclipse-cpp# cd /tmp
darkstar:/tmp# lftp http://mirror.yandex.ru/slackware/slackware64-14.2/extra/
cd ok, cwd=/slackware/slackware64-14.2/extra                                    
lftp mirror.yandex.ru:/slackware/slackware64-14.2/extra> mirror java
Total: 1 directory, 8 files, 0 symlinks
New: 8 files, 0 symlinks
8563 bytes transferred
lftp mirror.yandex.ru:/slackware/slackware64-14.2/extra> bye
darkstar:/tmp# cd java
darkstar:/tmp/java# cp /home/flanker/mydev/down/jdk-7u79-linux-x64.tar.gz ./
darkstar:/tmp/java# sh ./java.SlackBuil
darkstar:/tmp/java# installpkg /tmp/jdk-7u79-x86_64-1.txz 
Verifying package jdk-7u79-x86_64-1.txz.
Installing package jdk-7u79-x86_64-1.txz:
PACKAGE DESCRIPTION:
# Java(TM) 2 Platform Standard Edition Development Kit.
#
# The Java 2 SDK software includes tools for developing, testing, and
# running programs written in the Java programming language.  This
# package contains everything you need to run Java(TM).
#
# For additional information, refer to this web page:
#   http://java.com/
#
Executing install script for jdk-7u79-x86_64-1.txz.
Package jdk-7u79-x86_64-1.txz installed.

Последий штрих:

darkstar:/tmp/java# ln -s /usr/lib64/java/bin/java /usr/bin/java

Теперь можно запускать Eclipse:

Жмем OK, это будет рабочий каталог проектов:

Далее открываем Marketplace:

В строку поиска вводим ARM:

и щелкаем по «install»

жмем «Confirm»

Перед установкой нужно будет принять условия лицензии:

Если погода на Марсе будет солнечной, то в конце установки предложат перезагрузить Eclipse:

После перезапуска Eclipse создаем новый проект:

В открывшийся форме нужно будет заполнить имя нового проекта и выбрать его тип:

В следующей форме необходимо выбрать параметры чипа. Замечу, что по дефолту(поле Content) предлагается не пустой проект, а проект с blink’ом:

Следующую форму можно оставить как есть:

Аналогично:

Здесь нужно указать путь к папке toolchain’ом:

Осталось закрыть окно «Welcome»

И перед нами открывается окно проекта:

Это совсем не тот простенький Blink который был в IAR. Здесь задержки формируются по таймеру и кроме этого используется модуль трассировки. Задать номер pin’а к которому подключен светодиод, можно в файле Blinky.h

2014


#ifndef BLINKLED_H_
#define BLINKLED_H_

#include "stm32f10x.h"








0123456
#define BLINK_PORT_NUMBER               (2)
#define BLINK_PIN_NUMBER                (12)
#define BLINK_ACTIVE_LOW                (1)

#define BLINK_GPIOx(_N)                 ((GPIO_TypeDef *)(GPIOA_BASE + (GPIOB_BASE-GPIOA_BASE)*(_N)))
#define BLINK_PIN_MASK(_N)              (1 << (_N))
#define BLINK_RCC_MASKx(_N)             (RCC_APB2Periph_GPIOA << (_N))


extern
void
blink_led_init(void);



inline void
blink_led_on(void);

inline void
blink_led_off(void);



inline void
__attribute__((always_inline))
blink_led_on(void)
{
#if (BLINK_ACTIVE_LOW)
  GPIO_ResetBits(BLINK_GPIOx(BLINK_PORT_NUMBER),
      BLINK_PIN_MASK(BLINK_PIN_NUMBER));
#else
  GPIO_SetBits(BLINK_GPIOx(BLINK_PORT_NUMBER),
      BLINK_PIN_MASK(BLINK_PIN_NUMBER));
#endif
}

inline void
__attribute__((always_inline))
blink_led_off(void)
{
#if (BLINK_ACTIVE_LOW)
  GPIO_SetBits(BLINK_GPIOx(BLINK_PORT_NUMBER),
      BLINK_PIN_MASK(BLINK_PIN_NUMBER));
#else
  GPIO_ResetBits(BLINK_GPIOx(BLINK_PORT_NUMBER),
      BLINK_PIN_MASK(BLINK_PIN_NUMBER));
#endif
}



#endif 

Чтобы задать светодиод на PB1 нужно константы BLINK_PORT_NUMBER и BLINK_PIN_NUMBER установить в единицы. После чего можно скомпилировать проект:

Если все прошло удачно, то можно закрыть проект и перейти в консоли в папку проекта:

$ cd   ~/workspace/myBlink/Debug/

Там будет объектный файл прошивки. Получаем бинарный файл:

darkstar:~/workspace/myBlink/Debug: arm-none-eabi-objcopy ./myBlink.elf -O binary ./myBlink.bin

Прошиваем:

darkstar:~/workspace/myBlink/Debug: st-flash write ./myBlink.bin 0x08000000
2016-10-12T17:50:49 INFO /home/flanker/mydev/tools/stlink/src/usb.c: -- exit_dfu_mode
2016-10-12T17:50:49 INFO /home/flanker/mydev/tools/stlink/src/common.c: Loading device parameters....
2016-10-12T17:50:49 INFO /home/flanker/mydev/tools/stlink/src/common.c: Device connected is: F1 Medium-density device, id 0x20036410
2016-10-12T17:50:49 INFO /home/flanker/mydev/tools/stlink/src/common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 1024 bytes
2016-10-12T17:50:49 INFO /home/flanker/mydev/tools/stlink/src/common.c: Attempting to write 5832 (0x16c8) bytes to stm32 address: 134217728 (0x8000000)
Flash page at addr: 0x08001400 erased
2016-10-12T17:50:50 INFO /home/flanker/mydev/tools/stlink/src/common.c: Finished erasing 6 pages of 1024 (0x400) bytes
2016-10-12T17:50:50 INFO /home/flanker/mydev/tools/stlink/src/common.c: Starting Flash write for VL/F0/F3 core id
2016-10-12T17:50:50 INFO /home/flanker/mydev/tools/stlink/src/flash_loader.c: Successfully loaded flash loader in sram
  5/5 pages written
2016-10-12T17:50:50 INFO /home/flanker/mydev/tools/stlink/src/common.c: Starting verification of write complete
2016-10-12T17:50:50 INFO /home/flanker/mydev/tools/stlink/src/common.c: Flash written and verified! jolly good!

Если, опять же все нормально, то светодиод начнет мигать с интервалом в одну секунду. Заливать прошивку можно и из Eclipse, но эта IDE меня интересует только как генератор проектов.

Попробуем взглянуть на makefile файл который лежит в этой же папке:

-include ../makefile.init

RM := rm -rf


-include sources.mk
-include system/src/stm32f1-stdperiph/subdir.mk
-include system/src/newlib/subdir.mk
-include system/src/diag/subdir.mk
-include system/src/cortexm/subdir.mk
-include system/src/cmsis/subdir.mk
-include src/subdir.mk
-include subdir.mk
-include objects.mk

ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(C++_DEPS)),)
-include $(C++_DEPS)
endif
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
ifneq ($(strip $(ASM_DEPS)),)
-include $(ASM_DEPS)
endif
ifneq ($(strip $(CC_DEPS)),)
-include $(CC_DEPS)
endif
ifneq ($(strip $(CPP_DEPS)),)
-include $(CPP_DEPS)
endif
ifneq ($(strip $(CXX_DEPS)),)
-include $(CXX_DEPS)
endif
ifneq ($(strip $(C_UPPER_DEPS)),)
-include $(C_UPPER_DEPS)
endif
ifneq ($(strip $(S_UPPER_DEPS)),)
-include $(S_UPPER_DEPS)
endif
endif

-include ../makefile.defs


SECONDARY_FLASH += \
myBlink.hex \

SECONDARY_SIZE += \
myBlink.siz \



all: myBlink.elf secondary-outputs


myBlink.elf: $(OBJS) $(USER_OBJS)
  @echo 'Building target: $@'
  @echo 'Invoking: Cross ARM C++ Linker'
 arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -T mem.ld -T libs.ld -T sections.ld -nostartfiles -Xlinker --gc-sections -L"../ldscripts" -Wl,-Map,"myBlink.map" --specs=nano.specs -o "myBlink.elf" $(OBJS) $(USER_OBJS) $(LIBS)
  @echo 'Finished building target: $@'
  @echo ' '

myBlink.hex: myBlink.elf
  @echo 'Invoking: Cross ARM GNU Create Flash Image'
 arm-none-eabi-objcopy -O ihex "myBlink.elf"  "myBlink.hex"
  @echo 'Finished building: $@'
  @echo ' '

myBlink.siz: myBlink.elf
  @echo 'Invoking: Cross ARM GNU Print Size'
 arm-none-eabi-size --format=berkeley "myBlink.elf"
  @echo 'Finished building: $@'
  @echo ' '


clean:
  -$(RM) $(SECONDARY_SIZE)$(C++_DEPS)$(OBJS)$(C_DEPS)$(ASM_DEPS)$(CC_DEPS)$(SECONDARY_FLASH)$(CPP_DEPS)$(CXX_DEPS)$(C_UPPER_DEPS)$(S_UPPER_DEPS) myBlink.elf
  -@echo ' '

secondary-outputs: $(SECONDARY_FLASH) $(SECONDARY_SIZE)

.PHONY: all clean dependents
.SECONDARY:

-include ../makefile.targets

Очищаем проект:

darkstar:~/workspace/myBlink/Debug: make clean
rm -rf  myBlink.siz  ./system/src/stm32f1-stdperiph/misc.o ./system/src/stm32f1-stdperiph/stm32f10x_gpio.o ./system/src/stm32f1-stdperiph/stm32f10x_rcc.o  ./system/src/newlib/_cxx.o ./system/src/newlib/_exit.o ./system/src/newlib/_sbrk.o ./system/src/newlib/_startup.o ./system/src/newlib/_syscalls.o ./system/src/newlib/assert.o  ./system/src/diag/Trace.o ./system/src/diag/trace_impl.o  ./system/src/cortexm/_initialize_hardware.o ./system/src/cortexm/_reset_hardware.o ./system/src/cortexm/exception_handlers.o  ./system/src/cmsis/system_stm32f10x.o ./system/src/cmsis/vectors_stm32f10x.o  ./src/BlinkLed.o ./src/Timer.o ./src/_write.o ./src/main.o  ./system/src/stm32f1-stdperiph/misc.d ./system/src/stm32f1-stdperiph/stm32f10x_gpio.d ./system/src/stm32f1-stdperiph/stm32f10x_rcc.d  ./system/src/newlib/_exit.d ./system/src/newlib/_sbrk.d ./system/src/newlib/_startup.d ./system/src/newlib/_syscalls.d ./system/src/newlib/assert.d  ./system/src/diag/Trace.d ./system/src/diag/trace_impl.d  ./system/src/cortexm/_initialize_hardware.d ./system/src/cortexm/_reset_hardware.d ./system/src/cortexm/exception_handlers.d  ./system/src/cmsis/system_stm32f10x.d ./system/src/cmsis/vectors_stm32f10x.d  ./src/BlinkLed.d ./src/Timer.d ./src/_write.d ./src/main.d  myBlink.hex  ./system/src/newlib/_cxx.d  myBlink.elf

Собираем заново:

darkstar:~/workspace/myBlink/Debug: make all
Building file: ../system/src/stm32f1-stdperiph/misc.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"system/src/stm32f1-stdperiph/misc.d" -MT"system/src/stm32f1-stdperiph/misc.o" -c -o "system/src/stm32f1-stdperiph/misc.o" "../system/src/stm32f1-stdperiph/misc.c"
Finished building: ../system/src/stm32f1-stdperiph/misc.c

Building file: ../system/src/stm32f1-stdperiph/stm32f10x_gpio.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"system/src/stm32f1-stdperiph/stm32f10x_gpio.d" -MT"system/src/stm32f1-stdperiph/stm32f10x_gpio.o" -c -o "system/src/stm32f1-stdperiph/stm32f10x_gpio.o" "../system/src/stm32f1-stdperiph/stm32f10x_gpio.c"
Finished building: ../system/src/stm32f1-stdperiph/stm32f10x_gpio.c

Building file: ../system/src/stm32f1-stdperiph/stm32f10x_rcc.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"system/src/stm32f1-stdperiph/stm32f10x_rcc.d" -MT"system/src/stm32f1-stdperiph/stm32f10x_rcc.o" -c -o "system/src/stm32f1-stdperiph/stm32f10x_rcc.o" "../system/src/stm32f1-stdperiph/stm32f10x_rcc.c"
Finished building: ../system/src/stm32f1-stdperiph/stm32f10x_rcc.c

Building file: ../system/src/newlib/_cxx.cpp
Invoking: Cross ARM C++ Compiler
arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu++11 -fabi-version=0 -fno-exceptions -fno-rtti -fno-use-cxa-atexit -fno-threadsafe-statics -MMD -MP -MF"system/src/newlib/_cxx.d" -MT"system/src/newlib/_cxx.o" -c -o "system/src/newlib/_cxx.o" "../system/src/newlib/_cxx.cpp"
Finished building: ../system/src/newlib/_cxx.cpp

Building file: ../system/src/newlib/_exit.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"system/src/newlib/_exit.d" -MT"system/src/newlib/_exit.o" -c -o "system/src/newlib/_exit.o" "../system/src/newlib/_exit.c"
Finished building: ../system/src/newlib/_exit.c

Building file: ../system/src/newlib/_sbrk.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"system/src/newlib/_sbrk.d" -MT"system/src/newlib/_sbrk.o" -c -o "system/src/newlib/_sbrk.o" "../system/src/newlib/_sbrk.c"
Finished building: ../system/src/newlib/_sbrk.c

Building file: ../system/src/newlib/_startup.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"system/src/newlib/_startup.d" -MT"system/src/newlib/_startup.o" -c -o "system/src/newlib/_startup.o" "../system/src/newlib/_startup.c"
Finished building: ../system/src/newlib/_startup.c

Building file: ../system/src/newlib/_syscalls.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"system/src/newlib/_syscalls.d" -MT"system/src/newlib/_syscalls.o" -c -o "system/src/newlib/_syscalls.o" "../system/src/newlib/_syscalls.c"
Finished building: ../system/src/newlib/_syscalls.c

Building file: ../system/src/newlib/assert.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"system/src/newlib/assert.d" -MT"system/src/newlib/assert.o" -c -o "system/src/newlib/assert.o" "../system/src/newlib/assert.c"
Finished building: ../system/src/newlib/assert.c

Building file: ../system/src/diag/Trace.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"system/src/diag/Trace.d" -MT"system/src/diag/Trace.o" -c -o "system/src/diag/Trace.o" "../system/src/diag/Trace.c"
Finished building: ../system/src/diag/Trace.c

Building file: ../system/src/diag/trace_impl.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"system/src/diag/trace_impl.d" -MT"system/src/diag/trace_impl.o" -c -o "system/src/diag/trace_impl.o" "../system/src/diag/trace_impl.c"
Finished building: ../system/src/diag/trace_impl.c

Building file: ../system/src/cortexm/_initialize_hardware.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"system/src/cortexm/_initialize_hardware.d" -MT"system/src/cortexm/_initialize_hardware.o" -c -o "system/src/cortexm/_initialize_hardware.o" "../system/src/cortexm/_initialize_hardware.c"
Finished building: ../system/src/cortexm/_initialize_hardware.c

Building file: ../system/src/cortexm/_reset_hardware.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"system/src/cortexm/_reset_hardware.d" -MT"system/src/cortexm/_reset_hardware.o" -c -o "system/src/cortexm/_reset_hardware.o" "../system/src/cortexm/_reset_hardware.c"
Finished building: ../system/src/cortexm/_reset_hardware.c

Building file: ../system/src/cortexm/exception_handlers.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"system/src/cortexm/exception_handlers.d" -MT"system/src/cortexm/exception_handlers.o" -c -o "system/src/cortexm/exception_handlers.o" "../system/src/cortexm/exception_handlers.c"
Finished building: ../system/src/cortexm/exception_handlers.c

Building file: ../system/src/cmsis/system_stm32f10x.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"system/src/cmsis/system_stm32f10x.d" -MT"system/src/cmsis/system_stm32f10x.o" -c -o "system/src/cmsis/system_stm32f10x.o" "../system/src/cmsis/system_stm32f10x.c"
Finished building: ../system/src/cmsis/system_stm32f10x.c

Building file: ../system/src/cmsis/vectors_stm32f10x.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"system/src/cmsis/vectors_stm32f10x.d" -MT"system/src/cmsis/vectors_stm32f10x.o" -c -o "system/src/cmsis/vectors_stm32f10x.o" "../system/src/cmsis/vectors_stm32f10x.c"
Finished building: ../system/src/cmsis/vectors_stm32f10x.c

Building file: ../src/BlinkLed.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"src/BlinkLed.d" -MT"src/BlinkLed.o" -c -o "src/BlinkLed.o" "../src/BlinkLed.c"
Finished building: ../src/BlinkLed.c

Building file: ../src/Timer.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"src/Timer.d" -MT"src/Timer.o" -c -o "src/Timer.o" "../src/Timer.c"
Finished building: ../src/Timer.c

Building file: ../src/_write.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"src/_write.d" -MT"src/_write.o" -c -o "src/_write.o" "../src/_write.c"
Finished building: ../src/_write.c

Building file: ../src/main.c
Invoking: Cross ARM C Compiler
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -DDEBUG -DUSE_FULL_ASSERT -DTRACE -DOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -I"../include" -I"../system/include" -I"../system/include/cmsis" -I"../system/include/stm32f1-stdperiph" -std=gnu11 -MMD -MP -MF"src/main.d" -MT"src/main.o" -c -o "src/main.o" "../src/main.c"
Finished building: ../src/main.c

Building target: myBlink.elf
Invoking: Cross ARM C++ Linker
arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -Og -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra  -g3 -T mem.ld -T libs.ld -T sections.ld -nostartfiles -Xlinker --gc-sections -L"../ldscripts" -Wl,-Map,"myBlink.map" --specs=nano.specs -o "myBlink.elf"  ./system/src/stm32f1-stdperiph/misc.o ./system/src/stm32f1-stdperiph/stm32f10x_gpio.o ./system/src/stm32f1-stdperiph/stm32f10x_rcc.o  ./system/src/newlib/_cxx.o ./system/src/newlib/_exit.o ./system/src/newlib/_sbrk.o ./system/src/newlib/_startup.o ./system/src/newlib/_syscalls.o ./system/src/newlib/assert.o  ./system/src/diag/Trace.o ./system/src/diag/trace_impl.o  ./system/src/cortexm/_initialize_hardware.o ./system/src/cortexm/_reset_hardware.o ./system/src/cortexm/exception_handlers.o  ./system/src/cmsis/system_stm32f10x.o ./system/src/cmsis/vectors_stm32f10x.o  ./src/BlinkLed.o ./src/Timer.o ./src/_write.o ./src/main.o
Finished building target: myBlink.elf

Invoking: Cross ARM GNU Create Flash Image
arm-none-eabi-objcopy -O ihex "myBlink.elf"  "myBlink.hex"
Finished building: myBlink.hex

Invoking: Cross ARM GNU Print Size
arm-none-eabi-size --format=berkeley "myBlink.elf"
   text    data     bss     dec     hex filename
   5653     176     416    6245    1865 myBlink.elf
Finished building: myBlink.siz

некоторые вещи бывает сложно объяснить

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

darkstar:~/workspace: st-util 
2016-10-13T03:20:05 INFO /home/flanker/mydev/tools/stlink/src/usb.c: -- exit_dfu_mode
2016-10-13T03:20:05 INFO /home/flanker/mydev/tools/stlink/src/common.c: Loading device parameters....
2016-10-13T03:20:05 INFO /home/flanker/mydev/tools/stlink/src/common.c: Device connected is: F1 Medium-density device, id 0x20036410
2016-10-13T03:20:05 INFO /home/flanker/mydev/tools/stlink/src/common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 1024 bytes
2016-10-13T03:20:05 INFO /home/flanker/mydev/tools/stlink/src/gdbserver/gdb-server.c: Chip ID is 00000410, Core ID is  1ba01477.
2016-10-13T03:20:05 INFO /home/flanker/mydev/tools/stlink/src/gdbserver/gdb-server.c: Listening at *:4242...

загружаем отладчик:

darkstar:~/workspace/myBlink/Debug: arm-none-eabi-gdb ./myBlink.elf 
GNU gdb (GNU Tools for ARM Embedded Processors) 7.10.1.20160616-cvs
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-linux-gnu --target=arm-none-eabi".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
.
Find the GDB manual and other documentation resources online at:
.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./myBlink.elf...done.
(gdb) 

подключаемся к серверу:

(gdb)  target remote localhost:4242
Remote debugging using localhost:4242
Reset_Handler () at ../system/src/cortexm/exception_handlers.c:31
31  {
(gdb)

загружаем прошивку:

(gdb) load
Loading section .isr_vector, size 0x354 lma 0x8000000
Loading section .inits, size 0x28 lma 0x8000354
Loading section .text, size 0x12c1 lma 0x800037c
Loading section .data, size 0x88 lma 0x8001640
Start address 0x800010c, load size 5829
Transfer rate: 3 KB/sec, 1457 bytes/write.
(gdb) 

ставим точку останова:

(gdb) break main
Breakpoint 1 at 0x8000a70: file ../src/main.c, line 60.
(gdb)

Запускаем на выполнение:

(gdb) continue
Continuing.
Note: automatically using hardware breakpoints for read-only addresses.

Breakpoint 1, main (argc=1, argv=0x20000004 ) at ../src/main.c:60
60  {
(gdb) 

Выполнение программы приостонавливается на точке останова. Смотрим листинг:

(gdb) list
55  #pragma GCC diagnostic ignored "-Wmissing-declarations"
56  #pragma GCC diagnostic ignored "-Wreturn-type"
57  
58  int
59  main(int argc, char* argv[])
60  {
61    // Send a greeting to the trace device (skipped on Release).
62    trace_puts("Hello ARM World!");
63  
64    // At this stage the system clock should have already been configured
(gdb) 

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

(gdb) continue
Continuing.

Program received signal SIGTRAP, Trace/breakpoint trap.
0x08000694 in call_host (arg=0x4, reason=4) at ../system/include/arm/semihosting.h:80
80        asm volatile (
(gdb) list
75      static inline int
76      __attribute__ ((always_inline))
77      call_host (int reason, void* arg)
78      {
79        int value;
80        asm volatile (
81
82            " mov r0, %[rsn]  \n"
83            " mov r1, %[arg]  \n"
84      #if defined(OS_DEBUG_SEMIHOSTING_FAULTS)

Программа останавливается по сигналу SIGTRAP и дальше ни в какую не идет.

Проблема кроется в отладочном интерфейсе semihosting, которого как понимаю, в чипе просто нет, но который позволяет выводить отладочные сообщения через функцию trace_printf().

Чтобы решить эту проблему, нужно в Eclipce через меню->project->proporties, открыть вкладку Settings в «C/C++ Build»:

В настройке препроцессора следует удалить макроопределение OS_USE_TRACE_SEMIHOSTING_DEBUG. После чего пересобрать проект. и полученный объектный файл заново загрузить в отладчик:

(gdb) n
62        trace_puts("Hello ARM World!");
(gdb) n
66        trace_printf("System clock: %u Hz\n", SystemCoreClock);
(gdb)

Посмотрим что нам пытаются вывести:

(gdb) p SystemCoreClock
$1 = 72000000

здесь вроде все нормально

(gdb) n
68        timer_start();
(gdb) n
70        blink_led_init();
(gdb) n
72        uint32_t seconds = 0;
(gdb) n
77            blink_led_on();
(gdb) n
78            timer_sleep(seconds == 0 ? TIMER_FREQUENCY_HZ : BLINK_ON_TICKS);
(gdb) 

Посмотрим значение переменной seconds:

(gdb) p seconds
$2 = 0

идем дальше:

(gdb) n
80            blink_led_off();
(gdb) n
81            timer_sleep(BLINK_OFF_TICKS);
(gdb) n
83            ++seconds;
(gdb) n
86            trace_printf("Second %u\n", seconds);
(gdb) n
87          }
(gdb) 

Почему то у меня после blink_on() светодиод гаснет, а после blink_off() наоборот загорается

(gdb) break main.c:83 if seconds = 100
Breakpoint 2 at 0x8000a02: file ../src/main.c, line 83.
(gdb) continue
Continuing.

Breakpoint 2, main (argc=, argv=) at ../src/main.c:83
83            ++seconds;
(gdb) print seconds
$3 = 100
(gdb) 

Думаю, что здесь все понятно.

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Бутокс от блох инструкция по применению
  • Falcon eye fe l500w инструкция
  • Лекарство аторвастатин инструкция по применению от чего помогает
  • Посудомоечная машина hansa zim 436 eh инструкция
  • Гербицид диамисоль инструкция по применению