Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- PRESERVE8 ; 8-битное выравнивание стека
- THUMB ; Режим Thumb (AUL) инструкций
- GET config.s ; include-файлы
- GET stm32f10x.s
- AREA RESET, CODE, READONLY
- ; Таблица векторов прерываний
- DCD STACK_TOP ; Указатель на вершину стека
- DCD Reset_Handler ; Вектор сброса
- ENTRY ; Точка входа в программу
- Reset_Handler PROC ; Вектор сброса
- EXPORT Reset_Handler ; Делаем Reset_Handler видимым вне этого файла
- main ; Основная подпрограмма
- MOV32 R0, PERIPH_BB_BASE + \
- RCC_APB2ENR * 32 + \
- 4 * 4 ; вычисляем адрес для BitBanding 4-го бита регистра RCC_APB2ENR
- ; BitAddress = BitBandBase + (RegAddr * 32) + BitNumber * 4
- MOV R1, #1 ; включаем тактирование порта C (в 4-й бит RCC_APB2ENR пишем '1`)
- STR R1, [R0] ; загружаем это значение
- MOV32 R0, GPIOC_CRH ; адрес (port configuration register high) порта
- MOV R1, #0x03 ; 4-битная маска настроек для Output mode 50mHz, Push-Pull ("0011")- узнать, почему push-pull
- LDR R2, [R0] ; считать порт
- BFI R2, R1, #4, #4 ; скопировать биты маски в позицию PIN9
- STR R2, [R0] ; загрузить результат в регистр настройки порта
- LDR R6, =DELAY_VAL ;
- button
- MOV32 R0, PERIPH_BB_BASE + \
- RCC_APB2ENR * 32 + \
- 2 * 4
- MOV R1, #1 ; включаем тактирование порта A (в 2-й бит RCC_APB2ENR пишем '1`)
- STR R1, [R0] ; загружаем это значение
- MOV32 R0, GPIOA_CRL ; адрес порта
- MOV R1, #0x08 ; 4-битная маска настроек для Input mode, Pull-Down ("1000")
- LDR R2, [R0] ; считать порт
- BFI R2, R1, #0, #4 ; скопировать биты маски в позицию PA0
- STR R2, [R0] ; загрузить результат в регистр настройки порта
- MOV32 R3, GPIOA_BRR ; подтяжка к земле
- MOV R4, #0x01 ;
- STR R4, [R3] ;
- increment
- SUB R6, #0x50000
- CMP R6, #0x10000
- IT LT
- LDRLT R6, =DELAY_VAL
- loop ; Бесконечный цикл
- MOV32 R0, GPIOC_BSRR ; адрес порта выходных сигналов
- MOV32 R1, GPIOA_IDR ; адрес порта входных сигналов
- LDR R2, [R1] ;
- ANDS R2, #0x01 ;
- IT NE ;
- BLNE increment ;
- MOV R1, #(PIN9) ; устанавливаем вывод в '1'
- STR R1, [R0] ; загружаем в порт
- BL delay ; задержка
- MOV R1, #(PIN9 << 16) ; сбрасываем в '0'
- STR R1, [R0] ; загружаем в порт
- BL delay ; задержка
- B loop ; возвращаемся к началу цикла
- ENDP
- delay PROC ; Подпрограмма задержки
- PUSH {R6} ; Загружаем в стек R6, т.к. его значение будем менять
- delay_loop
- SUBS R6, #1 ; SUB с установкой флагов результата
- IT NE
- BNE delay_loop ; переход, если Z==0 (результат вычитания не равен нулю)
- POP {R6} ; Выгружаем из стека R0
- BX LR ; выход из подпрограммы (переход к адресу в регистре LR - вершина стека)
- ENDP
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement