Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Test STM32F4-Assembler project
- ; http://teplofizik.diary.ru/p179507788.htm
- ; 1. Первая версия.
- ; 2. Оформленные функции управления светодиодов.
- ; 3. Разделение по модулям.
- ; 4. Инициализация стандартной библиотеки и подключение C-файла
- ; 5. Реализация SPI и подключение акселерометра.
- ; 6. Переменные в памяти
- ; Секция переменных
- AREA RAM, NOINIT, READWRITE, ALIGN=3
- rAccelX DCD 0 ; 0: Значение ускорения по оси Х
- ; 1: Знак ускорения, 1 если минус
- rAccelY DCD 0
- rAccelZ DCD 0
- rButton DCD 0
- AREA |.text|, CODE, READONLY
- GET led.inc ; Драйвер светодиодов
- GET button.inc ; Драйвер кнопки
- GET system.inc ; Задержка
- GET spi.inc ; SPI
- GET accel.inc ; Акселерометр
- GET math.inc ; Математика
- ; Объявления
- ACCEL_PERIOD EQU 100 ; Период опроса акселерометра
- ; Записывает ускорение и её знак в переменную
- ; Аргументы: 2
- ; R0: Значение ускорения в дополнительном коде
- ; R1: Адрес структуры, куда записать результат. {u8 Value; u8 Sign; }
- ; Результат: нет
- WriteAccel PROC
- PUSH {R4,LR}
- MOV R4, R1
- ; Проверим знаковый бит
- TST R0, #0x80
- BEQ wa_Plus
- BL abs8
- MOV R2, #0x1 ; Знак -
- B wa_Write
- wa_Plus
- MOV R2, #0 ; Знак +
- wa_Write
- ; Максимальное значение числа в условиях лежания порядка 60.
- ; Домножим на 4 для масштаба
- LSL R0, #2
- ; Запишем число
- STRB R0, [R4, #0]
- ; Запишем знак
- STRB R2, [R4, #1]
- POP {R4,PC}
- ENDP
- ; Зажигает или гасит выбранный светодиод в зависимости от счётчика и порога PWM
- ; Аргументы: 4
- ; R0: номер светодиода
- ; R1: адрес структуры со значениями ускорения
- ; R2: значение счётчика ШИМ
- ; R3: знак ускорения (если не совпадает с измеренным - выходим)
- ; Результат: нет
- PWMAccel PROC
- pwmaccel ROUT ; Для локальных меток (как пример)
- PUSH {R4-R6,LR}
- MOV R4, R0 ; Номер светодиода
- MOV R5, R1 ; Адрес структуры
- MOV R6, R2 ; Счётчик
- ; Загрузим знак и сравним с заданным
- LDRB R0, [R5, #1]
- CMP R0, R3
- ; Если не равно - выходим
- BNE %1pwmaccel
- ; Загрузим абсолютную величину ускорения (регистр сравнения)
- LDRB R5, [R5, #0]
- ; Если счётчик не равен нулю, пропустим процесс зажигания
- CMP R6, #0
- BNE %2pwmaccel
- ; Если счётчик равен нулю, то надо зажечь светодиод, при условии
- ; что в регистре сравнения не ноль.
- CMP R5, #0
- BEQ %2pwmaccel
- ; Что ж, зажжём светодиод
- MOV R0, R4
- BL LedOn
- 2pwmaccel ; Пропуск зажигания светодиода
- ; Если регистр сравнения и счётчик равны - гасим.
- CMP R6, R5
- BNE %1pwmaccel ; Выходим
- MOV R0, R4
- BL LedOff
- 1pwmaccel ; Выход
- POP {R4-R6,PC}
- ENDP
- EXPORT main
- main PROC
- ; Инициализация кнопок и светодиодов
- BL LedInit
- BL ButtonInit
- ; Инициализация SPI
- BL SpiInit
- ; Инициализация акселерометра
- BL AccelInit
- ; R4 - счётчик ШИМ
- MOV R4, #0
- ; R5 - период опроса акселерометра
- LDR R5, =ACCEL_PERIOD
- ; Главный цикл программы
- __mainloop
- ; Запишем статус кнопки в переменную rButton
- BL ButtonGet
- LDR R1, =rButton
- STRB R0, [R1]
- ; Верх (+Y)
- MOV R0, #0 ; Светодиод левый, 0
- LDR R1, =rAccelY ; Адрес переменной
- MOV R2, R4 ; Счётчик ШИМ
- MOV R3, #1 ; Знак минус
- BL PWMAccel
- ; Низ (-Y)
- MOV R0, #2 ; Светодиод правый, 2
- LDR R1, =rAccelY ; Адрес переменной
- MOV R2, R4 ; Счётчик ШИМ
- MOV R3, #0 ; Знак плюс
- BL PWMAccel
- ; Лево (-X)
- MOV R0, #1 ; Светодиод левый, 1
- LDR R1, =rAccelX ; Адрес переменной
- MOV R2, R4 ; Счётчик ШИМ
- MOV R3, #1 ; Знак плюс
- BL PWMAccel
- ; Право (+X)
- MOV R0, #3 ; Светодиод нижний, 3
- LDR R1, =rAccelX ; Адрес переменной
- MOV R2, R4 ; Счётчик ШИМ
- MOV R3, #0 ; Знак минус
- BL PWMAccel
- ; Прибавить и огранияить байтом
- ADD R4, #1
- AND R4, #0xFF
- ; Период проверим
- SUBS R5, #1
- BNE __mainloop
- ; Перезарядим счётчик
- LDR R5, =ACCEL_PERIOD
- ; Прочитаем ускорение по осям. Запишем результаты
- BL AccelX
- LDR R1, =rAccelX
- BL WriteAccel
- BL AccelY
- LDR R1, =rAccelY
- BL WriteAccel
- BL AccelZ
- LDR R1, =rAccelZ
- BL WriteAccel
- ; На очередной круг
- B __mainloop
- ENDP
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement