Advertisement
Guest User

Untitled

a guest
Aug 6th, 2012
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Драйвер светодиодов
  2. ; Плата STM32F4-Discovery
  3.  
  4.     AREA    |.text|, CODE, READONLY
  5.  
  6.             EXPORT LedInit
  7.             EXPORT LedOn
  8.             EXPORT LedOff
  9.  
  10. ; Объявления
  11. RCC_AHB1ENR           EQU 0x40023830
  12. RCC_AHB1ENR_GPIODEN   EQU 0x00000008 ; 3 бит
  13.  
  14. GPIOD_BASE            EQU 0x40020C00
  15.  
  16. GPIO_MODER_OFFSET     EQU 0x00000000
  17. GPIO_MODER_MODER12_0  EQU 0x01000000
  18. GPIO_MODER_MODER13_0  EQU 0x04000000
  19. GPIO_MODER_MODER14_0  EQU 0x10000000
  20. GPIO_MODER_MODER15_0  EQU 0x40000000
  21.  
  22. GPIO_PUPDR_OFFSET     EQU 0x0000000C
  23. GPIO_PUPDR_PUPDR12_0  EQU 0x01000000
  24. GPIO_PUPDR_PUPDR13_0  EQU 0x04000000
  25. GPIO_PUPDR_PUPDR14_0  EQU 0x10000000
  26. GPIO_PUPDR_PUPDR15_0  EQU 0x40000000
  27.  
  28. GPIO_BSRRL_OFFSET     EQU 0x00000018 ; Сброс
  29. GPIO_BSRRH_OFFSET     EQU 0x0000001A ; Установка
  30.  
  31.  
  32. GPIO_BSSR_PIN12       EQU 0x00001000 ; 12 бит
  33. GPIO_BSSR_PIN13       EQU 0x00002000 ; 13 бит
  34. GPIO_BSSR_PIN14       EQU 0x00004000 ; 14 бит
  35. GPIO_BSSR_PIN15       EQU 0x00008000 ; 15 бит
  36.  
  37. ; Получить маску для зажигания светодиода по его номеру
  38. ; Аргументы: 1
  39. ;  R0 - номер светодиода, от 0 до 3
  40. ; Результат: маска, если номер не верный, в R0 будет 0.
  41. GetPinMask  PROC
  42.             ; Другой способ выбора:
  43.             CMP  R0, #0
  44.             BEQ  GetPinMask_led0
  45.            
  46.             CMP  R0, #1
  47.             BEQ  GetPinMask_led1
  48.            
  49.             CMP  R0, #2
  50.             BEQ  GetPinMask_led2
  51.            
  52.             CMP  R0, #3
  53.             BEQ  GetPinMask_led3
  54.            
  55.             ; Ошибка
  56.             B    GetPinMask_error
  57.            
  58. GetPinMask_led0 ; Светодиод 0
  59.             MOV  R0, #GPIO_BSSR_PIN12 ; 12 бит
  60.             B    GetPinMask_return
  61.  
  62. GetPinMask_led1 ; Светодиод 1
  63.             MOV  R0, #GPIO_BSSR_PIN13 ; 13 бит
  64.             B    GetPinMask_return
  65.            
  66. GetPinMask_led2 ; Светодиод 2
  67.             MOV  R0, #GPIO_BSSR_PIN14 ; 14 бит
  68.             B    GetPinMask_return
  69.            
  70. GetPinMask_led3 ; Светодиод 3
  71.             MOV  R0, #GPIO_BSSR_PIN15 ; 15 бит
  72.             B    GetPinMask_return
  73.  
  74. GetPinMask_error ; Ошибка
  75.             MOV   R0, #0
  76.            
  77. GetPinMask_return
  78.             BX    LR
  79.             ENDP
  80.  
  81. ; Погасить светодиод по его номеру
  82. ; Аргументы: 1
  83. ;  R0 - номер светодиода, от 0 до 3
  84. ; Результат: нет
  85. LedOff      PROC
  86.             ; Сохраним в стеке адрес возврата
  87.             PUSH {LR}
  88.  
  89.             ; Получить маску
  90.             BL   GetPinMask
  91.            
  92.             ; Если 0, то выходим
  93.             CMP  R0, #0
  94.             BEQ  LedOff_return
  95.            
  96.             ; В R0 теперь маска
  97.             ; Погасить выбронный светодиод
  98.             LDR R1, =GPIOD_BASE
  99.             STR R0, [R1, #GPIO_BSRRH_OFFSET]
  100.            
  101. LedOff_return
  102.             ; Возврат из процедуры
  103.             POP  {PC}
  104.             ENDP
  105.            
  106. ; Зажечь светодиод по его номеру
  107. ; Аргументы: 1
  108. ;  R0 - номер светодиода, от 0 до 3
  109. ; Результат: нет
  110. LedOn       PROC
  111.             ; Сохраним в стеке адрес возврата
  112.             PUSH {LR}
  113.  
  114.             ; Получить маску
  115.             BL   GetPinMask
  116.            
  117.             ; Если 0, то выходим
  118.             CMP  R0, #0
  119.             BEQ  LedOn_return
  120.            
  121.             ; В R0 теперь маска
  122.             ; Зажечь выбронный светодиод
  123.             LDR R1, =GPIOD_BASE
  124.             STR R0, [R1, #GPIO_BSRRL_OFFSET]
  125.            
  126. LedOn_return
  127.             ; Возврат из процедуры
  128.             POP  {PC}
  129.             ENDP
  130.  
  131. ; Инициализация выводов, подключённых к светодиодам
  132. ; Аргументы: нет
  133. ; Результат: нет
  134. LedInit     PROC
  135.             ; Разрешим тактирование порта D
  136.             ; Загрузим в регистр R0 адрес регистра RCC_AHB1ENR
  137.             LDR R0, =RCC_AHB1ENR
  138.             ; Прочитаем в регистр R1 его содержимое
  139.             LDR R1, [R0]
  140.             ; Установим бит тактирования порта D
  141.             ORR R1, R1, #RCC_AHB1ENR_GPIODEN
  142.             ; Запишем обратно
  143.             STR R1, [R0]
  144.            
  145.             ; Установим режим работы выводов (выход)
  146.             LDR R0, =GPIOD_BASE
  147.             ; Прочитаем в регистр R1 его содержимое
  148.             LDR R1, [R0, #GPIO_MODER_OFFSET]
  149.            
  150.             ; Установим необходимые биты для выводов 12-15
  151.             ORR R1, R1, #GPIO_MODER_MODER12_0
  152.             ORR R1, R1, #GPIO_MODER_MODER13_0
  153.             ORR R1, R1, #GPIO_MODER_MODER14_0
  154.             ORR R1, R1, #GPIO_MODER_MODER15_0
  155.            
  156.             ; Запишем обратно
  157.             STR R1, [R0, #GPIO_MODER_OFFSET]
  158.            
  159.             ; Подтяжка к питанию
  160.             LDR R0, =GPIOD_BASE
  161.             LDR R1, [R0, #GPIO_PUPDR_OFFSET]
  162.            
  163.             ; Установим необходимые биты для выводов 12-15
  164.             ORR R1, R1, #GPIO_PUPDR_PUPDR12_0
  165.             ORR R1, R1, #GPIO_PUPDR_PUPDR13_0
  166.             ORR R1, R1, #GPIO_PUPDR_PUPDR14_0
  167.             ORR R1, R1, #GPIO_PUPDR_PUPDR15_0
  168.            
  169.             ; Запишем обратно
  170.             STR R1, [R0, #GPIO_PUPDR_OFFSET]
  171.            
  172.             BX  LR
  173.             ENDP
  174.  
  175.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement