Advertisement
Guest User

Untitled

a guest
Aug 6th, 2012
451
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Test STM32F4-Assembler project
  2. ; Ня
  3.  
  4.     AREA    |.text|, CODE, READONLY
  5.  
  6. RCC_AHB1ENR           EQU 0x40023830
  7. RCC_AHB1ENR_GPIODEN   EQU 0x00000008 ; 3 бит
  8.  
  9. GPIOD_BASE            EQU 0x40020C00
  10.  
  11. GPIO_MODER_OFFSET     EQU 0x00000000
  12. GPIO_MODER_MODER12_0  EQU 0x01000000
  13. GPIO_MODER_MODER13_0  EQU 0x04000000
  14. GPIO_MODER_MODER14_0  EQU 0x10000000
  15. GPIO_MODER_MODER15_0  EQU 0x40000000
  16.  
  17. GPIO_PUPDR_OFFSET     EQU 0x0000000C
  18. GPIO_PUPDR_PUPDR12_0  EQU 0x01000000
  19. GPIO_PUPDR_PUPDR13_0  EQU 0x04000000
  20. GPIO_PUPDR_PUPDR14_0  EQU 0x10000000
  21. GPIO_PUPDR_PUPDR15_0  EQU 0x40000000
  22.  
  23. GPIO_BSRRL_OFFSET     EQU 0x00000018 ; Сброс
  24. GPIO_BSRRH_OFFSET     EQU 0x0000001A ; Установка
  25.  
  26. DELAY_COUNTER         EQU 0x000F4240 ; 1000000UL
  27.  
  28. GPIO_BSSR_PIN12       EQU 0x00001000 ; 12 бит
  29. GPIO_BSSR_PIN13       EQU 0x00002000 ; 13 бит
  30. GPIO_BSSR_PIN14       EQU 0x00004000 ; 14 бит
  31. GPIO_BSSR_PIN15       EQU 0x00008000 ; 15 бит
  32.  
  33. ; Инициализация системы тактирования
  34.             EXPORT SystemInit
  35. SystemInit  PROC
  36.            
  37.             BX LR ; Возвращаемся обратно
  38.            
  39.             ENDP
  40.  
  41. ROUT
  42. ; Получить маску для зажигания светодиода по его номеру
  43. ; R0 - номер светодиода, от 0 до 3
  44. ; Результат: R0.
  45. ; Если номер не верный, в R0 будет 0.
  46. GetPinMask  PROC
  47.             ; Другой способ выбора:
  48.             CMP  R0, #0
  49.             BEQ  GetPinMask_led0
  50.            
  51.             CMP  R0, #1
  52.             BEQ  GetPinMask_led1
  53.            
  54.             CMP  R0, #2
  55.             BEQ  GetPinMask_led2
  56.            
  57.             CMP  R0, #3
  58.             BEQ  GetPinMask_led3
  59.            
  60.             ; Ошибка
  61.             B    GetPinMask_error
  62.            
  63. GetPinMask_led0 ; Светодиод 0
  64.             MOV  R0, #GPIO_BSSR_PIN12 ; 12 бит
  65.             B    GetPinMask_return
  66.  
  67. GetPinMask_led1 ; Светодиод 1
  68.             MOV  R0, #GPIO_BSSR_PIN13 ; 13 бит
  69.             B    GetPinMask_return
  70.            
  71. GetPinMask_led2 ; Светодиод 2
  72.             MOV  R0, #GPIO_BSSR_PIN14 ; 14 бит
  73.             B    GetPinMask_return
  74.            
  75. GetPinMask_led3 ; Светодиод 3
  76.             MOV  R0, #GPIO_BSSR_PIN15 ; 15 бит
  77.             B    GetPinMask_return
  78.  
  79. GetPinMask_error ; Ошибка
  80.             MOV   R0, #0
  81.            
  82. GetPinMask_return
  83.             BX    LR
  84.             ENDP
  85.  
  86. ; Погасить светодиод по его номеру
  87. ; R0 - номер светодиода, от 0 до 3
  88. LedOff      PROC
  89.             ; Сохраним в стеке адрес возврата
  90.             PUSH {LR}
  91.  
  92.             ; Получить маску
  93.             BL   GetPinMask
  94.            
  95.             ; Если 0, то выходим
  96.             CMP  R0, #0
  97.             BEQ  LedOff_return
  98.            
  99.             ; В R0 теперь маска
  100.             ; Погасить выбронный светодиод
  101.             LDR R1, =GPIOD_BASE
  102.             STR R0, [R1, #GPIO_BSRRH_OFFSET]
  103.            
  104. LedOff_return
  105.             ; Возврат из процедуры
  106.             POP  {PC}
  107.             ENDP
  108.            
  109. ; Зажечь светодиод по его номеру
  110. ; R0 - номер светодиода, от 0 до 3
  111. LedOn       PROC
  112.             ; Сохраним в стеке адрес возврата
  113.             PUSH {LR}
  114.  
  115.             ; Получить маску
  116.             BL   GetPinMask
  117.            
  118.             ; Если 0, то выходим
  119.             CMP  R0, #0
  120.             BEQ  LedOn_return
  121.            
  122.             ; В R0 теперь маска
  123.             ; Зажечь выбронный светодиод
  124.             LDR R1, =GPIOD_BASE
  125.             STR R0, [R1, #GPIO_BSRRL_OFFSET]
  126.            
  127. LedOn_return
  128.             ; Возврат из процедуры
  129.             POP  {PC}
  130.             ENDP
  131.  
  132. ; Программная задержка
  133. ; R0 - величина задержки
  134. delay       PROC
  135.             ; Вычитаем единицу
  136.             SUBS R0, R0, #1
  137.             ; Пока не обнулилась, крутим дальше
  138.             BNE delay
  139.            
  140.             BX LR
  141.             ENDP
  142.  
  143.             EXPORT __main
  144. __main      PROC
  145.            
  146.             ; Разрешим тактирование порта D
  147.            
  148.             ; Загрузим в регистр R0 адрес регистра RCC_AHB1ENR
  149.             LDR R0, =RCC_AHB1ENR
  150.             ; Прочитаем в регистр R1 его содержимое
  151.             LDR R1, [R0]
  152.             ; Установим бит тактирования порта D
  153.             ORR R1, R1, #RCC_AHB1ENR_GPIODEN
  154.             ; Запишем обратно
  155.             STR R1, [R0]
  156.            
  157.             ; Установим режим работы выводов (выход)
  158.             LDR R0, =GPIOD_BASE
  159.             ; Прочитаем в регистр R1 его содержимое
  160.             LDR R1, [R0, #GPIO_MODER_OFFSET]
  161.            
  162.             ; Установим необходимые биты для выводов 12-15
  163.             ORR R1, R1, #GPIO_MODER_MODER12_0
  164.             ORR R1, R1, #GPIO_MODER_MODER13_0
  165.             ORR R1, R1, #GPIO_MODER_MODER14_0
  166.             ORR R1, R1, #GPIO_MODER_MODER15_0
  167.            
  168.             ; Запишем обратно
  169.             STR R1, [R0, #GPIO_MODER_OFFSET]
  170.            
  171.             ; Подтяжка к питанию
  172.             LDR R0, =GPIOD_BASE
  173.             LDR R1, [R0, #GPIO_PUPDR_OFFSET]
  174.            
  175.             ; Установим необходимые биты для выводов 12-15
  176.             ORR R1, R1, #GPIO_PUPDR_PUPDR12_0
  177.             ORR R1, R1, #GPIO_PUPDR_PUPDR13_0
  178.             ORR R1, R1, #GPIO_PUPDR_PUPDR14_0
  179.             ORR R1, R1, #GPIO_PUPDR_PUPDR15_0
  180.            
  181.             ; Запишем обратно
  182.             STR R1, [R0, #GPIO_PUPDR_OFFSET]
  183.            
  184.             ; В регистр R2 запишем величину задержки
  185.             LDR R4, =DELAY_COUNTER
  186.            
  187. __mainloop
  188.             ; Зажжём светодиод 0
  189.             MOV R0, #0
  190.             BL  LedOn
  191.            
  192.             ; Задержка
  193.             MOV R0, R4
  194.             BL  delay
  195.            
  196.             ; Погасим светодиод 0
  197.             MOV R0, #0
  198.             BL  LedOff
  199.            
  200.             ; Зажжём светодиод 1
  201.             MOV R0, #1
  202.             BL  LedOn
  203.            
  204.             ; Задержка
  205.             MOV R0, R4
  206.             BL  delay
  207.            
  208.             ; Погасим светодиод 1
  209.             MOV R0, #1
  210.             BL  LedOff
  211.            
  212.             ; Зажжём светодиод 2
  213.             MOV R0, #2
  214.             BL  LedOn
  215.            
  216.             ; Задержка
  217.             MOV R0, R4
  218.             BL  delay
  219.            
  220.             ; Погасим светодиод 2
  221.             MOV R0, #2
  222.             BL  LedOff
  223.            
  224.             ; Зажжём светодиод 3
  225.             MOV R0, #3
  226.             BL  LedOn
  227.            
  228.             ; Задержка
  229.             MOV R0, R4
  230.             BL  delay
  231.            
  232.             ; Погасим светодиод 3
  233.             MOV R0, #3
  234.             BL  LedOff
  235.            
  236.             ; На очередной круг
  237.             B __mainloop
  238.  
  239.             ENDP
  240.  
  241.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement