Advertisement
Guest User

Untitled

a guest
Dec 24th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 3.31 KB | None | 0 0
  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.    
  20.     MOV32   R0, PERIPH_BB_BASE + \
  21.             RCC_APB2ENR * 32 + \
  22.             4 * 4                       ; вычисляем адрес для BitBanding 5-го бита регистра RCC_APB2ENR
  23.                                         ; BitAddress = BitBandBase + (RegAddr * 32) + BitNumber * 4
  24.     MOV     R1, #1                      ; включаем тактирование порта С (в 4-й бит RCC_APB2ENR пишем '1`)
  25.     STR     R1, [R0]                    ; загружаем это значение
  26.     MOV32   R0, GPIOC_CRL               ; адрес порта
  27.     MOV     R1, #0x0333                 ; 4-битная маска настроек для Output mode 50mHz, Push-Pull ("0011")
  28.     LDR     R2, [R0]                    ; считать порт
  29.     BFI     R2, R1, #0, #8              ; скопировать биты маски в позицию PIN0-PIN2
  30.     STR     R2, [R0]
  31.     MOV     R11, #0x00
  32.    
  33. loop
  34.     MOV32   R4, GPIOC_BSRR
  35.     MOV32   R0, #0x0AAA
  36.     MOV     R1, #(PIN0) ; чип селект
  37.     STR     R1, [R4]    ; Устанавливаем чип сел. в 1
  38.     BL      delay
  39.     BL      send_SPI
  40.     B       loop
  41.     ENDP
  42.    
  43. send_SPI    PROC
  44.     PUSH    {R1, R4, R11, R0}
  45.     MOV32   R5, #(0x800)
  46.     MOV     R1, #(PIN0 << 16)  
  47.     STR     R1, [R4]    ;устанавливаем чип сел. в 0
  48.    
  49.  
  50. spi_loop
  51.     MOV     R3, #(PIN2) ; Данные лог 1
  52.     AND     R6, R0, R5  ;побитового сравниваем R5 R0 , если старший бит в R0=1, то в R6 записан R5, наоборот 0
  53.     CMP     R6, #0x00
  54.     ITEE    NE
  55.     STRNE   R3, [R4] ;если R6 не равно 0 на пин2 выставляется 1
  56.     MOVEQ   R3,  #(PIN2 << 16) ;Данные лог. 0
  57.     STREQ   R3, [R4] ;если равен на пин2 - 0
  58.     BL      delay
  59.     MOV     R2, #(PIN1) ; Такты
  60.     STR     R2, [R4]     ;Выставляется такт на пин1
  61.     BL      delay
  62.     MOV     R2,  #(PIN1 << 16)   ;Такты
  63.     STR     R2, [R4]            ;возвращаем такт в 0
  64.     LSR     R5 ,#1              ;смещаем бит в R5 на 1bit вправо
  65.     ADD     R11, #1
  66.     CMP     R11, #12
  67.     IT      NE
  68.     BNE     spi_loop
  69.     POP     {R1, R4, R11, R0}
  70.     BX      LR
  71.     ENDP
  72.    
  73. delay       PROC                        ; Подпрограмма задержки
  74.     PUSH    {R0}                        ; Загружаем в стек R0, т.к. его значение будем менять
  75.     LDR     R0, =DELAY_VAL              ; псевдоинструкция Thumb (загрузить константу в регистр)
  76. delay_loop
  77.     SUBS    R0, #1                      ; SUB с установкой флагов результата
  78.     IT      NE
  79.     BNE     delay_loop                  ; переход, если Z==0 (результат вычитания не равен нулю)
  80.     POP     {R0}                        ; Выгружаем из стека R0
  81.     BX      LR                          ; выход из подпрограммы (переход к адресу в регистре LR - вершина стека)
  82.     ENDP
  83.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement