@.CharSet=CP1251
@GNU AS

@.DESC type=module
@ +------------------------------------------------------------------------------+
@ |                              Проект демонстратор                             |
@ |                       Контроллер внешних прерываний EXTI                     |
@ |                                                                              |
@ |   для микроконтроллера STM32F4xxx   отладочная плата  MiniSTM32F401          |
@ +------------------------------------------------------------------------------+
@ |                                                                              |
@ | При нажатии на кнопку User\WakeUp вызывается процедура LED_ChangeState в ко- |
@ | торой переключается состояние светодиода                                     |
@ |                                                                              |
@ | ВНИМАНИЕ !                                                                   }
@ } Для корректной работы модуля необходима полная таблица прерываний isr.asm    |
@ | ( Core + Periph )                                                            |
@ |                                                                              |
@ +------------------------------------------------------------------------------+
@ | На отладочной плате MiniSTM32F401 кнопка подключена к GPIOA pin 0            |
@ | Кнопка при нажатии прижимает GPIOA pin 0 к земле                             |
@ | Светодиод подключен к GPIOC pin 13, причем светодиод зажигается нулевым      |
@ | потенциалом  на пине микроконтроллера                                        |
@ +------------------------------------------------------------------------------+


.syntax unified     @ синтаксис исходного кода
.thumb              @ тип используемых инструкций Thumb
.cpu cortex-m4      @ процессор
.fpu fpv4-sp-d16    @ сопроцессор


.section .asmcode

@ основная программа
.global Start
Start:
                    @ настройка  тактирования
                    BL   SYSCLK84_START

.include  "/src/periph/rcc/rcc_ahb1enr_gpio_set.inc"    @ включение тактирования для GPIO
.include  "/src/periph/gpio/gpio_a_conf.inc"            @ Настройка GPIOA
.include  "/src/periph/gpio/gpio_c_conf.inc"            @ Настройка GPIOC

                    BL         EXTI_PA0_INIT    @ инициализируем EXTI на GPIOA pin 0

                    @ используем R6 - для хранения адреса битбандинга
                    @            R5 - для хранения состояния светодиода
                    LDR        R6, =  PERIPH_BB_BASE + ( GPIOC_BASE + GPIO_ODR ) * 32
                    MOV        R5, 1
                    STR        R5, [ R6, 13 * 4 ]

MAIN_LOOP:          B    MAIN_LOOP


@.desc name=LED_ChangeState type=proc
@ +--------------------------------------------------------------------------------+
@ |    Процедура изменения состояния светодиода, выхывается из прерывания EXTI0    |
@ +--------------------------------------------------------------------------------+
@.enddesc

.global LED_ChangeState
LED_ChangeState:
                    @ R5 и R6 мы нигде не  изменяем, так что просто их применяем в изменении состояния светодиода
                    CMP        R5, 0                        @ if R5=0
                    ITE        EQ                           @
                    MOVEQ      R5, 1                        @    then R5=1
                    MOVNE      R5, 0                        @    else R5=0

                    STR        R5, [ R6, 13 * 4 ]           @ установим новое состояние светодиода

                    BX         LR
