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 и никакой ОС нет.