Часто МК применяют не как жесткую логику, а скорее наоборот как систему которая реагирует на изменение в окружающей среде (рабочем процессе). Поэтому помимо фунции вывода портов в/в, также интересна функция ввода.
Схема порта в/в в режиме ввода:
1) Буффер вывода включен
2) Триггер Шмитта активирован
3) Резисторы поддтяжки к питанию/земле активны и зависят от значения в GPIOx_PUPDR регистре
4) Данные доступны в течении одного тактового периода
5) Читая данные с регистра ввода (GPIOx_IDR) мы получаем текущее состояние порта в/в
Начнем с создания проекта:
nis@jane ~/stm32/f4examples/01-gpio $ cp -a 01-led_en/ 02-led_en_if_but_pres
nis@jane ~/stm32/f4examples/01-gpio $ cd 02-led_en_if_but_pres/
Нам необходимо изменить функцию work() в файле work.c чтобы светодиоды загорались только тогда, когда нажата кнопка на плате.
Соберем проект и загрузим готовую прошивку в МК:
nis@jane ~/stm32/f4examples/01-gpio/02-led_en_if_but_pres $ make
arm-softfloat-linux-gnueabi-gcc -g -O2 -mlittle-endian -mthumb -ffreestanding -nostdlib -nostdinc -mcpu=cortex-m3 -DSTM32F4XX -I. -I../../../../stm32/stlink/example/libs_stm/inc/base -I../../../../stm32/stlink/example/libs_stm/inc/core_support -I../../../../stm32/stlink/example/libs_stm/inc/device_support -Wl,-T,stm32f4xxxg_flash.ld -c -o work.o work.c
arm-softfloat-linux-gnueabi-gcc -g -O2 -mlittle-endian -mthumb -ffreestanding -nostdlib -nostdinc -mcpu=cortex-m3 -DSTM32F4XX -I. -I../../../../stm32/stlink/example/libs_stm/inc/base -I../../../../stm32/stlink/example/libs_stm/inc/core_support -I../../../../stm32/stlink/example/libs_stm/inc/device_support -Wl,-T,stm32f4xxxg_flash.ld -c -o startup.o startup.c
arm-softfloat-linux-gnueabi-gcc -g -O2 -mlittle-endian -mthumb -ffreestanding -nostdlib -nostdinc -mcpu=cortex-m3 -DSTM32F4XX -I. -I../../../../stm32/stlink/example/libs_stm/inc/base -I../../../../stm32/stlink/example/libs_stm/inc/core_support -I../../../../stm32/stlink/example/libs_stm/inc/device_support -Wl,-T,stm32f4xxxg_flash.ld -o firmware.elf work.o startup.o -L.
arm-softfloat-linux-gnueabi-objcopy -O binary firmware.elf firmware.bin
nis@jane ~/stm32/f4examples/01-gpio/02-led_en_if_but_pres $ make write
qstlink2 -cewV ./firmware.bin
Verbose level: 2
Info: Devices list loaded.
Info: File Path: "./firmware.bin"
Info: Erasing: true
Info: Writing: true
Info: Found an ST Link V2.
Info: Opening device...
Info: Device Open.
Info: ChipID: "413"
Info: Device type: "STM32F4**"
Info: Verify not yet implemented.
Info: Writing from "8000000" to "800005c"
Info: Erasing flash... This might take some time.
Info: Transfer done
Info: Disconnected.
После этого можно наблюдать следущее: