Advertisement
Guest User

Untitled

a guest
Oct 28th, 2017
424
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     PRESERVE8                           ; 8-битное выравнивание стека
  2.     THUMB                               ; Режим Thumb (AUL) инструкций
  3.  
  4.     GET config.s                        ; include-файлы
  5.     GET stm32f10x.s
  6.  
  7.     AREA RESET, CODE, READONLY
  8.  
  9.     ; Таблица векторов прерываний
  10.     DCD STACK_TOP                       ; Указатель на вершину стека
  11.     DCD Reset_Handler                   ; Вектор сброса
  12.  
  13.     ENTRY                               ; Точка входа в программу
  14.  
  15. Reset_Handler   PROC                    ; Вектор сброса
  16.     EXPORT  Reset_Handler               ; Делаем Reset_Handler видимым вне этого файла
  17.  
  18. main                                    ; Основная подпрограмма
  19.     MOV32   R0, PERIPH_BB_BASE + \
  20.             RCC_APB2ENR * 32 + \
  21.             4 * 4                       ; вычисляем адрес для BitBanding 4-го бита регистра RCC_APB2ENR
  22.                                         ; BitAddress = BitBandBase + (RegAddr * 32) + BitNumber * 4
  23.     MOV     R1, #1                      ; включаем тактирование порта C (в 4-й бит RCC_APB2ENR пишем '1`)
  24.     STR     R1, [R0]                    ; загружаем это значение
  25.    
  26.     MOV32   R0, GPIOC_CRH               ; адрес (port configuration register high) порта
  27.     MOV     R1, #0x03                   ; 4-битная маска настроек для Output mode 50mHz, Push-Pull ("0011")- узнать, почему push-pull
  28.     LDR     R2, [R0]                    ; считать порт
  29.     BFI     R2, R1, #4, #4              ; скопировать биты маски в позицию PIN9
  30.     STR     R2, [R0]                    ; загрузить результат в регистр настройки порта
  31.    
  32.     LDR     R6, =DELAY_VAL              ;
  33. button 
  34.     MOV32   R0, PERIPH_BB_BASE + \
  35.             RCC_APB2ENR * 32 + \
  36.             2 * 4
  37.            
  38.     MOV     R1, #1                      ; включаем тактирование порта A (в 2-й бит RCC_APB2ENR пишем '1`)
  39.     STR     R1, [R0]                    ; загружаем это значение
  40.    
  41.     MOV32   R0, GPIOA_CRL               ; адрес порта
  42.     MOV     R1, #0x08                   ; 4-битная маска настроек для Input mode, Pull-Down ("1000")
  43.     LDR     R2, [R0]                    ; считать порт
  44.     BFI     R2, R1, #0, #4              ; скопировать биты маски в позицию PA0
  45.     STR     R2, [R0]                    ; загрузить результат в регистр настройки порта
  46.    
  47.     MOV32   R3, GPIOA_BRR               ; подтяжка к земле
  48.     MOV     R4, #0x01                   ;
  49.     STR     R4, [R3]                    ;  
  50.  
  51. increment          
  52.     SUB     R6, #0x50000
  53.     CMP     R6, #0x10000
  54.     IT      LT
  55.     LDRLT   R6, =DELAY_VAL
  56.    
  57. loop                                    ; Бесконечный цикл
  58.     MOV32   R0, GPIOC_BSRR              ; адрес порта выходных сигналов
  59.    
  60.     MOV32   R1, GPIOA_IDR               ; адрес порта входных сигналов
  61.     LDR     R2, [R1]                    ;
  62.     ANDS    R2, #0x01                   ;
  63.     IT      NE                          ;
  64.     BLNE    increment                   ;
  65.     MOV     R1, #(PIN9)                 ; устанавливаем вывод в '1'
  66.     STR     R1, [R0]                    ; загружаем в порт
  67.    
  68.     BL      delay                       ; задержка
  69.    
  70.     MOV     R1, #(PIN9 << 16)           ; сбрасываем в '0'
  71.     STR     R1, [R0]                    ; загружаем в порт
  72.    
  73.     BL      delay                       ; задержка
  74.  
  75.     B       loop                        ; возвращаемся к началу цикла
  76.    
  77.     ENDP
  78.  
  79. delay       PROC                        ; Подпрограмма задержки
  80.     PUSH    {R6}                        ; Загружаем в стек R6, т.к. его значение будем менять
  81. delay_loop
  82.     SUBS    R6, #1                      ; SUB с установкой флагов результата
  83.     IT      NE
  84.     BNE     delay_loop                  ; переход, если Z==0 (результат вычитания не равен нулю)
  85.     POP     {R6}                        ; Выгружаем из стека R0
  86.     BX      LR                          ; выход из подпрограммы (переход к адресу в регистре LR - вершина стека)
  87.     ENDP
  88.    
  89.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement