@.CharSet=CP1251
@GNU AS

@ +--------------------------------------------------------+
@ |         EXTI прерывания + Мигание светодиода           |
@ +--------------------------------------------------------+
@ |    Демонстрационная программа для STM32 VL Discovery   |
@ |           микроконтроллер  STM32F100RBT6               |
@ +--------------------------------------------------------+
@ |                                                        |
@ | Используемые пины:                                     |
@ |    LED: PC9 - мигание                                  |
@ }    LED: PC8 - переключение                             |
@ | BUTTON: PA0 - кнопка переключения (EXIT0)              |
@ |                                                        |
@ +--------------------------------------------------------+

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

.INCLUDE  "/src/inc/rcc.inc"
.INCLUDE  "/src/inc/gpio.inc"

.section .asmcode

@ основная программа
.global Start
Start:              @ поместите код своей программы ниже
                    BL      EXTI_PA0_INIT   @ инициализация EXTI 0

                    @ включим тактирование GPIO C   (при помощи BitBanding)
                    LDR        R0, = PERIPH_BASE + PERIPH_BB_BASE + ( RCC_BASE + RCC_APB2ENR ) * 32
                    MOV        R1, 1
                    STR        R1, [ R0, RCC_APB2ENR_IOPCEN_N * 4 ]

                    @ Настройка пина 9 GPIO C на выход с частотой 50 мгц
                    LDR        R0, = PERIPH_BASE + GPIOC_BASE
                    LDR        R1, [ R0, GPIO_CRH ]
                    MOV        R2, GPIO_MODE_OUT50
                    BFI        R1, R2, GPIO_CRH_MODE9_N, 4
                    BFI        R1, R2, GPIO_CRH_MODE8_N, 4
                    STR        R1, [ R0, GPIO_CRH ]

                    MOV        R0, 0
                    MOV        R1, 1
                    LDR        R2, = PERIPH_BASE + PERIPH_BB_BASE + ( GPIOC_BASE + GPIO_ODR ) * 32 @ адрес пина светодиода на запись

MAIN_LOOP:          @ главный цикл мигания, начало цикла
                    STR        R1, [ R2, 9 * 4 ]    @ зажгем светодиод

                    @ пауза
                    LDR        R3, = 0xfffff
pause1:             SUBS       R3, R3, 1
                    BNE        pause1

                    STR        R0, [ R2, 9 * 4 ]    @ потушим светодиод

                    @ пауза
                    LDR        R3, = 0xfffff
pause2:             SUBS       R3, R3, 1
                    BNE        pause2

                    B          MAIN_LOOP    @ циклимся на начало мигания


@ +-----------------------------------------------------------------+
@ | Процедура изменения состояния светодиода из прерывания по EXTI0 |
@ | из periph\exti\exti_pa0.asm                                     |
@ +-----------------------------------------------------------------+
.global LED_ChangeState
LED_ChangeState:    @ процедура вызывается в прерывании, поэтому R0-R3, R12 можно на стеке не сохранять, это уже сделано при
                    @ переходе mcu в обработчик прерыввния

                    @ переключим состояние светодиода
                    LDR        R0, = PERIPH_BASE + PERIPH_BB_BASE + ( GPIOC_BASE + GPIO_ODR ) * 32 @ адрес пина светодиода на запись

                    LDR        R2, = PERIPH_BASE + PERIPH_BB_BASE + ( GPIOC_BASE + GPIO_IDR ) * 32 @ адрес пина светодиода на чтение
                    LDR        R3, [ R2, 8*4 ]

                    TEQ        R3, 0x01    @ проверим  состояние светодиода
                    ITTEE      NE
                    MOVNE      R1, 1
                    STRNE      R1, [ R0, 8 * 4 ]  @ зажгем если не горит
                    MOVEQ      R1, 0
                    STREQ      R1, [ R0, 8 * 4 ]  @ потушим если горит

                    BX         LR
