Достал из ящика стола STM32 VL Discovery. На борту ARM 32-bit Cortex-M3, 24MHz, 128Kib flash, 8Kib ram, бла-бла-бла и все такое, что нужно для dev-платки. «Hello, world!» для таких плат является мигалка светодиодом. Стандартный демо-пример на Си, использующий библиотеку CMSIS занимает около трех килобайт (с выравниванием четыре килобайта), правда там еще предусмотрено изменение частоты моргания посредством нажатия кнопки USER, ну и фиг с ним. Наваял свою «дрыгалку» (естесственно в самом простейшем виде, без всяких оптимизаций и использования преимуществ arm, так как бы я написал для x86 на скорую руку):
/* * file: stm32.ld */ SECTIONS { /* interrupt vectors start at zero */ . = 0x0; /* start of flash */ .text : { *(.text) } /* constant data follows code but still in flash */ .data : { *(.data) *(.rom) } /* internal RAM starts at 0x20000000 */ . = 0x20000000; .ram : { *(.ram) } .bss : { *(.bss) *(.ram) } }
@ @ file: led2.s @ .syntax unified .cpu cortex-m3 .thumb .equ STACKINIT, 0x20001FFF .equ PERIPH_BASE, 0x40000000 .equ APB1PERIPH_BASE, (PERIPH_BASE + 0x00000) .equ APB2PERIPH_BASE, (PERIPH_BASE + 0x10000) .equ AHBPERIPH_BASE, (PERIPH_BASE + 0x20000) .equ RCC_BASE, (AHBPERIPH_BASE + 0x1000) .equ RCC_APB2ENR, (RCC_BASE + 0x18) .equ GPIOC_BASE, (APB2PERIPH_BASE + 0x1000) .equ GPIOC_CRH, (GPIOC_BASE + 0x04) .equ GPIOC_BSRR, (GPIOC_BASE + 0x10) .equ LED_DELAY, 0x30000 .section .text .org 0x0 vectors: .word STACKINIT .word _start + 1 _start: @ разрешаем тактирование порта C ldr r6, = RCC_APB2ENR mov r0, 0x10 str r0, [r6] @ устанавливаем режимы тактирования ног 8 и 9 порта C @ (синий и зеленый светодиоды, соответственно) ldr r6, = GPIOC_CRH ldr r0, = 0x44444433 str r0, [r6] @ глушим синий, зажигаем зеленый ldr r2, = 0x01000200 @ глушим зеленый зажигаем синий ldr r3, = 0x02000100 @ порт сброса/установки сигнала на ноги ldr r6, = GPIOC_BSRR @ бесконечный цикл loop: @ blue - off, green - on str r2, [r6] bl delay @ blue - on, green - off str r3, [r6] bl delay b loop @ простенькая задержка delay: ldr r1, = LED_DELAY delay3: subs r1, 1 bne delay3 bx lr
компилируем и прошиваем:
arm-none-eabi-as -mcpu=cortex-m3 -mthumb -ahls=led2.lst -o led2.o ./led2.s arm-none-eabi-ld -v -Tstm32.ld -nostartfiles -o led2.elf ./led2.o arm-none-eabi-objcopy -O binary ./led2.elf ./led2.bin st-flash write v1 ./led2.bin 0x08000000
— набор компиляторов GCC под ARM брал тут
— утилиту для прошивки брал тут (git clone https://github.com/texane/stlink && cd ./stlink && ./autogen.sh && ./configure && make)
— под Mac OS не забываем поставить драйвер (cd stlinkv1_macosx_driver/osx && sudo ./install.sh), если не ставится из-за неподходящей версии системы, то просто правим скрипт, я под yosemite добавил вот такие строчки:
10.10.3) KEXT="stlink_shield10_10.kext" ;;
результат: файл прошивки уменьшился с 3-4 кбайт до 84 байт (если развернуть цикл delay, то 80)