Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Test STM32F4-Assembler project
- ; http://teplofizik.diary.ru/p179508680.htm
- ; 1. Первая версия.
- ; 2. Оформленные функции управления светодиодов.
- ; 3. Разделение по модулям.
- ; 4. Инициализация стандартной библиотеки и подключение C-файла
- ; 5. Реализация SPI и подключение акселерометра.
- ; 6. Переменные в памяти, локальные метки. (Показометр низа)
- ; 7. Программное прерывание.
- ; Проверять выравнивание стека (8 байт)
- PRESERVE8
- ; Секция переменных
- 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
- ; Обрежем, если слишком много
- CMP R0, #0xFF
- IT GT
- MOVGT R0, #0xFF
- ; Запишем число
- 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 - период опроса акселерометра
- MOV32 R5, ACCEL_PERIOD
- ; Главный цикл программы
- __mainloop
- ; Запишем статус кнопки в переменную rButton
- BL ButtonGet
- MOV32 R1, rButton
- STRB R0, [R1]
- ; Верх (+Y)
- MOV R0, #0 ; Светодиод левый, 0
- MOV32 R1, rAccelY ; Адрес переменной
- MOV R2, R4 ; Счётчик ШИМ
- MOV R3, #1 ; Знак минус
- BL PWMAccel
- ; Низ (-Y)
- MOV R0, #2 ; Светодиод правый, 2
- MOV32 R1, rAccelY ; Адрес переменной
- MOV R2, R4 ; Счётчик ШИМ
- MOV R3, #0 ; Знак плюс
- BL PWMAccel
- ; Лево (-X)
- MOV R0, #1 ; Светодиод левый, 1
- MOV32 R1, rAccelX ; Адрес переменной
- MOV R2, R4 ; Счётчик ШИМ
- MOV R3, #1 ; Знак плюс
- BL PWMAccel
- ; Право (+X)
- MOV R0, #3 ; Светодиод нижний, 3
- MOV32 R1, rAccelX ; Адрес переменной
- MOV R2, R4 ; Счётчик ШИМ
- MOV R3, #0 ; Знак минус
- BL PWMAccel
- ; Прибавить и ограничить байтом
- ADD R4, #1
- AND R4, #0xFF
- ; Период проверим
- SUBS R5, #1
- BNE __mainloop
- ; Перезарядим счётчик
- MOV32 R5, ACCEL_PERIOD
- ; Прочитаем ускорение по осям. Запишем результаты
- BL AccelX
- MOV32 R1, rAccelX
- BL WriteAccel
- BL AccelY
- MOV32 R1, rAccelY
- BL WriteAccel
- BL AccelZ
- MOV32 R1, rAccelZ
- BL WriteAccel
- SVC 1
- ; На очередной круг
- B __mainloop
- ENDP
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement