@.CHARSET =CP1251
@GNU AS
@ +--------------------------------------------------------+
@ |  Демонстрационная программа для STM32F030 DEMO BOARD   |
@ |           микроконтроллер  STM32F030F4P6               |
@ |            (без настройки тактирования)                |
@ |             от DegitalSlavik (Telegram)                |
@ +--------------------------------------------------------+
@ |            Мигание светодиода через прерывание         |
@ |                           SysTick                      |
@ |                                                        |
@ | Используемый порт: GPIOA                               |
@ | Используемые пины: 4 (мигание светодиода)              |
@ |                                                        |
@ +--------------------------------------------------------+
.SYNTAX   unified             @ синтаксис исходного кода
.THUMB                        @ тип используемых инструкций Thumb
.CPU      cortex-m0           @ процессор

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

.SECTION  .asmcode

@ прерывание
.GLOBAL   IRQ_SysTick
IRQ_SysTick:
                    LDR        R0, = GPIOA
                    LDR        R1, [ R0, GPIO_ODR ]
                    MOVS       R2, 1<<4
                    ANDS       R1, R1, R2
                    BNE        LED1

                    LDR        R2, = GPIO_BSRR_BS_4
LED2:
                    STR        R2, [ R0, GPIO_BSRR ]
                    BX         LR

LED1:               LDR        R2, = GPIO_BSRR_BR_4
                    B          LED2

@ основная программа
.GLOBAL   Start
Start:
                    LDR        R0, = RCC + RCC_AHBENR    @ загрузим в регистр R0 адрес регистра RCC_AHBENR
                    LDR        R1, [ R0 ]    @ загрузим в регистр R1 содержимое по адресу в памяти, который находится в R0
                    LDR        R2, = RCC_AHBENR_IOPAEN    @ загрузим в регистр R2 маску бита IOPAENR регистра RCC_AHBENR
                    ORRS       R1, R1, R2    @ сделаем логическое OR с регистрами R1 и R2, результат вернем в R2 (этим мы установили бит IOPAEN)
                                                         @ т.е. включили тактирование GPIOA
                    STR        R1, [ R0 ]    @ значение в R1 передадим в ячейку памяти адрес которой хранится в R0 (там сейчас адрес регистра RCC_AHBENR)
                                                         @ этой командой мы передали новое значение в регистр RCC_AHBENR
                    LDR        R0, = GPIOA    @ загрузим в R0 адрес регистра GPIOA
                    LDR        R1, [ R0, GPIO_MODER ]    @ загрузим в R1 адрес GPIOA со смещением GPIO_MODER - тем самым получаем в R1 адрес GPIOA_MODER
                    LDR        R2, = GPIO_MODER_GENERAL_OUT << GPIO_MODER_4_N    @ PA4 установим как выход
                    ORRS       R1, R1, R2    @ R1 OR R2 -> логическое OR регистров R1 и R2 - результат в R1
                    STR        R1, [ R0, GPIO_MODER ]    @ передадим в регистр модифицированое значение

                    LDR        R2, = GPIO_BSRR_BS_4
                    STR        R2, [ R0, GPIO_BSRR ]
@ Systik
                    @------в настройка SysTick (STK)
                    LDR        R0, = STK
                    LDR        R1, = STK_CSR_CLKSOURCE + STK_CSR_ENABLE + STK_CSR_TICKINT
                    STR        R1, [ R0, STK_CSR ]
                    @-------ЗАГРУЗИМ В РЕГИСТР RVR ЧИСЛО
                    LDR        R1, = 0x400000
                    STR        R1, [ R0, STK_RVR ]

loop:               B          loop    @ вернемся на метку loop (бесконечный цикл)





