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 5-го бита регистра RCC_APB2ENR
- ; BitAddress = BitBandBase + (RegAddr * 32) + BitNumber * 4
- MOV R1, #1 ; включаем тактирование порта С (в 4-й бит RCC_APB2ENR пишем '1`)
- STR R1, [R0] ; загружаем это значение
- MOV32 R0, GPIOC_CRL ; адрес порта
- MOV R1, #0x0333 ; 4-битная маска настроек для Output mode 50mHz, Push-Pull ("0011")
- LDR R2, [R0] ; считать порт
- BFI R2, R1, #0, #8 ; скопировать биты маски в позицию PIN0-PIN2
- STR R2, [R0]
- MOV R11, #0x00
- loop
- MOV32 R4, GPIOC_BSRR
- MOV32 R0, #0x0AAA
- MOV R1, #(PIN0) ; чип селект
- STR R1, [R4] ; Устанавливаем чип сел. в 1
- BL delay
- BL send_SPI
- B loop
- ENDP
- send_SPI PROC
- PUSH {R1, R4, R11, R0}
- MOV32 R5, #(0x800)
- MOV R1, #(PIN0 << 16)
- STR R1, [R4] ;устанавливаем чип сел. в 0
- spi_loop
- MOV R3, #(PIN2) ; Данные лог 1
- AND R6, R0, R5 ;побитового сравниваем R5 R0 , если старший бит в R0=1, то в R6 записан R5, наоборот 0
- CMP R6, #0x00
- ITEE NE
- STRNE R3, [R4] ;если R6 не равно 0 на пин2 выставляется 1
- MOVEQ R3, #(PIN2 << 16) ;Данные лог. 0
- STREQ R3, [R4] ;если равен на пин2 - 0
- BL delay
- MOV R2, #(PIN1) ; Такты
- STR R2, [R4] ;Выставляется такт на пин1
- BL delay
- MOV R2, #(PIN1 << 16) ;Такты
- STR R2, [R4] ;возвращаем такт в 0
- LSR R5 ,#1 ;смещаем бит в R5 на 1bit вправо
- ADD R11, #1
- CMP R11, #12
- IT NE
- BNE spi_loop
- POP {R1, R4, R11, R0}
- BX LR
- ENDP
- delay PROC ; Подпрограмма задержки
- PUSH {R0} ; Загружаем в стек R0, т.к. его значение будем менять
- LDR R0, =DELAY_VAL ; псевдоинструкция Thumb (загрузить константу в регистр)
- delay_loop
- SUBS R0, #1 ; SUB с установкой флагов результата
- IT NE
- BNE delay_loop ; переход, если Z==0 (результат вычитания не равен нулю)
- POP {R0} ; Выгружаем из стека R0
- BX LR ; выход из подпрограммы (переход к адресу в регистре LR - вершина стека)
- ENDP
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement