Advertisement
teplofizik

main.s (8)

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