Advertisement
manueljesus00

EPD7_C3

May 3rd, 2021
3,933
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 4.48 KB | None | 0 0
  1.  
  2. .globl _start
  3. _start:             ldr pc,reset_handler_d      // Exception vector
  4.                     ldr pc,undefined_handler_d
  5.                     ldr pc,swi_handler_d
  6.                     ldr pc,prefetch_handler_d
  7.                     ldr pc,data_handler_d
  8.                     ldr pc,unused_handler_d
  9.                     ldr pc,irq_handler_d
  10.                     ldr pc,fiq_handler_d
  11.  
  12. reset_handler_d:    .word reset_handler
  13. undefined_handler_d:.word hang
  14. swi_handler_d:      .word swi_handler
  15. prefetch_handler_d: .word hang
  16. data_handler_d:     .word hang
  17. unused_handler_d:   .word hang
  18. irq_handler_d:      .word irq_handler
  19. fiq_handler_d:      .word hang
  20.  
  21. UARTDR:             .word 0x101f1000            // UART data register address
  22. UARTFR:             .word 0x101f1018            // UART flag register address      
  23. UARTCR:             .word 0x101f1030            // UART control register address           
  24. UARTIMSC:           .word 0x101f1038            // UART interrupt mask address
  25. UARTICR:            .word 0x101f1044            // UART interrupt clear address
  26.  
  27. TIMER0_LOAD:        .word 0x101E2000            // TIMER0 registers
  28. TIMER0_VALUE:       .word 0x101E2004
  29. TIMER0_CONTROL:     .word 0x101E2008
  30. TIMER0_INTCLR:      .word 0x101E200C
  31. TIMER0_RIS:         .word 0x101E2010
  32. TIMER0_MIS:         .word 0x101E2014
  33. TIMER0_BGLOAD:      .word 0x101E2018
  34.  
  35. VICINTENABLE:       .word 0x10140010            // Vectorize interrupt controller
  36.  
  37. reset_handler:      mov r0,#0x10000             // Copy exception vector
  38.                     mov r1,#0x00000
  39.                     ldmia r0!,{r2,r3,r4,r5,r6,r7,r8,r9}
  40.                     stmia r1!,{r2,r3,r4,r5,r6,r7,r8,r9}
  41.                     ldmia r0!,{r2,r3,r4,r5,r6,r7,r8,r9}
  42.                     stmia r1!,{r2,r3,r4,r5,r6,r7,r8,r9}
  43.                     msr cpsr_c,#0xD1            // FIQ 110 10001
  44.                     mov sp,#0x100000
  45.                     msr cpsr_c,#0xD2            // IRQ 110 10010
  46.                     mov sp,#0x200000
  47.                     msr cpsr_c,#0xD3            // SVC 110 10011
  48.                     mov sp,#0x300000
  49.                     msr cpsr_c,#0xD7            // ABT 110 10111
  50.                     mov sp,#0x400000
  51.                     msr cpsr_c,#0xDB            // UND 110 11011
  52.                     mov sp,#0x500000
  53.                     msr cpsr_c,#0xDF            // SYS 110 11111
  54.                     mov sp,#0x600000
  55.                     msr cpsr_c,#0xD0            // USER 110 10000
  56.                     mov sp,#0x700000
  57.                     b main                      // start main
  58.    
  59. hang:               b hang             
  60.  
  61. str_swi:            .asciz "swi "
  62.                     .align
  63.  
  64. swi_handler:        stmfd sp!,{r0,r1,r5,lr}     // SWI handler routine
  65.                     ldr r5,[lr,#-4]
  66.                     bic r5,r5,#0xff000000
  67.                     ldr r0,=str_swi
  68.                     bl printString
  69.                     mov r0,r5
  70.                     bl printInt
  71.                     mov r0,#'\n'
  72.                     bl write_uart
  73.  
  74.                     mrs r0, spsr // Leemos reg estado
  75.                     cmp r5, #100
  76.                     biceq r0, #0x80 //#0b10000000 = 0x80 Borrar el bit I (numero 7)
  77.  
  78.                     msr spsr, r0  // Escribe reg estado con el valor (procesado o no) anterior
  79.  
  80.                     ldmfd sp!,{r0,r1,r5,pc}^
  81.  
  82. cont_seg:           .word 0
  83. cont_min:           .word 0
  84.  
  85. irq_message:        .asciz "It works!\n"
  86.                     .align
  87. irq_handler:        sub lr, #4 @ En FIQ e IRQ debemos restar 4 para no saltarnos la instruccion en curso
  88.                     stmfd sp!,{r0-r10,lr}
  89.  
  90.                     mov r4,#0x0             @ Primero: Limpiar interrupciones correspondientes
  91.                     ldr r5,TIMER0_INTCLR
  92.                     str r4,[r5]
  93.                     /* ldr r0, =irq_message @ mostramos el mensaje
  94.                     bl printString */
  95.                     ldr r1,=cont_seg
  96.                     ldr r0,[r1]
  97.                     add r0, #1
  98.                     str r0, [r1]
  99.                     bl printInt
  100.                     mov r0,#'\r'
  101.                     bl write_uart
  102.  
  103.  
  104.                     ldmfd sp!,{r0-r10,pc}^
  105.  
  106. .globl write_uart
  107. write_uart:         stmdb sp!,{r4}
  108.                     ldr r4,UARTDR
  109.                     strb r0,[r4]
  110.                     ldmia sp!,{r4}
  111.                     bx lr          
  112.  
  113. .globl read_uart
  114. read_uart:          stmdb sp!,{r4,r5}
  115.                     ldr r4,UARTFR
  116.                     ldr r4,UARTDR
  117.                     ldrb r0,[r4]
  118.                     ldmia sp!,{r4,r5}
  119.                     bx lr
  120.  
  121. /* init_timer0:     stmdb sp!,{r4,r5}
  122.                     mov r4,r0
  123.                     ldr r5,TIMER0_LOAD
  124.                     str r4,[r5]
  125.                     mov r4,#0x0
  126.                     ldr r5,TIMER0_INTCLR
  127.                     str r4,[r5]
  128.                     mov r4,#0xe2            // 0xe2 = 0b11100010 (hab. timer, modo periodico)
  129.                     ldr r5,TIMER0_CONTROL
  130.                     str r4,[r5]
  131.                     mov r4,#0x10            // Habilitamos el dispositivo de la linea 4 (0x10 = 0b0010000)
  132.                     ldr r5,VICINTENABLE    
  133.                     str r4,[r5]
  134.                     ldmia sp!,{r4,r5}
  135.                     bx lr */
  136. aux_int_uart0:      .word 0x301
  137. init_uart0:         stmdb sp!,{r4,r5}
  138.                     mov r4,#0x0
  139.                     ldr r5,UARTICR
  140.                     str r4,[r5]
  141.                     ldr r4, =aux_int_uart0          // Habilitamos bits 9, 8, 0 (habilita tx, rx, device)
  142.                     ldr r5,UARTCR
  143.                     mov r4, #0x10
  144.                     ldr r5, UARTIMSC
  145.                     str r4,[r5]                     // Habilitamos bit 4 (interrupciones en entrada de datos)
  146.                     ldr r5, VICINTENABLE
  147.                     ldr r4, [r5]
  148.                     orr r4, #0x1000         // Habilitamos el dispositivo de la linea 12
  149.                     str r4, [r5]
  150.                     ldmia sp!,{r4,r5}
  151.                     bx lr
  152.  
  153. /* valor_timer0: .word 0x1e8480 // 2seg */
  154. valor_timer0: .word 0xf4240  // 1 seg
  155. .globl main
  156. main:               ldr r0, =valor_timer0
  157.                     ldr r0, [r0]
  158.                     bl init_uart0
  159.                     swi #100 @ Habilitamos las IRQ
  160. loop_for_ever:      b loop_for_ever
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement