Advertisement
teplofizik

main.s (7)

Aug 9th, 2012
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Test STM32F4-Assembler project
  2. ; http://teplofizik.diary.ru/p179508680.htm
  3.  
  4. ; 1. Первая версия.
  5. ; 2. Оформленные функции управления светодиодов.
  6. ; 3. Разделение по модулям.
  7. ; 4. Инициализация стандартной библиотеки и подключение C-файла
  8. ; 5. Реализация SPI и подключение акселерометра.
  9. ; 6. Переменные в памяти, локальные метки. (Показометр низа)
  10. ; 7. Программное прерывание.
  11.  
  12.     ; Проверять выравнивание стека (8 байт)
  13.     PRESERVE8
  14.  
  15.     ; Секция переменных
  16.     AREA    RAM, NOINIT, READWRITE, ALIGN=3
  17.  
  18. rAccelX     DCD 0 ; 0: Значение ускорения по оси Х
  19.                   ; 1: Знак ускорения, 1 если минус
  20. rAccelY     DCD 0
  21. rAccelZ     DCD 0
  22.  
  23. rButton     DCD 0
  24.  
  25.     AREA    |.text|, CODE, READONLY
  26.  
  27.     GET led.inc    ; Драйвер светодиодов
  28.     GET button.inc ; Драйвер кнопки
  29.     GET system.inc ; Задержка
  30.     GET spi.inc    ; SPI
  31.     GET accel.inc  ; Акселерометр
  32.     GET math.inc   ; Математика
  33.    
  34. ; Объявления
  35. ACCEL_PERIOD         EQU 100 ; Период опроса акселерометра
  36.  
  37. ; Записывает ускорение и её знак в переменную
  38. ; Аргументы: 2
  39. ;  R0: Значение ускорения в дополнительном коде
  40. ;  R1: Адрес структуры, куда записать результат. {u8 Value; u8 Sign; }
  41. ; Результат: нет
  42. WriteAccel  PROC
  43.             PUSH {R4,LR}
  44.             MOV   R4, R1
  45.            
  46.             ; Проверим знаковый бит
  47.             TST   R0, #0x80
  48.             BEQ   wa_Plus
  49.            
  50.             BL    abs8
  51.            
  52.             MOV   R2, #0x1 ; Знак -
  53.  
  54.             B     wa_Write
  55. wa_Plus    
  56.             MOV   R2, #0   ; Знак +
  57. wa_Write    
  58.             ; Максимальное значение числа в условиях лежания порядка 60.
  59.             ; Домножим на 4 для масштаба
  60.             LSL   R0, #2
  61.            
  62.             ; Обрежем, если слишком много
  63.             CMP   R0, #0xFF
  64.             IT    GT
  65.            
  66.             MOVGT R0, #0xFF
  67.            
  68.             ; Запишем число
  69.             STRB  R0, [R4, #0]
  70.             ; Запишем знак
  71.             STRB  R2, [R4, #1]
  72.            
  73.             POP  {R4,PC}
  74.             ENDP
  75.  
  76. ; Зажигает или гасит выбранный светодиод в зависимости от счётчика и порога PWM
  77. ; Аргументы: 4
  78. ;  R0: номер светодиода
  79. ;  R1: адрес структуры со значениями ускорения
  80. ;  R2: значение счётчика ШИМ
  81. ;  R3: знак ускорения (если не совпадает с измеренным - выходим)
  82. ; Результат: нет
  83. PWMAccel    PROC
  84. pwmaccel    ROUT ; Для локальных меток (как пример)
  85.  
  86.             PUSH {R4-R6,LR}
  87.             MOV R4, R0 ; Номер светодиода
  88.             MOV R5, R1 ; Адрес структуры
  89.             MOV R6, R2 ; Счётчик
  90.            
  91.             ; Загрузим знак и сравним с заданным
  92.             LDRB R0, [R5, #1]
  93.             CMP R0, R3
  94.             ; Если не равно - выходим
  95.             BNE %1pwmaccel
  96.            
  97.             ; Загрузим абсолютную величину ускорения (регистр сравнения)
  98.             LDRB R5, [R5, #0]
  99.            
  100.             ; Если счётчик не равен нулю, пропустим процесс зажигания
  101.             CMP R6, #0
  102.             BNE %2pwmaccel
  103.            
  104.             ; Если счётчик равен нулю, то надо зажечь светодиод, при условии
  105.             ; что в регистре сравнения не ноль.
  106.             CMP R5, #0
  107.             BEQ %2pwmaccel
  108.            
  109.             ; Что ж, зажжём светодиод
  110.             MOV R0, R4
  111.             BL  LedOn
  112.            
  113. 2pwmaccel   ; Пропуск зажигания светодиода
  114.             ; Если регистр сравнения и счётчик равны - гасим.
  115.             CMP R6, R5
  116.             BNE %1pwmaccel ; Выходим
  117.            
  118.             MOV R0, R4
  119.             BL  LedOff
  120.            
  121. 1pwmaccel   ; Выход
  122.             POP  {R4-R6,PC}
  123.             ENDP
  124.  
  125.             EXPORT main
  126. main        PROC
  127.            
  128.             ; Инициализация кнопок и светодиодов
  129.             BL LedInit
  130.             BL ButtonInit
  131.             ; Инициализация SPI
  132.             BL SpiInit
  133.             ; Инициализация акселерометра
  134.             BL AccelInit
  135.            
  136.             ; R4 - счётчик ШИМ
  137.             MOV R4, #0
  138.            
  139.             ; R5 - период опроса акселерометра
  140.             MOV32 R5, ACCEL_PERIOD
  141.          
  142. ; Главный цикл программы          
  143. __mainloop
  144.             ; Запишем статус кнопки в переменную rButton
  145.             BL    ButtonGet
  146.             MOV32 R1, rButton
  147.             STRB  R0, [R1]
  148.  
  149.             ; Верх (+Y)
  150.             MOV   R0, #0       ; Светодиод левый, 0
  151.             MOV32 R1, rAccelY  ; Адрес переменной
  152.             MOV   R2, R4       ; Счётчик ШИМ
  153.             MOV   R3, #1       ; Знак минус
  154.             BL    PWMAccel
  155.            
  156.             ; Низ (-Y)
  157.             MOV   R0, #2       ; Светодиод правый, 2
  158.             MOV32 R1, rAccelY  ; Адрес переменной
  159.             MOV   R2, R4       ; Счётчик ШИМ
  160.             MOV   R3, #0       ; Знак плюс
  161.             BL    PWMAccel
  162.  
  163.             ; Лево (-X)
  164.             MOV   R0, #1       ; Светодиод левый, 1
  165.             MOV32 R1, rAccelX  ; Адрес переменной
  166.             MOV   R2, R4       ; Счётчик ШИМ
  167.             MOV   R3, #1       ; Знак плюс
  168.             BL    PWMAccel
  169.            
  170.             ; Право (+X)
  171.             MOV   R0, #3       ; Светодиод нижний, 3
  172.             MOV32 R1, rAccelX  ; Адрес переменной
  173.             MOV   R2, R4       ; Счётчик ШИМ
  174.             MOV   R3, #0       ; Знак минус
  175.             BL    PWMAccel
  176.  
  177.             ; Прибавить и ограничить байтом
  178.             ADD   R4, #1
  179.             AND   R4, #0xFF
  180.  
  181.             ; Период проверим
  182.             SUBS  R5, #1
  183.             BNE   __mainloop
  184.  
  185.             ; Перезарядим счётчик
  186.             MOV32 R5, ACCEL_PERIOD
  187.  
  188.             ; Прочитаем ускорение по осям. Запишем результаты
  189.             BL    AccelX
  190.             MOV32 R1, rAccelX
  191.             BL    WriteAccel
  192.            
  193.             BL    AccelY
  194.             MOV32 R1, rAccelY
  195.             BL    WriteAccel
  196.  
  197.             BL    AccelZ
  198.             MOV32 R1, rAccelZ
  199.             BL    WriteAccel
  200.            
  201.             SVC   1
  202.            
  203.             ; На очередной круг
  204.             B     __mainloop
  205.  
  206.             ENDP
  207.  
  208.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement