Advertisement
teplofizik

main.s (6)

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