пятница, 27 января 2012 г.

I & STM32-discovery part4 - Hello work

После того как у нас в наличие есть все компоненты почему бы не запустить пробную прошивку на нашей плате

Для начала перейдите в директорию stm32 и создайте папку examples

nis@jane ~ $ cd stm32/
nis@jane ~/stm32 $ mkdir examples

Для первого проекта создадим подпапку 00-enable-led

nis@jane ~/stm32 $ mkdir examples/00-enable-led

В папке stlink есть все что может понадобиться в начале изучения мк. Поэтому будем пока использовать эту папку. Так как сборка проекта дело нудное и неблагодарное( от строки опций компилятора порой мозги пухнут) то создадим make - файл с основными правилами сборки.

nis@jane ~/stm32 $ touch examples/00-enable-led/Makefile
nis@jane ~/stm32 $ vim examples/00-enable-led/Makefile


Описываются необходимые переменные такие как компилятор, его флаги, флаги линкера и директории заголовочных файлов. А также 3 правила - для сборки проекта, его очистки и загрузки готового бинарного файла во флешь мк.
Теперь про файлы проекта, так как это первый запуск то нам потребуется main.c

nis@jane ~/stm32 $ touch examples/00-enable-led/main.c
nis@jane ~/stm32 $ vim examples/00-enable-led/main.c


Файлы для указания сборщику порядка секций и их типы

nis@jane ~/stm32 $ touch examples/00-enable-led/stm32f100xb_flash.ld
nis@jane ~/stm32 $ vim examples/00-enable-led/stm32f100xb_flash.ld


nis@jane ~/stm32 $ touch examples/00-enable-led/generic_sections_flash.ld
nis@jane ~/stm32 $ vim examples/00-enable-led/generic_sections_flash.ld

После создания файлов можно собрать проект.

nis@jane ~/stm32/examples/00-enable-led $ make
arm-softfloat-linux-gnueabi-gcc -g -O2 -mlittle-endian -mthumb -ffreestanding -nostdlib -nostdinc -mcpu=cortex-m3 -DSTM32F10X_MD_VL -I. -I../../stlink/example/libs_stm/inc/base -I../../stlink/example/libs_stm/inc/core_support -I../../stlink/example/libs_stm/inc/device_support -Wl,-T,stm32f100xb_flash.ld   -c -o main.o main.c
arm-softfloat-linux-gnueabi-gcc -g -O2 -mlittle-endian -mthumb -ffreestanding -nostdlib -nostdinc -mcpu=cortex-m3 -DSTM32F10X_MD_VL -I. -I../../stlink/example/libs_stm/inc/base -I../../stlink/example/libs_stm/inc/core_support -I../../stlink/example/libs_stm/inc/device_support -Wl,-T,stm32f100xb_flash.ld -o firmware.elf main.o -L.
arm-softfloat-linux-gnueabi-objcopy -O binary firmware.elf firmware.bin

nis@jane ~/stm32/examples/00-enable-led $ ll
итого 36
-rwxr-xr-x 1 nis nis    64 янв.  27 13:42 firmware.bin
-rwxr-xr-x 1 nis nis 35843 янв.  27 13:42 firmware.elf
-rw-r--r-- 1 nis nis  1433 янв.  16 12:11 generic_sections_flash.ld
-rw-r--r-- 1 nis nis   715 янв.  27 13:42 main.c
-rw-r--r-- 1 nis nis  4152 янв.  27 13:42 main.o
-rw-r--r-- 1 nis nis  1015 янв.  27 13:36 Makefile
-rw-r--r-- 1 nis nis   313 янв.  16 12:11 stm32f100xb_flash.ld

У нас получилась прошивка размером 64 байт.

Дизассемблировав файл firmware.elf можно увидеть как хорошо компилятор справляется со своей задачей используя все возможности процессорного ядра cortex-m3

nis@jane ~/stm32/examples/00-enable-led $ arm-softfloat-linux-gnueabi-objdump -d firmware.elf

firmware.elf:     file format elf32-littlearm


Disassembly of section .text:

08000000 <vector_table>:
 8000000:       fc 1f 00 20 39 00 00 08                             ... 9...

08000008 <main>:
 8000008:       f44f 5280       mov.w   r2, #4096       ; 0x1000
 800000c:       f2c4 0202       movt    r2, #16386      ; 0x4002
 8000010:       6991            ldr     r1, [r2, #24]
 8000012:       f44f 5380       mov.w   r3, #4096       ; 0x1000
 8000016:       f041 0110       orr.w   r1, r1, #16
 800001a:       6191            str     r1, [r2, #24]
 800001c:       f2c4 0301       movt    r3, #16385      ; 0x4001
 8000020:       685a            ldr     r2, [r3, #4]
 8000022:       f042 0211       orr.w   r2, r2, #17
 8000026:       605a            str     r2, [r3, #4]
 8000028:       685a            ldr     r2, [r3, #4]
 800002a:       f022 02cc       bic.w   r2, r2, #204    ; 0xcc
 800002e:       605a            str     r2, [r3, #4]
 8000030:       f44f 7240       mov.w   r2, #768        ; 0x300
 8000034:       60da            str     r2, [r3, #12]
 8000036:       e7fe            b.n     8000036 <main+0x2e>

08000038 <Reset_Handler>:
 8000038:       b508            push    {r3, lr}
 800003a:       f7ff ffe5       bl      8000008 <main>
 800003e:       bd08            pop     {r3, pc}

Теперь осталось загрузить во флешь мк прошивку и порадоватся за результат.
nis@jane ~/stm32/examples/00-enable-led $ make write
st-flash write v1 firmware.bin 0x8000000
2012-01-27T13:56:34 INFO src/stlink-sg.c: Current mode unusable, trying to get back to a useful state...
2012-01-27T13:56:34 WARN src/stlink-sg.c: received tag 0 but expected 3
2012-01-27T13:56:34 INFO src/stlink-common.c: Loading device parameters....
2012-01-27T13:56:34 INFO src/stlink-common.c: Device connected is: F1 Medium-density Value Line device
2012-01-27T13:56:34 INFO src/stlink-common.c: SRAM size: 0x2000 bytes (8 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 1024 bytes
2012-01-27T13:56:34 INFO src/stlink-sg.c: Successfully opened a stlink v1 debugger
2012-01-27T13:56:34 INFO src/stlink-common.c: Attempting to write 64 (0x40) bytes to stm32 address: 134217728 (0x8000000)
2012-01-27T13:56:34 INFO src/stlink-common.c: Erasing flash page at addr: 0x8000000
2012-01-27T13:56:34 INFO src/stlink-common.c: Successfully unlocked flash
2012-01-27T13:56:34 INFO src/stlink-common.c: Finished erasing 1 pages of 1024 (0x400) bytes
2012-01-27T13:56:34 INFO src/stlink-common.c: Starting Flash write for VL core id
2012-01-27T13:56:34 INFO src/stlink-common.c: Successfully loaded flash loader in sram
2012-01-27T13:56:34 INFO src/stlink-common.c: Writing flash block 0 of size 64 (0x40)
2012-01-27T13:56:34 INFO src/stlink-common.c: Successfully unlocked flash
2012-01-27T13:56:34 INFO src/stlink-common.c: Starting verification of write complete
2012-01-27T13:56:34 INFO src/stlink-common.c: Flash written and verified! jolly good!

 Два горящих красных светодиода говорят о том что включен интерфейс отладки.