Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Драйвер светодиодов
- ; Плата STM32F4-Discovery
- AREA |.text|, CODE, READONLY
- EXPORT LedInit
- EXPORT LedOn
- EXPORT LedOff
- ; Объявления
- RCC_AHB1ENR EQU 0x40023830
- RCC_AHB1ENR_GPIODEN EQU 0x00000008 ; 3 бит
- GPIOD_BASE EQU 0x40020C00
- GPIO_MODER_OFFSET EQU 0x00000000
- GPIO_MODER_MODER12_0 EQU 0x01000000
- GPIO_MODER_MODER13_0 EQU 0x04000000
- GPIO_MODER_MODER14_0 EQU 0x10000000
- GPIO_MODER_MODER15_0 EQU 0x40000000
- GPIO_PUPDR_OFFSET EQU 0x0000000C
- GPIO_PUPDR_PUPDR12_0 EQU 0x01000000
- GPIO_PUPDR_PUPDR13_0 EQU 0x04000000
- GPIO_PUPDR_PUPDR14_0 EQU 0x10000000
- GPIO_PUPDR_PUPDR15_0 EQU 0x40000000
- GPIO_BSRRL_OFFSET EQU 0x00000018 ; Сброс
- GPIO_BSRRH_OFFSET EQU 0x0000001A ; Установка
- GPIO_BSSR_PIN12 EQU 0x00001000 ; 12 бит
- GPIO_BSSR_PIN13 EQU 0x00002000 ; 13 бит
- GPIO_BSSR_PIN14 EQU 0x00004000 ; 14 бит
- GPIO_BSSR_PIN15 EQU 0x00008000 ; 15 бит
- ; Получить маску для зажигания светодиода по его номеру
- ; Аргументы: 1
- ; R0 - номер светодиода, от 0 до 3
- ; Результат: маска, если номер не верный, в R0 будет 0.
- GetPinMask PROC
- ; Другой способ выбора:
- CMP R0, #0
- BEQ GetPinMask_led0
- CMP R0, #1
- BEQ GetPinMask_led1
- CMP R0, #2
- BEQ GetPinMask_led2
- CMP R0, #3
- BEQ GetPinMask_led3
- ; Ошибка
- B GetPinMask_error
- GetPinMask_led0 ; Светодиод 0
- MOV R0, #GPIO_BSSR_PIN12 ; 12 бит
- B GetPinMask_return
- GetPinMask_led1 ; Светодиод 1
- MOV R0, #GPIO_BSSR_PIN13 ; 13 бит
- B GetPinMask_return
- GetPinMask_led2 ; Светодиод 2
- MOV R0, #GPIO_BSSR_PIN14 ; 14 бит
- B GetPinMask_return
- GetPinMask_led3 ; Светодиод 3
- MOV R0, #GPIO_BSSR_PIN15 ; 15 бит
- B GetPinMask_return
- GetPinMask_error ; Ошибка
- MOV R0, #0
- GetPinMask_return
- BX LR
- ENDP
- ; Погасить светодиод по его номеру
- ; Аргументы: 1
- ; R0 - номер светодиода, от 0 до 3
- ; Результат: нет
- LedOff PROC
- ; Сохраним в стеке адрес возврата
- PUSH {LR}
- ; Получить маску
- BL GetPinMask
- ; Если 0, то выходим
- CMP R0, #0
- BEQ LedOff_return
- ; В R0 теперь маска
- ; Погасить выбронный светодиод
- LDR R1, =GPIOD_BASE
- STR R0, [R1, #GPIO_BSRRH_OFFSET]
- LedOff_return
- ; Возврат из процедуры
- POP {PC}
- ENDP
- ; Зажечь светодиод по его номеру
- ; Аргументы: 1
- ; R0 - номер светодиода, от 0 до 3
- ; Результат: нет
- LedOn PROC
- ; Сохраним в стеке адрес возврата
- PUSH {LR}
- ; Получить маску
- BL GetPinMask
- ; Если 0, то выходим
- CMP R0, #0
- BEQ LedOn_return
- ; В R0 теперь маска
- ; Зажечь выбронный светодиод
- LDR R1, =GPIOD_BASE
- STR R0, [R1, #GPIO_BSRRL_OFFSET]
- LedOn_return
- ; Возврат из процедуры
- POP {PC}
- ENDP
- ; Инициализация выводов, подключённых к светодиодам
- ; Аргументы: нет
- ; Результат: нет
- LedInit PROC
- ; Разрешим тактирование порта D
- ; Загрузим в регистр R0 адрес регистра RCC_AHB1ENR
- LDR R0, =RCC_AHB1ENR
- ; Прочитаем в регистр R1 его содержимое
- LDR R1, [R0]
- ; Установим бит тактирования порта D
- ORR R1, R1, #RCC_AHB1ENR_GPIODEN
- ; Запишем обратно
- STR R1, [R0]
- ; Установим режим работы выводов (выход)
- LDR R0, =GPIOD_BASE
- ; Прочитаем в регистр R1 его содержимое
- LDR R1, [R0, #GPIO_MODER_OFFSET]
- ; Установим необходимые биты для выводов 12-15
- ORR R1, R1, #GPIO_MODER_MODER12_0
- ORR R1, R1, #GPIO_MODER_MODER13_0
- ORR R1, R1, #GPIO_MODER_MODER14_0
- ORR R1, R1, #GPIO_MODER_MODER15_0
- ; Запишем обратно
- STR R1, [R0, #GPIO_MODER_OFFSET]
- ; Подтяжка к питанию
- LDR R0, =GPIOD_BASE
- LDR R1, [R0, #GPIO_PUPDR_OFFSET]
- ; Установим необходимые биты для выводов 12-15
- ORR R1, R1, #GPIO_PUPDR_PUPDR12_0
- ORR R1, R1, #GPIO_PUPDR_PUPDR13_0
- ORR R1, R1, #GPIO_PUPDR_PUPDR14_0
- ORR R1, R1, #GPIO_PUPDR_PUPDR15_0
- ; Запишем обратно
- STR R1, [R0, #GPIO_PUPDR_OFFSET]
- BX LR
- ENDP
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement