
«Если вручную писать Make скрипты, то абсолютно Все микроконтроллеры программируются одинаково.»
Пролог
Каких только микроконтроллеров мне не приходилось программировать: AVR, STM8, MSP430x, STM32, NXP (LPC2148), Xilinx MicroBlaze, MDR32, ESP32, MIK32, SPC58NNx, сс26×2, NRF53, Artery AT32, YTM32. Теперь вот МК компании FlagChip FC7300x. В сумме 15 семейств микроконтроллеров.
FC7300F8MDT — это семейство микроконтроллеров компании FlagChip as FlagShip. Внутри FC7300F8MDT три ARM Cortex‑M7 процессора с архитектурой armv7-m. Это не просто ещё один микроконтроллер. Это System‑on‑a-Chip (SoC)
Постановка задачи
Настроить GCC ToolChain, научиться собирать, прошивать и отлаживать прошивки для микроконтроллера FC7300F8MDT.
Создать минималистический тестировочный проект в котором будет мигающий Heartbeat LED, работающий системный таймер, прерывания, UART-трансивер, CLI и модульные тесты.
Определения
cross compliler — это когда на одной процессорной архитектуре собирают программу для абсолютно другой процессорной архитектуры. Например на x86_64 собирают прошивку для ARM Cortex‑M7. Дело в том, что персональный компьютер — это по сути универсальный вычислитель и ему абсолютно всё равно какие программы и для чего собирать.
архитектура (architecture) — представление структуры элементов или нечто, что позволяет опознать строительные блоки их границы и интерфейсы и включает назначения требований для этих строительных блоков. архитектура — структура какого‑либо сложного объекта и взаимосвязь элементов внутри между собой.
SDK ( software development kit — комплект для разработки программного обеспечения) — набор инструментов для разработки программного обеспечения, объединённый в одном пакете, обычно содержит комплект необходимых исходников, статических библиотек, компилятор, отладчик, иногда — интегрированную среду разработки.
Обычно зависят от комбинации аппаратного обеспечения и операционной системы.
Target устройство— то что мы программируем. В нашем случае Target устройство это MCU FC7300F8MDT.
GDB server — это компьютерная программа, которая позволяет удаленно по USB+JTAG отлаживать программатором прошивки. Работая на host PC GDB сервер позволяет GNU отладчику подключаться сокетом. Исполняемый файл, который должен отлаживаться, находиться на целевой системе (target), в то время как исходный код и копия двоичного файла, который должен отлаживаться, находятся на локальном компьютере разработчика (host).
GDB клиент — эта консольная утилита, которая получает *.elf файл, связывается по сокету с GDB сервером и позволяет делать пошаговую отладку.
Что надо из оборудования?
№ | Оборудование | Назначение |
1 | Учебно-тренировочная электронная плата с MCU FC7300F8MDT2P176T1A | Целевая платформа |
2 | Программатор Segger J-link V11-G | Чтобы запрограммировать микроконтроллер |
3 | Шлейф 20 пин для JTAG разъёмов | чтобы соединить электронную плату и программатор |
4 | Кабель USB-A -- USB-B длинной 1 2 метра | чтобы соединить LapTop и программатор |
5 | LapTop | для сборки прошивки |
6 | Лабораторный блок постоянного напряжения UTP1306 | чтобы подать электропитание на плату |
7 | Кабель 220 AC для лабораторного блока питания | чтобы подать питание на блок питания |
8 | Набор перемычек в шлейфе гнездо-гнездо | для работы с отладочной платой |
Что касается самого MCU, то мне попался FC7300F8MDT2P176T1B2402FG34P.

Если расшифровывать маркировка, то получается однокристальный компьютер (SoC) в ASIL-D исполнении, трех ядерный ARM Cortex-M7, с частотой до 300MHz, 8MByte on-chip Flash, с 176 pin-ами, заточённый в LQFP корпусе выдерживающий до +125 градусов Цельсия. Это основное.

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

Технические характеристики можно почитать тут
Технические характеристики
--Поддержка CPU с ядрами ARM7/9/11, Cortex‑A5/A7/A8/A9, Cortex‑M0/M1/M3/M4/M7, Cortex‑R4, Microchip PIC32 and Renesas RX100/ RX200/ RX610/ RX621/ RX62N/ RX62T/ RX630/ RX631/ RX63N;
‑ Поддержка SWV/ SWO (Serial Wire Viewer/ Serial Wire Output);
Пояснение по индикации отладчика J-link
Индикация | Частота, Hz | Значение |
зеленый, мигает | 10 | инициализация отладчика |
Зеленый, мигает | Когда отладчик работает, индикатор временно гаснет при выполнении команды. Таким образом, скорость мигания определяется скоростью интерфейса целевой платы. В низкоскоростных интерфейсах индикатор выключается на более длительный период, чем в высокоскоростных интерфейсах. | |
Устойчивый зеленый | 0 | Отладчик инициализирован и находится в состоянии ожидания. |
Зеленый, 10 мс | 1 | Эта функция будет активирована, когда эмулятор будет находиться в режиме ожидания более 7 секунд. |
Оранжевый | 0 | целевая плата находится в состоянии сброса |
Красный, мигает | 1 | В симуляторе обнаружена серьезная ошибка, которая не должна возникать при нормальных условиях. |
На столе разработчика надо соединить аппаратуру как показано на схеме

Что надо из документов?
Исходниками любой разработки являются официальные документы.
№ | Название дока | количество страниц | Revision | Пояснение |
1 | FC7300Fxx Product Brief (флаер) | 10 | ? | Флаер на микроконтроллер FC7300F8MDT |
2 | Схемотехника электронной платы | NDA | NDA | Чтобы понимать с какой стороны следует подходить к электронной плате |
3 | ARMv7-M Architecture Reference Manual. | 858 | ? | Спецификация ядра ARMv7-M: карта адресов ,регистры ядра, ISA |
4 | ARM Cortex-M7 Processor Technical Reference Manual | 145 | ? | Спека на процессорные ядра |
5 | FC7300 Data Sheet | 71 | A1 | Сокращенный даташит на |
6 | FC7300 Cloking Diagram | 1 | V1.3 | Дерево распределения тактирования |
7 | FC7300 Security User Guide | 38 | -- | |
8 | FC7300 Reference Manual | 2179 | Rev 1.1 | Полная спека на семейство FC7300 |
9 | FC7300 Errata Sheet | 34 | 4.2 | Реестр известных ошибок в кристалле FC7300 |
10 | FC7300 Demo Board User Manual | 16 | 1.1 | Текстовое описание учебно - тренировочной электронной платы от производителя |
11 | FC7300F8MDT Pinout_V1.1.xlsx | 4 | 1.1 | Таблица PIN_MUX |
12 | J-Link / J-Trace User Guide Document: UM08001 Software Version: 6.18 | 367 | 6.18 | Спека на программатор и набор утилит из набора J-link |
13 | FC_IDE User Guide | 31 | Rev.2.0 | Инструкция настройки пошаговой отладки в Eclipse IDE |
Что касается datasheet‑ов, то их просто так не скачать. Только флаер. При попытке скачать спеку сайт просит связаться с организацией. К слову, таблица FC7300F8MDT Pinout_V1.1.xlsx вложена в reference manual. Получается FC7300 Reference Manual.pdf является, как бы ещё и архивом. Такое бывает в документации для Automotive микроконтроллеров и у других производителей (STm).

Что надо из софтвера?
# | Программа или исходники | Версия | Пояснение |
0 | JDK | 17.0.1 2021-10-19 LTS | Виртуальная машина Java |
1 | Eclipse IDE | 2022-03 (4.23.0) | Текстовый редактор |
2 | Arm GNU Toolchain | 10.3.1 20210824 | Cross-компилятор |
3 | Build Tools (GNU Make) | 4.4.1 | Система сборки. Утилита для управления вызовами других утилит в правильной последовательности согласно скрипту в makefile. |
4 | SEGGER JLink_7.52b | 7.52b | PC утилиты-прошивальщики |
5 | SEGGER Ozone | V3.26 | Пошаговый отладчик. Отладочный сервер. |
6 | Flagchip SDK | V2_3_2 | базовые исходники от производителя MCU |
11 | CMSIS | Системный код от компании ARM для управления ядром ARM Cortex-M7 | |
7 | The Eclipse Embedded CDT (не обязательно) | Плагин для автоматического генерирования GNU Make скриптов системы сборки Cи кода | |
8 | FlagChip MCAL | Код для высокоуровневого программного доступа ко всем подсистемам микроконтроллера | |
9 | Windows драйвер для переходника USB-UART на основе ASIC CH340 (CH340SER.exe) | Для появление COM-порта в OS Windows | |
11 | SEGGER J-Link Configuration | V7.52b | Для проверки версии программатора |
12 | JFlashLite.exe | V7.52b | GUI утилита для загрузки прошивки в Target устройство |
14 | JFlash.exe | CLI утилита для загрузки прошивки в Target устройство | |
13 | JLinkGDBServerCL.exe | V7.52b | Отладочный GDB сервер связи с MCU |
15 | arm-none-eabi-gdb.exe | 10.3-2021.10 | Отладочный клиент |
10 | Tera Term (или PyTTY) | 4.105 | Терминал последовательного порта. |

Что касается SDK, MCAL, то это тоже просто так не скачать. При попытке скачать сорцы сайт просит связаться с организацией.
Внутри микроконтроллера FC7300F8MDT2P176T1A вот такая архитектура

Фаза 1: Установить драйверы для переходника с USB на UART.
После установки операционная система должна увидеть что появился виртуальный COM порт.

Фаза 2: Установить драйвер для программатора J-link
При подключении программатора в диспетчере устройств должно появиться новое USB устройство: J-link driver. General

Driver

Вкладка Details показывает, что это USB устройство: VID: 1366, PID: 0101, REV: 0100, Provider: Segger, Service: jlink,

Events

Фаза 3: Установить виртуальную машину Java
Это нужно для двух целей. Первое — чтобы завелся текстовый редактор Eclipse, 2- чтобы завелся локальный сервер сборки Jenkins.
Фаза 4: Установить программу текстового редактора Eclipse IDE (печатная машинка)
Так как любая программа это прежде всего текст, то надо установить какой-нибудь текстовый редактор.
Предлагаю Eclipse IDE for C/C++ Developers так как у него весьма удобные HotKeys. Для ускорения написания кода.

Плюс в Eclipse очень приятное синее выделение.

Еще Eclipse мгновенно запускается. Как по мне качество текстового редактора определяется тем как часто вам приходится пользоваться мышкой. В хорошем текстовом редакторе мышка вообще не нужна. Eclipse один из таких текстовых редакторов. Установить Eclipse IDE for C/C++ Developers можно отсюда.
Установка заключается в распаковке скаченного архива в удобное место. В ОС Windows можно устанавливать Eclipse в корень диска С. Программа запускается с помощью исполняемого файла eclipse.exe, который находится в распакованной папке.

При первом запуске Eclipse надо выбрать рабочую папку (workspace). В этой папке Eclipse будет по умолчанию создавать проекты.
После установки Eclipse надо сразу установить некоторые полезные плагины. Заходим в Help → Install New Software , выбираем All Available sites и отмечаем все плагины которые имеют в своем имени такие слова как J‑Link, OpenOCD, Debugging, ARM, Embedded, GCC. Это пригодится позже для пошаговой отладки кода в Eclipse.
На всякий случай можно установить плагин для автоматического генерирования make скриптов. Называется этот плагин The Eclipse Embedded CDT. Надо зайти в Help → Eclipse Marketplace → Installed прописать https://marketplace.eclipse.org/content/eclipse-embedded-cc
№ | Название Eclipse плагина | приоритет |
1 | Embeddede C/C++ J-link Debugging | желательно |
2 | Embeddede C/C++ OpenOCD Debugging | может пригодится |
3 | Embeddede C/C++ Arm Cross Compiler | может пригодится |
4 | Eclipse Embedded CDT | может пригодится |
Во время установки выглядит это примерно так

После установки плагинов Eclipse предложит перезагрузиться.

Настройка проекта в Eclipse
Настройки текстового редактора содержатся в файлах .project, .cproject. Важно снять галочку с пункта Makefile generation. В поле Build location прописать относительный путь к папке, которая содержит Makefile.

Настроить параллельную сборку, чтобы ускорить цикл ToolChain(а). Это делается во вкладке Behavior

После этого инициировать сборки можно горячей клавишей Ctrl+B.
Если же Вы захотите генерировать Make файлы автоматически, то Вам придется явно указать Eclipse-у путь к ToolChain и к путь к Build tools.
Указать путь до ранее установленного Arm GNU Toolchain Window → Preferences → MCU → Global Arm Toolchains Paths → Toolchain Folder: <локальный путь>\gcc‑arm‑none‑eabi-10.3–2021.10\bin

Указать путь до ранее установленного GNU Make Window → Preferences → MCU → Global Build Tools Paths → Build Tools Folder: <локальный путь>\gnumake-win64-v.4.4.1\bin

Указать путь до ранее установленного SEGGER J‑Link Window → Preferences → MCU → Global SEGGER J‑Link Paths → Executable: JLinkGDBServerCL.exe
→ Folder: C:\Program Files\SEGGER\JLink_V7_52b

Фаза 5: Установить Cross-компилятор ARM GNU Toolchain
Нужен ToolChain: препроцессор (cpp), компилятор ASM(as), компилятор С (gcc),компилятор С++(g++), компоновщик(ld), отладчик(gdb). Нужны binutils(ы) для диагностики полученных артефактов(nm, size, readelf), архиватор статических библиотек(ar), и прочее. Это основные утилиты, которые и делают всю работу по превращению исходников (*.с, .h) в артефакты (.hex .bin .map .elf .out файлики).
ToolChain следует брать с официального сайта
https://developer.arm.com/downloads/-/gnu-rm#:~:text=The%20GNU%20Arm%20Embedded%20Toolchain,Arm%20Cortex%2DR%20processor%20families.

Toolchain устанавливается как обычная win программа прямо из gcc-arm-none-eabi-10.3-2021.10-win32.exe файла

Проверка, что установилось. Вот полный комплект GCC ARM. Всего 32 утилиты.

Как же make файл узнает, что нужен именно этот toolchain? Ведь их может быть установлено несколько в разные папки. Ответ прост. Надо прописать адрес toolchain в переменной Path. А старый путь просто дропнуть.

и тут

Каждый свой шаг надо проверять. Как проверить, что терминал cmd находит ToolChain? Откройте cmd из любой папки и наберите arm-none-eabi-gcc.exe –v
Версия должна отобразиться в соответствии с версией скаченного дистрибутива. ToolChain может находится примерно по такому адресу:
C:\Program Files (x86)\GNU ARM Embedded Toolchain\10 2021.10\bin\
Фаза 6: Установить систему сборки кода GNU Make
Самый классический способ сборки программ на С(ях) это, конечно же, Make файлы. Не перестаю удивляться насколько элегантна сборка программ из make. В 197x программировали по настоящему достойные люди. Поэтому и появились такие утилиты‑шедевры как make, grep, find, sort и прочее. Благодаря Make файлам можно управлять модульностью сборок программных компонентов по‑полной. Мгновенно, одной строчкой включать и исключать сотни файлов одновременно для сотен сборок. Это даже не снилось таким GUI как IAR с Keil, где приходится протирать дыры в коврике для мышки, чтобы сделать то, что в make делается одной строчкой в *.mk файлике.
Сборка прошивок из make - считается высшим пилотаже программирования на С(ях).
Вот минимальный набор утилит для процессинга Make файлов.
Утилита | Назначение |
make | build automation tool |
sh | Unix shell interpreter |
realpath | вычислитель арифметики над путями |
tee | перенаправление логов |
busybox | a software suite that provides several Unix utilities |
echo | Echo the STRING(s) to standard output. |
cp | Copy SOURCEs to DEST |
mkdir | Create DIRECTORY |
rm | Remove (unlink) FILEs |
Фаза 7: Подготовка и разбор исходного кода из SDK.
Что из сорцов предоставляет вендор в своем SDK? Особое внимание надо уделить вот этим файликам:
Файл | Пояснение |
FC7300F8M.svd | *.svd Текстовый xml файл разметки регистров. Этот файл поедает отладочный клиент, чтобы понимать, как именно следует интерпретировать битовые поля в регистрах периферии. |
FC7300F8MDT_flash.ld | Настройки компоновщика |
startup_FC7300F8MDx.S | Функция которая вызывается до main(). Там же список названий обработчиков прерываний. |
system_init.c | Настройка системы до запуска main. Тут реализовано импровизированный memcpy, memset, отключение сторожевого таймера, включение FPU. |
Чтобы дать компилятору понять, что мы работаем именно с ядром ARM Cortex-M7 надо явно подать соответствующие ключи для указания целевой архитектуры ( -mcpu=cortex-m7 -march=armv7e-m -mthumb). Тут же обычно включают FPU (-mfpu=fpv5-sp-d16 -mfloat-abi=hard). Вот так:
$(info CORTEX_SELECT_MK_INC=$(CORTEX_SELECT_MK_INC) )
ifneq ($(CORTEX_SELECT_MK_INC),Y)
CORTEX_SELECT_MK_INC=Y
CORE_CUSTOM_DIR = $(CORE_DIR)/cortex_m7
INCDIR += -I$(CORE_CUSTOM_DIR)
# $(error CORE_CUSTOM_DIR=$(CORE_CUSTOM_DIR))
SOURCES_C += $(CORE_CUSTOM_DIR)/cortex_m7_driver.c
OPT += -DHAS_ARM
OPT += -DHAS_CORTEX_M7
OPT += -DHAS_CORTEX_M
ifeq ($(NVIC),Y)
include $(CORTEX_M7_DIR)/nvic/nvic.mk
endif
MICROPROCESSOR += -mcpu=cortex-m7
MICROPROCESSOR += -march=armv7e-m
MICROPROCESSOR += -mthumb
ifeq ($(FPU),Y)
#OPT += -D__FPU_PRESENT=1
#OPT += -D__FPU_USED=1
MICROPROCESSOR += -mfpu=fpv5-sp-d16
MICROPROCESSOR += -mfloat-abi=hard
else
MICROPROCESSOR += -mfloat-abi=soft
endif
ifeq ($(SYSTICK),Y)
# $(error SYSTICK=$(SYSTICK))
include $(CORE_CUSTOM_DIR)/systick/systick.mk
endif
ifeq ($(DIAG),Y)
ifeq ($(CORTEX_M7_DIAG),Y)
OPT += -DHAS_CORTEX_M7_DIAG
SOURCES_C += $(CORE_CUSTOM_DIR)/cortex_m7_diag.c
endif
endif
ifeq ($(CLI),Y)
ifeq ($(CORTEX_M7_COMMANDS),Y)
#$(error CORTEX_M7_COMMANDS=$(CORTEX_M7_COMMANDS))
OPT += -DHAS_CORTEX_M7_COMMANDS
SOURCES_C += $(CORE_CUSTOM_DIR)/cortex_m7_commands.c
endif
endif
endif
Тут надо стразу упомянуть, что main() вовсе не самая первая функция, которую начинает исполнять микроконтроллер при подаче электропитания. Самая первая функция это Reset_Handler в файле startup_FC7300F8MDx.S.
Последовательность | действие |
1 | Отключить прерывания |
2 | обнулить регистры общего назначения |
3 | прописать первое значение в указатель на верх стековой RAM памяти. (регистр sp) |
4 | обнулить стековую RAM память |
5 | вызвать функцию system_init из файла system_init.c |
6 | обнулить не проинициализированные переменные (bss) |
7 | прописать первые значение в глобальные переменные |
8 | разрешить прерывания |
9 | вызвать функцию main |
10 | зависнуть в бесконечном цикле JumpToSelf |
Видимо чтобы сделать нам жизнь проще разработчики FlagChip не стали весь startup код писать на ассемблере. То, что можно они написали на Си и вынесли в функцию system_init().
№ | действие |
1 | чинит ошибки из errata |
2 | отключает сторожевой таймер |
3 | включает сопроцессор FPU |
Фаза 8: Сборка проекта
Скорее всего у Вас будет очень много примерно одинаковых прошивок: первичный загрузчик, вторичный загрузчик, generic release (прошивка для отгрузки), generic debug, assembly_test (прошивка для схемотехников) и прочие прошивки. Чтобы уследить за всеми этими сборками надо запустить на локальном PC сервер сборки Jinkins. Про пуск сервера сборки у меня есть отдельный текст. Для сборки же проекта следует просто написать вот такой скрипт build_from_make.bat
echo off
cls
call clean_temp.bat
make clean 2>&1 | tee clean_log.txt
make all -j8 | tee build_log.txt
Про то как писать скрипты сборки на GNU Make у меня есть отдельный текст Основы по GNU Make. Jenkins выглядит просто, как сайт, на котором можно скачать собранные артефакты, для любого проекта и любой электронной платы.

Я бы рекомендовал Вам организовать на своем локальном жестком диске компьютера аж 2 репозитория: workspace и release. Workspace для редактирования кода, а release для генерации release(ных) артефактов. Release репозиторий он только read only. Release репозиторий пополнять только git pull(ами). Это важно, чтобы гарантировать, что все зависимости проиндексированы и в самом деле находятся в удалённом репозитории c кодом (общаке).

Фаза 9: Проверить, что программатор обнаружен утилитой Segger
Среди набора утилит присутствует программа JLinkConfig.exe (SEGGER J-Link Configuration V7.52b). Эта утилита предназначена для проверки факта подключения программатора и для обновления прошивки самого программатора. У меня утилита обнаружила изделие
Product = J-Link Vll compiled Jun 21 2023 V11.00, Nickname = SN = 601012412
USB = SN 601012412 HostFW = EmuFW = 2023 Jun 21 09:20

Фаза 10: Запись прошивки в Flash память микроконтроллера
Способ №1 JFlashLite
Прошить микроконтроллер FC7300F8MDT можно утилитой JFlashLite.exe. Это GUI утилита специально для ручной прошивки MCU. Выбираете Flagchip микроконтроллер FC7300F8MDTхXxxxT1B, интерфейс JTAG, битовую скорость 1000kHz.

Далее в поле Data File указываем путь к *.hex файлу

Надо прописать именно hex файл, чтобы Prog. addr. выставился автоматически. Такого не будет с bin файлом.

Выбрав *.hex файл, нажимаем кнопку Program Device. Далее появится зелёный progress bar и прошивка запишется в SoC.

Способ №2 Утилита JFlash.exe
Прошивку можно загрузить и скриптом. Для этого есть производственная утилита с названием JFlash.exe. Достаточно ей дать *.hex файл прошивки, файл конфигурации проекта для программатора *.jflash и запустить строчку в cmd. Перед вами скрипт перепрошивки flash_Jlink.bat
cls
set project_name=board_name_config_name_m
set flash_tool=JFlash.exe
set mcu_config=board_name.jflash
set artefact_hex=build\%project_name%.hex
set option=
set option=%option% -openprj%mcu_config%
set option=%option% -open%artefact_hex%
set option=%option% -programverify
set option=%option% -startapp
set option=%option% -exit
%flash_tool% %option%
При этом файл *.jflash надо синтезировать вручную, запустив утилиту JFlash в диалоговом режиме. Этот *.jflash — текстовый файл в котором прописан интерфейс (USB/TCP), битовая скорость, тип ядра процессора, путь к hex файлу, базовый адрес начала FLASH памяти и прочие метаданные.
>JFlash.exe -openprjBoardName.jflash -openBoard_Config.hex -programverify -startapp -exit
Способ №3 Прошить пошаговым отладчиком Ozone
Фаза 11: Настроить пошаговую отладку в Ozone
Любая разработка начинается со средств отладки. Подобно тому, как альпинизм начинается с верёвок.
Классика отладки прошивок - это пошаговая отладка. Пошаговую отладку можно делать в Segger Ozone. Чтобы Ozone увидел этот чип надо в файле JLinkDevices.xml добавить XML узлы
<Device>
<ChipInfo Vendor="Easyide" Name="FC7300F8M_CORE0_FromRom" JLinkScriptFile="Devices/Easyide/FC7300/FC7300_8M/FC7300_8M_core0_fromrom.JLinkScript" Core="JLINK_CORE_CORTEX_M7" WorkRAMAddr="0x21000000" WorkRAMSize="0x18000" />
<FlashBankInfo Name="Internal flash" BaseAddr="0x01000000" MaxSize="0x800000" Loader="Devices/Easyide/FC7300/FC7300_8M/FC7300_8M_core0.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
</Device>
<Device>
<ChipInfo Vendor="Easyide" Name="FC7300F8M" JLinkScriptFile="Devices/Easyide/FC7300/FC7300_8M/FC7300_8M_core0.JLinkScript" Core="JLINK_CORE_CORTEX_M7" WorkRAMAddr="0x21000000" WorkRAMSize="0x18000" />
<FlashBankInfo Name="Internal flash" BaseAddr="0x01000000" MaxSize="0x800000" Loader="Devices/Easyide/FC7300/FC7300_8M/FC7300_8M_core0.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
</Device>
<Device>
<ChipInfo Vendor="Easyide" Name="FC7300F8M_CORE1" JLinkScriptFile="Devices/Easyide/FC7300/FC7300_8M/FC7300_8M_core1.JLinkScript" Core="JLINK_CORE_CORTEX_M7" WorkRAMAddr="0x21000000" WorkRAMSize="0x18000" />
<FlashBankInfo Name="Internal flash" BaseAddr="0x01000000" MaxSize="0x800000" Loader="Devices/Easyide/FC7300/FC7300_8M/FC7300_8M_core0.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
</Device>
<Device>
<ChipInfo Vendor="Easyide" Name="FC7300F8M_CORE2" JLinkScriptFile="Devices/Easyide/FC7300/FC7300_8M/FC7300_8M_core2.JLinkScript" Core="JLINK_CORE_CORTEX_M7" WorkRAMAddr="0x21000000" WorkRAMSize="0x18000" />
<FlashBankInfo Name="Internal flash" BaseAddr="0x01000000" MaxSize="0x800000" Loader="Devices/Easyide/FC7300/FC7300_8M/FC7300_8M_core0.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
</Device>
Также должны быть бинарные файлы для данного микроконтроллера в папке Devices

Как только патчи добавлены, выбираем микроконтроллер FC7300F8M (это нулевой ядро).

Выбираем набор регистров Cortex-M7 (with FPU).

Ставим JTAG, частоту и серийный номер отладчика

Указываем абсолютный путь к *.elf файлу.

Настраиваем проект отладки

F5 Download and Erаse.

Ozone загрузил программу в SoC

Теперь можно отлаживать прошивку. Для этого в Ozone заложены вот такие горячие кнопки:
Hot key | Функция | Пояснение |
F5 | Continue | запустить прошивку на исполнение |
F4 | Reset | |
F10 | Step Over | пройти строчку |
F11 | Step Into | зайти в функцию |
Shift+F11 | Step Out | выйти из функии |
Ctrl + Alt + L | Load snapshot | |
Ctrl + Alt + S | Save Snapshot | |
Ctrl+F5 | Halt | остановить программу |
Ctrl+M | Find function | Поиск функции по имени |
Во время пошаговой отладки LED на программаторе J‑link мерцает. Итак, прошивка зависла. Я нажал Halt и обнаружил строчку в коде, в которой возникла загвоздка. Оказывается вызвали отправку в UART до вызова функции FCUART_Init. Вот так и работает пошаговая отладка.

Фаза 12: Пуск отладочного GDB сервера на PC
Среди набора утилит от SEGGER присутствует консольный GDB Server с названием JLinkGDBServerCL. Это программа, которая запускает процесс в операционной системе для непосредственного и непрерывного взаимодействия с программатором и микроконтроллером на другом конце JTAG шлейфа. Отладочному серверу надо указать интерфейсы между PC и программатором, интерфейс между программатором и целевым МК, битовые скорости и можно принудительно переопределить настройки по умолчанию. Вот такой скрипт инициирует пуск отладочного сервера.
:: see 3.3.5 Command line options
echo off
cls
set GDB_SERVER_OPT=
::Specifies the host interface to be used to connect to J-Link.
::Currently, USB and TCP/IP are available.
set GDB_SERVER_OPT=%GDB_SERVER_OPT% -select USB
:: Tells GDBServer to which device J-Link is connected before the
:: connect sequence is actually performed.
set GDB_SERVER_OPT=%GDB_SERVER_OPT% -device FC7300F8MDTxXxxxT1B
::Sets the endianness of the target where endianness can either
:: be “little” or “big”.
set GDB_SERVER_OPT=%GDB_SERVER_OPT% -endian little
::Selects the target interface J-Link shall use to connect to the target.
set GDB_SERVER_OPT=%GDB_SERVER_OPT% -if JTAG
::Starts J-Link Commander with a given initial speed.
set GDB_SERVER_OPT=%GDB_SERVER_OPT% -speed 2000
::Initializes the CPU register with default values on startup.
set GDB_SERVER_OPT=%GDB_SERVER_OPT% -ir
:: Select the port to listen for GDB clients
set GDB_SERVER_OPT=%GDB_SERVER_OPT% -port 2331
::Select the port to listen for clients for SWO RAW output.
set GDB_SERVER_OPT=%GDB_SERVER_OPT% -swoport 2332
::Select the port to listen for clients for printf output.
set GDB_SERVER_OPT=%GDB_SERVER_OPT% -telnetport 2333
:: Starts the GDB Server with the option to listen on localhost only
:: This means that only TCP/IP connections from localhost are accepted)
:: or on any IP address.
:: To allow remote debugging (connecting to GDBServer from another PC),
:: deactivate this option.
:: If no parameter is given, it will be set to 1 (active).
set GDB_SERVER_OPT=%GDB_SERVER_OPT% -LocalhostOnly
set GDB_SERVER_OPT= %GDB_SERVER_OPT% -logtofile
set GDB_SERVER_OPT= %GDB_SERVER_OPT% -log "GdbServerLog.txt"
set GDB_SERVER_PATH=JLinkGDBServerCL.exe
call %GDB_SERVER_PATH% %GDB_SERVER_OPT%
Только во время работающего отладочного сервера можно смело подключатся к нему уже отладочным клиентом. Получается тандем консольных утилит, которые общаются между собой через TCP сокет на порту с номером 2331.

Я рекомендую Вам всегда запускать GDB сервер именно из отдельного *.bat скрипта, чтобы у Вас всегда перед глазами был ценнейший лог сервера. В случае осечек, вы хоть сможете прочитать и понять причину осечки. И так вы в меньшей степени будете привязаны к какой -либо IDE.
Фаза 13: Настроить GDB клиент на PC
GDB клиент — эта такая утилита, которая получает *.elf файл, связывается по сокету с GDB сервером и позволяет делать пошаговую отладку. Только и всего. Программа Ozone объединяет в себе и клиент и сервер. Однако можно запускать их и по отдельности. Это альтернативный вариант программе Ozone.
Подарок судьбы в том, что в Eclipse IDE есть плагин для работы с Segger J‑link. Мы как раз его установили при настройке Eclipse. Это позволяет ассоциировать текстовый редактор и отладочный GDB клиент. Хотя ничего не мешает и отлаживаться вообще в консоли. Про это у меня есть отдельный текcт: Пошаговая GDB отладка ARM процессора из консоли в Win10

во вкладке Debugger отключаем запуск сервера.

В окне GDB Client Setup прописываем абсолютный путь к GDB клиенту
C:\Program Files (x86)\GNU Arm Embedded Toolchain\10 2021.10\bin\arm-none-eabi-gdb.exe
Сообщаем, что GDB сервер работает на этом же компьютере, указываем порт 2331 для общения с GDB сервером.

просим загружать прошивку

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

оставляем без изменений

ставим галочки

можно указать путь к файлу описания регистров

Всё готово для пошаговой отладки.

в Eclipse горячие клавиши уже другие:
# | Action | Hot key | пояснение |
1 | Resume | F8 | отпустить программу |
2 | Terminate | Ctrl+F2 | остановить пошаговую отладку |
3 | Step Into | F5 | зайти в функцию |
4 | Step Over | F6 | пройти строчку |
Фаза 14: Физический пуск прошивки
Пошаговая отладка медленная и нужна только в том случае, если прошивка полностью заклинит. На одном только GDB сильно не разбежишься. Остальной же базовый функционал можно и нужно вполне успешно отлаживать через интерфейс командной строки (UART‑CLI). Поэтому я добавил в прошивку код для пуска CLI на UART1. Вот появилась консоль управления:

Подключение происходит по UART1, на битовой скорости 460 800 bit/s, 8 bit в кадре, без проверки чётности, 2 стоповых бита. На всякий случай надо поставить паузу 10 ms между отправкой символов, чтобы прошивка не захлебнулась от потока байт.

CLI показывает, что микроконтроллер за одну секунду проворачивает суперцикл 50k+ раз!

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

То же самое можно показать вот на такой слегка упрощенной схеме.

Итоги
Дело завертелось, лёд тронулся. Теперь ясно с какой стороны подходить к китайским микроконтроллерам FC7300x компании FlagСhip. Микроконтроллеры из КНР - это санкционно-стойкая компонентная база.
Удалось вручную написать make скрипт для проекта, безошибочно компилировать сборки, настроить сервер сборки, удалось прошивать микроконтроллер по JTAG, выполнять пошаговую отладку несколькими способами (Ozone и JlinkGDBServer) и даже запустить отладочный интерфейс командной строки UART‑TUI.
Всё это закладывает основу и открывает прямую дорогу для полноценной разработки на микроконтроллерах FC7300F8MDT от компании FlagChip.
Ссылки
№ | Название | URL |
1 | Официальный сайт FlagChip | |
2 | Обзор безопасных микроконтроллеров Flagchip для автомобильной электроники | |
3 | Флаер на семейство FC7x | https://www.flagchip.com.cn/UserFiles/upload/file/20240925/20240925134838341.pdf |
4 | Eclipse Embedded C/C++ | |
5 | Products-Rex series (FC7x) | |
22 | Пошаговая GDB отладка ARM процессора из консоли в Win10 | |
8 | Дистрибутив текстового редактора | |
9 | Дистрибутив Cross-компилятора | |
18 | Основы по GNU Make | |
10 | Дистрибутив утилиты для пошаговой отладки прошивки | https://www.segger.com/downloads/jlink/Ozone_Windows_V326d_x64.exe |
11 | FC7300Fxx Family - Multiple ARM ® Cortex ®- M7 core with lockstep, ASIL-D | |
12 | Дистрибутив утилиты прошивальщика
| https://www.segger.com/downloads/jlink/JLink_Windows_x86_64.exe |
13 | Аналитика пинов для FC7300F8MDT, PinMux, GPIO. | |
14 | Tera Term Home Page | |
15 | Набор перемычек в шлейфе гнездо-гнездо | |
16 | J-Link ARM V11 программатор универсальный | https://autos-sky.ru/index.php?route=product/product&product_id=524&ysclid=maz39m0hnx387222677 |
17 | Почему Нам Нужен UART-Shell? (или Добавьте в Прошивку Гласность) | |
19 | Как программировать многоядерные микроконтроллеры | |
21 | Запуск сервера сборки Jenkins | |
20 | Справка про утилиты J-Link GDB Server | https://kb.segger.com/J-Link_GDB_Server#Command_line_options |
Словарь
Акроним | Расшифровка |
IDE | Integrated development environment, |
ARM | Advanced RISC Machine |
SoC | System-on-a-Chip |
RISC | Reduced instruction set computer |
FPU | floating-point unit |
CSC | CPU System Control |
MCAL | Microcontroller Abstraction Layer |
SCG | System Clock Generator |
GNU | GNU's Not Unix |
GDB | GNU Project Debugger |
USB | Universal Serial Bus |
SDK | software development kit |
MCU | MicroСontroller unit |
OCD | Open On-Chip Debugger |
Вопросы
--Чем ARM Cortex-M4 отличается от ARM Cortex-M7?