@.CharSet=CP1251
@GNU AS

@ +----------------------------------------------------+
@ |         Демонстрационный проект "Мигалка"          |
@ |        микроконтроллер: К1921ВК035 (НИИЭТ)         |
@ +----------------------------------------------------+
@ | Светодиод подключается к пину  GPIO A Pin 6, вклю- |
@ | чение прямое, через резистор 1 кОм                 |
@ |                                                    |
@ | Пин 6 GPIOA  является служебным, поэтому при его   |
@ | настройке отключается блокировка смены режима пина |
@ | затем  отключается  альтернативная функция и потом |
@ | производится стандартная настройка пина            |
@ |                                                    |
@ | Паузы при мигании задаются при помощи значений для |
@ | модуля генерации пауз таймера ядра SYSTICK         |
@ +----------------------------------------------------+

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

.INCLUDE  "/src/inc/siu.inc"
.INCLUDE  "/src/inc/rcu.inc"
.INCLUDE  "/src/inc/gpio.inc"

.section .asmcode

@ основная программа
.global Start
Start:              @ поместите код своей программы ниже
                    BL              SYSTICK_START        @ настройка модуля генерации пауз при помощи системного таймера (SYSTICK)

            @ Включаем GPIOA в блоке RCU
                    LDR             R7, = RCU_BASE

                    @ Включаем тактирование GPIOA
                    LDR             R1, [ R7, RCU_HCLKCFG ]
                    ORR             R1, R1, RCU_HCLKCFG_GPIOAEN
                    STR             R1, [ R7, RCU_HCLKCFG ]

                    @ Включаем GPIOA
                    LDR             R1, [ R7, RCU_HRSTCFG ]
                    ORR             R1, R1, RCU_HRSTCFG_GPIOAEN
                    STR             R1, [ R7, RCU_HRSTCFG ]

            @ настройка пинов GPIOA
                    LDR             R7, = GPIOA_BASE

                    @ Выключение альтернативной функции GPIOA PIN6
                    @ данный пин используется как один из сигналов JTAG интерфейса
                    @ поэтому изменение его режима заблокировано, чтобы перенастроить пин:
                    @ снимем блокировку
                    LDR             R1, = 0xADEADBEE
                    STR             R1, [ R7, GPIO_LOCKKEY ]
                    NOP                                       @ задержка ! блокировка снимется только через такт исполнения

                    MOV             R1, 1 << 6                           @ сбросим блокировку перенастройки пина 6 GPIOA
                    STR             R1, [ R7, GPIO_LOCKCLR ]

                    @ выключаем альт. функцию для GPIOA_PIN6
                    STR             R1, [ R7, GPIO_ALTFUNCCLR ]

                    @ Настройка режима работы пинов
                    LDR             R1, [ R7, GPIO_DENSET ]
                    ORR             R1, R1, GPIO_DENSET_PIN6              @ цифровой ввод\вывод
                    STR             R1, [ R7, GPIO_DENSET ]

                    @ настройка скорости и нагрузочной способности
                    LDR             R1, [ R7, GPIO_DRIVEMODE ]
                    MOV             R2, 0                                 @ скорость макс. \ нагрузка макс.
                    BFI             R1, R2, GPIO_DRIVEMODE_PIN6_N, 2
                    STR             R1, [ R7, GPIO_DRIVEMODE ]

                    @ Режим подтяжки пинов
                    LDR             R1, [ R7, GPIO_PULLMODE ]
@ значение задано выше   MOV             R2, 0                            @ нет подтяжки
                    BFI             R1, R2, GPIO_PULLMODE_PIN6_N, 2
                    STR             R1, [ R7, GPIO_PULLMODE ]

                    @ Выбор выходного каскада пина
                    LDR             R1, [ R7, GPIO_OUTMODE ]
@ значение задано выше   MOV             R2, 0                            @ Двухтактный выход (push\pull)
                    BFI             R1, R2, GPIO_OUTMODE_PIN6_N, 2
                    STR             R1, [ R7, GPIO_OUTMODE ]

                    @ включаем режим управления пином при помощи GPIO_DATAOUT
                    LDR             R1, [ R7, GPIO_OUTENSET ]
                    ORR             R1, R1, GPIO_OUTENSET_PIN6            @ режим General (управление от регистра DATAOUT)
                    STR             R1, [ R7, GPIO_OUTENSET ]

@ значение задано выше   MOV             R1, 1 << 6    @ управление GPIO_PIN6

LOOP:
                    @ установим значение пина в "1"
                    STR             R1, [ R7, GPIO_DATAOUTSET ]  @ установим бит (пин)

                    @ пауза
                    MOV             R0, 250                      @ значение задержки
                    BL              SYSTICK_DELAY

                    @ сбросим значение пина в "0"
                    STR             R1, [ R7, GPIO_DATAOUTCLR ]  @ сбросим бит (пин)

                    MOV             R0, 250                      @ значение задержки
                    BL              SYSTICK_DELAY

                    B               LOOP






