Advertisement
teplofizik

led.s (7)

Aug 9th, 2012
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Драйвер светодиодов
  2. ; Плата STM32F4-Discovery
  3. ; http://teplofizik.diary.ru/p179508680.htm
  4.  
  5.     ; Проверять выравнивание стека (8 байт)
  6.     PRESERVE8
  7.    
  8.     AREA    |.text|, CODE, READONLY
  9.  
  10.             EXPORT LedInit
  11.             EXPORT LedOn
  12.             EXPORT LedOff
  13.  
  14.             EXPORT swi_LedOn
  15.             EXPORT swi_LedOff
  16.  
  17.             GET stm32f4xx.inc
  18.  
  19. ; Объявления
  20.  
  21. ; Получить маску для зажигания светодиода по его номеру
  22. ; Аргументы: 1
  23. ;  R0 - номер светодиода, от 0 до 3
  24. ; Результат: маска, если номер не верный, в R0 будет 0.
  25. GetPinMask  PROC
  26.             CMP   R0, #3
  27.             BGT   GetPinMask_error
  28.            
  29.             MOV   R1, #GPIO_BSSR_PIN12
  30.             LSL   R0, R1, R0
  31.            
  32.             B     GetPinMask_return
  33.            
  34. GetPinMask_error ; Ошибка
  35.             MOV   R0, #0
  36.            
  37. GetPinMask_return
  38.             BX    LR
  39.             ENDP
  40.  
  41. ; Погасить светодиод по его номеру
  42. ; Аргументы: 1
  43. ;  R0 - номер светодиода, от 0 до 3
  44. ; Результат: нет
  45. swi_LedOff  PROC
  46.             ; Сохраним в стеке адрес возврата
  47.             PUSH {LR}
  48.  
  49.             ; Получить маску
  50.             BL    GetPinMask
  51.            
  52.             ; В R0 теперь маска
  53.             ; Погасить выбронный светодиод
  54.             MOV32 R1, GPIOD_BASE
  55.             STRH  R0, [R1, #GPIO_BSRRH_OFFSET]
  56.            
  57.             ; Возврат из процедуры
  58.             POP  {PC}
  59.             ENDP
  60.  
  61. ; Вызов через SVC
  62. LedOff      PROC
  63.             PUSH {LR}
  64.             SVC   1
  65.             POP  {PC}
  66.             ENDP
  67.  
  68. ; Зажечь светодиод по его номеру
  69. ; Аргументы: 1
  70. ;  R0 - номер светодиода, от 0 до 3
  71. ; Результат: нет
  72. swi_LedOn   PROC
  73.             ; Сохраним в стеке адрес возврата
  74.             PUSH {LR}
  75.  
  76.             ; Получить маску
  77.             BL    GetPinMask
  78.            
  79.             ; В R0 теперь маска
  80.             ; Зажечь выбронный светодиод
  81.             MOV32 R1, GPIOD_BASE
  82.             STRH  R0, [R1, #GPIO_BSRRL_OFFSET]
  83.            
  84.             ; Возврат из процедуры
  85.             POP  {PC}
  86.             ENDP
  87.  
  88. ; Вызов через SVC
  89. LedOn       PROC
  90.             PUSH {LR}
  91.             SVC   0
  92.             POP  {PC}
  93.             ENDP
  94.  
  95. ; Инициализация выводов, подключённых к светодиодам
  96. ; Аргументы: нет
  97. ; Результат: нет
  98. LedInit     PROC
  99.             ; Разрешим тактирование порта D
  100.             ; Загрузим в регистр R0 адрес регистра RCC_AHB1ENR
  101.             MOV32 R0, RCC_AHB1ENR
  102.             ; Прочитаем в регистр R1 его содержимое
  103.             LDR   R1, [R0]
  104.             ; Установим бит тактирования порта D
  105.             ORR   R1, R1, #RCC_AHB1ENR_GPIODEN
  106.             ; Запишем обратно
  107.             STR   R1, [R0]
  108.            
  109.             ; Установим режим работы выводов (выход)
  110.             MOV32 R0, GPIOD_BASE
  111.             ; Прочитаем в регистр R1 его содержимое
  112.             LDR   R1, [R0, #GPIO_MODER_OFFSET]
  113.            
  114.             ; Установим необходимые биты для выводов 12-15
  115.             ORR   R1, #GPIO_MODER_MODER12_0
  116.             ORR   R1, #GPIO_MODER_MODER13_0
  117.             ORR   R1, #GPIO_MODER_MODER14_0
  118.             ORR   R1, #GPIO_MODER_MODER15_0
  119.            
  120.             ; Запишем обратно
  121.             STR   R1, [R0, #GPIO_MODER_OFFSET]
  122.            
  123.             ; Подтяжка к питанию
  124.             MOV32 R0, GPIOD_BASE
  125.             LDR   R1, [R0, #GPIO_PUPDR_OFFSET]
  126.            
  127.             ; Установим необходимые биты для выводов 12-15
  128.             ORR   R1, #GPIO_PUPDR_PUPDR12_0
  129.             ORR   R1, #GPIO_PUPDR_PUPDR13_0
  130.             ORR   R1, #GPIO_PUPDR_PUPDR14_0
  131.             ORR   R1, #GPIO_PUPDR_PUPDR15_0
  132.            
  133.             ; Запишем обратно
  134.             STR   R1, [R0, #GPIO_PUPDR_OFFSET]
  135.            
  136.             BX    LR
  137.             ENDP
  138.  
  139.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement