@.CharSet=CP1251
@GNU AS

@ +--------------------------------------------------------+
@ |    Демонстрационная программа для STM32F030 DEMO BOARD |
@ |           микроконтроллер  STM32F030F4P6               |
@ |            (без настройки тактирования)                |
@ +--------------------------------------------------------+
@ |            Мигание светодиода                          |
@ |                                                        |
@ | Используемый порт: GPIOA                               |
@ | Используемые пины: 4 (мигание светодиода)              |
@ |                                                        |
@ +--------------------------------------------------------+

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

.include "/src/inc/rcc.inc"
.include "/src/inc/gpio.inc"

.section .asmcode

@ основная программа
.GLOBAL   Start
Start:              @ поместите код своей программы ниже
               @ включение тактирования GPIOA
                    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
               @ настройка pin 4 GPIOA на выход
                    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       @ загрузим в R2 маску для установки бита GPIOA pin 4
                    LDR        R4, =GPIO_BSRR_BR_4       @ загрузим в R4 маску для сброса бита GPIOA pin 4
loop:

                 @ зажгем светодиод
                    STR        R2, [ R0, GPIO_BSRR ]     @ передадим в регистр GPIO_BSRR значение регистра для включения светодиода
                    BL         DELAY                     @ сделаем задержку

                 @ потушим светодиод
                    STR        R4, [ R0, GPIO_BSRR ]     @ передадим в регистр GPIO_BSRR значение регистра для выключения светодиода
                    BL         DELAY                     @ сделаем задержку

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


@--------------------------------Подпрограммы-----------------------------------------
DELAY:              @ задержка приблизительно 0,8 секунды
                    LDR        R3, = 0x00100000    @ загрузим число 0х00100000 в регистр R3
delay_loop:
                    SUBS       R3, R3, #1    @ вычтем из R3 единицу (декремент) результат обратно в R3
                    BNE        delay_loop    @ условный переход: если в результате вычитания флаг Z=0 то выполняем следующюю команду
                                             @ если в результате вычитания Z<>0 то переходим на метку delay_loop

                    BX         LR            @ возврат из подпрограммы




