среда, 22 февраля 2012 г.

I & STM32-discovery part7 - And button

Продолжая наше незатейливое повествование обратим внимание что просто мигать светодиодами скучно охота иметь хоть какую-то реакцию на внешний мир, поэтому используем имеющуюся на плате кнопку для выбора вида мигания.

Для начала обратимся к теории.
Как известно из документации любой пин на порте ввода-вывода может находится в нескольких состояниях:
1) Вход. Тут идет разделение на 3 состояния.
а) Вход Hi-Z высокоимпедансный вход, классический тип входа.
б) Вход с подтяжкой. Проиходит поддяжка в зависимости от настройки или к питанию или к земле.
в) Аналоговый режим, используется в случае использования АЦП
2) Выход. Может быть либо push-pull, либо open-drain. Последние состояние имеет смысл когда необходимо согласовать выходы мк с 5вольтовой логикой.
3) Альтернативные функции. Вывод подключается к имеющиеся периферии, также поддерживаются два режима как и для выхода - push-pull и open-drain.

Помимо этого есть ещё куча других настроек, ремап периферии и блокировка настроек порта(последняя позволяет заблокировать настройки порта так что их изменение будет доступно только после перезагрузки мк).

Порты 16битные, причём т.к. настройки тербуют по 4 бита(2 режим порта и 2 частота тактового сигнала), поэтому регистров настройки 2(ведь мк у нас 32х битный, а нужно 64 бита) - CRH, CRL.

Итак переходим от теории к практике. Для этого перейдем опять же в наш рабочий каталог и скопируем папку предыдущего примера в новую директорию и перейдём в нее:

nis@jane ~ $ cd stm32/examples/
nis@jane ~/stm32/examples $ cp -a 01-blink-led/ 02-and-button
nis@jane ~/stm32/examples $ cd 02-and-button/
nis@jane ~/stm32/examples/02-and-button $

Т.к. кнопка в соотвествии с документацией на плату у нас висит на 0вой ноге порта А мк то его мы настраивать и будем. Кстати этот порт по совместительству является ещё и wake-up для мк что позволяет использовать кнопку для возврата из сна. И заодно добавим в наш цикл код проверки состояния порта.



После этого соберем прошивку и загрузим ее в мк.

nis@jane ~/stm32/examples/02-and-button $ make all write
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
st-flash write v1 firmware.bin 0x8000000
2012-02-22T13:45:00 INFO src/stlink-sg.c: Current mode unusable, trying to get back to a useful state...
2012-02-22T13:45:00 WARN src/stlink-sg.c: received tag 0 but expected 3
2012-02-22T13:45:00 INFO src/stlink-common.c: Loading device parameters....
2012-02-22T13:45:00 INFO src/stlink-common.c: Device connected is: F1 Medium-density Value Line device
2012-02-22T13:45:00 INFO src/stlink-common.c: SRAM size: 0x2000 bytes (8 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 1024 bytes
2012-02-22T13:45:00 INFO src/stlink-sg.c: Successfully opened a stlink v1 debugger
2012-02-22T13:45:00 INFO src/stlink-common.c: Attempting to write 268 (0x10c) bytes to stm32 address: 134217728 (0x8000000)
2012-02-22T13:45:00 INFO src/stlink-common.c: Erasing flash page at addr: 0x8000000
2012-02-22T13:45:00 INFO src/stlink-common.c: Successfully unlocked flash
2012-02-22T13:45:00 INFO src/stlink-common.c: Finished erasing 1 pages of 1024 (0x400) bytes
2012-02-22T13:45:00 INFO src/stlink-common.c: Starting Flash write for VL core id
2012-02-22T13:45:00 INFO src/stlink-common.c: Successfully loaded flash loader in sram
2012-02-22T13:45:00 INFO src/stlink-common.c: Writing flash block 0 of size 64 (0x40)
2012-02-22T13:45:00 INFO src/stlink-common.c: Successfully unlocked flash
2012-02-22T13:45:00 INFO src/stlink-common.c: Writing flash block 1 of size 64 (0x40)
2012-02-22T13:45:00 INFO src/stlink-common.c: Successfully unlocked flash
2012-02-22T13:45:00 INFO src/stlink-common.c: Writing flash block 2 of size 64 (0x40)
2012-02-22T13:45:00 INFO src/stlink-common.c: Successfully unlocked flash
2012-02-22T13:45:00 INFO src/stlink-common.c: Writing flash block 3 of size 64 (0x40)
2012-02-22T13:45:00 INFO src/stlink-common.c: Successfully unlocked flash
2012-02-22T13:45:00 INFO src/stlink-common.c: Writing flash block 4 of size 64 (0x40)
2012-02-22T13:45:00 INFO src/stlink-common.c: Successfully unlocked flash
2012-02-22T13:45:00 INFO src/stlink-common.c: Starting verification of write complete
2012-02-22T13:45:00 INFO src/stlink-common.c: Flash written and verified! jolly good!


И напоследок как обычно видео сего процесса.