SHARE
TWEET

Untitled

a guest Oct 28th, 2017 326 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
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top