workshop_stm32_lesson0
Мастерская STM32. Занятие 0. Знакомство
Что такое микроконтроллер?
Зачем?
ARM Cortex
STM32g030f6p6
Код только для обучения. На работе так писать нельзя!
*(unsigned long*)(0x40023830) |= 0x8;
Лучше так:
#define RCCAHB1_ENR (unsigned long*)0x40023830
//Enable port D clocking
*RCCAHB1_ENR |= 0x8;
Еще лучше так:
RCC->AHB1ENR |= RCC_AHB1ENR_IOPDEN;
https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads
Компилятор
arm-none-eabi-gcc
Название arm-none-eabi-gcc можно разобрать по кусочкам — это стандартная схема именования "кросс-тулчейнов" (компиляторов и линкеров, собранных для другой архитектуры):
В классической схеме здесь указывается целевая операционная система (например: linux, elf, darwin).
Здесь написано none, что означает никакой ОС. Компилятор нацелен на bare-metal окружение, т.е. код будет выполняться прямо на «голом железе» без поддержки ОС.
EABI = Embedded Application Binary Interface.
Это набор правил для бинарной совместимости кода под ARM. В него входят:
Соглашение о вызовах (calling convention): какие регистры используются для передачи аргументов функций и возвращаемых значений.
Например, первые 4 аргумента передаются через r0–r3, а не через стек.
Выравнивание данных: как именно в памяти выравниваются структуры, массивы и др.
Формат объектных файлов и библиотек: чаще всего это ELF.
Работа с плавающей запятой: может быть либо soft-float (эмуляция на CPU), либо hard-float (использование сопроцессора FPU, например VFP).
Идея EABI в том, чтобы любой код (например, собранная библиотека и твой проект) можно было слинковать и запустить на устройстве без сюрпризов.
Если собрать библиотеку под arm-none-eabi-gcc, то она не будет работать на Linux ARM — там не будет системных вызовов и libc.
Если собрать под arm-linux-gnueabi-gcc, то бинарь будет ожидать Linux-систему, libc и syscalls.
Для микроконтроллеров (STM32, nRF52 и т.п.) всегда берут arm-none-eabi, т.к. там bare-metal и никакой ОС нет.