Пишу в Keil на ASM со стандартного примера:
Код: Выделить всё
; Test STM32F4-Assembler project
AREA |.text|, CODE, READONLY
GET led.inc ; Драйвер светодиодов
GET button.inc ; Драйвер кнопки
GET system.inc ; Задержка
; Объявления
HIGH EQU 0x00000001 ;EQU 0x000F4240 ; 1000000UL
LOW EQU 0x00000001
EXPORT __main
__main PROC
; Инициализация кнопок и светодиодов
BL LedInit
BL ButtonInit
; В регистр R4 запишем величину задержки
LDR R4, =HIGH
LDR R6, =LOW
; Начнём с нулевого светодиода
; R5 - номер текущего светодиода
MOV R5, #0
; Главный цикл программы
__mainloop
; Если кнопка нажата - светятся все светодиоды.
BL ButtonGet
CMP R0, #1
BEQ __button_1
__button_0
; Кнопка не нажата
; Прибавляем 1
;ADD R5, R5, #1
; Проверяем: не более 3х
;CMP R5, #4
;BNE __button_end
; На новый круг, с 0
;MOV R5, #0
B __button_end
__button_1
; Кнопка нажата
; Проверяем: >= 0
SUBS R5, R5, #1
BPL __button_end
; Заём бита произошёл, -1.
; На новый круг, с 3х
MOV R5, #3
; Все проверки на более 3х или менее 0 можно заменить на более простую конструкцию:
; MVN R0, #3 ; Переместить и инвертировать
; AND R5, R5, R0 ; Оставить только младшие 2 бита
__button_end
; Зажжём светодиод N
MOV R0, R5
BL LedOn
; Задержка
MOV R0, R4
BL delay
; Погасим светодиод N
MOV R0, R5
BL LedOff
MOV R0, R6
BL delay
; На очередной круг
B __mainloop
ENDP
END
Ок, все должно летать, но лишь ~160кГц, если я ничего не перепутал, глядя на осциллограф. На форумах читал, что задержка выполняется 10 машинных циклов, и частота для вывода падает в 10. Теперь я совсем запутался, и хочу понять, что на самом деле сейчас происходит, и как мне получить сигнал=меандр хотя бы 10МГц? Я сейчас еще усмотрел логику, что упоминается "1000000UL", может тактовая у меня сейчас 1МГц?! Хотя в свойствахпроекта XTAL = 25.0 А в идеале нужно все 100МГЦ и >