компилятор gnu as
код простейший, но если убрать NOP то работать не будет... что и удивило...
Код: Выделить всё
@.CharSet=CP1251
@GNU AS
@ +----------------------------------------------------+
@ | Демонстрационный проект "Мигалка" |
@ | микроконтроллер: К1921ВК035 (НИИЭТ) |
@ +----------------------------------------------------+
@ | Светодиод подключается к пину GPIO A Pin 6, вклю- |
@ | чение прямое, через резистор 1 кОм |
@ | |
@ | Пин 6 GPIOA является служебным, поэтому при его |
@ | настройке отключается блокировка смены режима пина |
@ | затем отключается альтернативная функция и потом |
@ | производится стандартная настройка пина |
@ | |
@ | Паузы при мигании задаются при помощи значений для |
@ | модуля генерации пауз таймера ядра SYSTICK |
@ +----------------------------------------------------+
.syntax unified @ синтаксис исходного кода
.Тамб @ тип используемых инструкций Тамб
.cpu кортекс-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
компилируется блок без сюрпризов
Код: Выделить всё
0000015c <Start>:
15c: f000 f847 bl 1ee <SYSTICK_START>
160: 4f1b ldr r7, [pc, #108] @ (1d0 <LOOP+0x16>)
162: f8d7 1100 ldr.w r1, [r7, #256] @ 0x100
166: f041 0101 orr.w r1, r1, #1
16a: f8c7 1100 str.w r1, [r7, #256] @ 0x100
16e: f8d7 1104 ldr.w r1, [r7, #260] @ 0x104
172: f041 0101 orr.w r1, r1, #1
176: f8c7 1104 str.w r1, [r7, #260] @ 0x104
17a: 4f16 ldr r7, [pc, #88] @ (1d4 <LOOP+0x1a>)
17c: 4916 ldr r1, [pc, #88] @ (1d8 <LOOP+0x1e>)
17e: f8c7 109c str.w r1, [r7, #156] @ 0x9c
182: bf00 nop ; ноп на месте
184: f04f 0140 mov.w r1, #64 @ 0x40
188: f8c7 10a4 str.w r1, [r7, #164] @ 0xa4
18c: 63b9 str r1, [r7, #56] @ 0x38