Adjunto 'head.s'
Descargar 1 @ Startup para aplicaciones en C
2 @ -----------------------------------------------------------------------------
3
4 .global main
5 .global _start
6 /* Symbols defined by the linker script */
7 .global _etext
8 .global _data
9 .global _edata
10 .global _bss
11 .global _ebss
12
13 .text
14 .arm
15 _start:
16 /* Vectors (8 total) */
17 b reset /* reset */
18 b loop /* undefined instruction */
19 b loop /* software interrupt */
20 b loop /* prefetch abort */
21 b loop /* data abort */
22 nop /* reserved for the bootloader checksum */
23 ldr pc, [pc, #-0x0FF0] /* VicVectAddr */
24 b loop /* FIQ */
25
26 /* Tareas a realizar para C
27 - Establecer el PLL
28 - Copiar la seccion .data ( variables inicializadas ) a la SRAM
29 - Borrar .bss (variables no inicializadas)
30 - Establecer el stack pointer
31 - Saltar al main del C
32 */
33 reset:
34 /*
35 * Establecer PLL
36 * -----------------------------------------------------------------------------
37 */
38 @ Use r0 for indirect addressing
39 ldr r0, PLLBASE
40
41 @ PLLCFG = PLLCFG_VALUE
42 mov r3, #PLLCFG_VALUE
43 str r3, [r0, #PLLCFG_OFFSET]
44
45 @ PLLCON = PLLCON_PLLE
46 mov r3, #PLLCON_PLLE
47 str r3, [r0, #PLLCON_OFFSET]
48
49 @ PLLFEED = PLLFEED1, PLLFEED2
50 mov r1, #PLLFEED1
51 mov r2, #PLLFEED2
52 str r1, [r0, #PLLFEED_OFFSET]
53 str r2, [r0, #PLLFEED_OFFSET]
54
55 @ repetir mientras ((PLLSTAT & PLLSTAT_PLOCK) == 0)
56
57 pll_loop:
58 ldr r3, [r0, #PLLSTAT_OFFSET]
59 tst r3, #PLLSTAT_PLOCK
60 /* Comentar en casode debug */
61 @@ beq pll_loop
62
63 @ PLLCON = PLLCON_PLLC|PLLCON_PLLE
64 mov r3, #PLLCON_PLLC|PLLCON_PLLE
65 str r3, [r0, #PLLCON_OFFSET]
66
67 @ PLLFEED = PLLFEED1, PLLFEED2 (
68 str r1, [r0, #PLLFEED_OFFSET]
69 str r2, [r0, #PLLFEED_OFFSET]
70
71 stacks_init:
72 ldr r0, STACK_START
73 /* FIQ mode stack */
74 msr CPSR_c, #FIQ_MODE|IRQ_DISABLE|FIQ_DISABLE
75 mov sp,r0
76 sub r0, r0, #FIQ_STACK_SIZE
77 /* IRQ mode stack */
78 msr CPSR_c, #IRQ_MODE|IRQ_DISABLE|FIQ_DISABLE
79 mov sp, r0
80 sub r0, r0, #IRQ_STACK_SIZE
81 msr CPSR_c, #SYS_MODE
82 mov sp,r0
83
84 /*
85 * Copiar .data
86 * -----------------------------------------------------------------------------
87 */
88 ldr r0, data_source @ indica la posicion donde estan guardados los valores de inicializacion
89 ldr r1, data_start @ indica la pos.de la RAM donde comienza la zona de variables inicializadas
90 ldr r2, data_end @ indica la pos.de la RAM donde finaliza la zona de variables inicializadas
91
92 copy_data:
93 cmp r1, r2
94 ldrne r3, [r0], #4
95 strne r3, [r1], #4
96 bne copy_data
97
98 /* Borrar el sector de variables no inicializadas .bss */
99 ldr r0, =0
100 ldr r1, bss_start @ indica la pos.de la RAM donde comienza la zona de variables no inicializadas
101 ldr r2, bss_end @ indica la pos.de la RAM donde finaliza la zona de variables no inicializadas
102 clear_bss:
103 cmp r1, r2
104 strne r0, [r1], #4
105 bne clear_bss
106 seguir:
107
108 ldr r10,=main
109 mov lr,pc
110 bx r10
111
112 /* bl main*/
113
114 /* si retorna del main entonces entrar en un bucle infinito*/
115 loop: b loop
116
117 /* Constantes (calculo de stack, si la SRAM del LPC comienza en 0x40000000, y mide 16Kb = 4000h) */
118 stack_addr: .word 0x40004000
119
120 PLLBASE: .word 0xE01FC080
121 MAMBASE: .word 0xE01FC000
122 STACK_START: .word 0x40004000
123
124
125 /* Simbolos del linker script */
126
127 data_source: .word _etext
128 data_start: .word _data
129 data_end: .word _edata
130 bss_start: .word _bss
131 bss_end: .word _ebss
132
133 /*
134 * ----------------------------------------------------------------
135 * Constantes de 8 bits
136 * ----------------------------------------------------------------
137 *
138 * las constantes de 8 bits son usadas como valores inmediatos y offset
139 */
140
141 @ PLL configuration
142 .equ PLLCON_OFFSET, 0x0
143 .equ PLLCFG_OFFSET, 0x4
144 .equ PLLSTAT_OFFSET, 0x8
145 .equ PLLFEED_OFFSET, 0xC
146
147 .equ PLLCON_PLLE, (1 << 0)
148 .equ PLLCON_PLLC, (1 << 1)
149 .equ PLLSTAT_PLOCK, (1 << 10)
150 .equ PLLFEED1, 0xAA
151 .equ PLLFEED2, 0x55
152
153 .equ PLLCFG_VALUE, 0x23
154 @ configuracíon del PLL para cristal de 14,7456 Mhz
155
156
157
158 @ MAM configuration
159 .equ MAMCR_OFFSET, 0x0
160 .equ MAMTIM_OFFSET, 0x4
161
162 .equ MAMCR_VALUE, 0x2 /* fully enabled */
163 .equ MAMTIM_VALUE, 0x4 /* fetch cycles */
164
165 @ stack configuration
166 .equ FIQ_MODE, 0x11
167 .equ FIQ_STACK_SIZE, 0x8
168 .equ FIQ_DISABLE, (1 << 6)
169 .equ IRQ_DISABLE, (1 << 7)
170 .equ IRQ_STACK_SIZE, 0x100
171 .equ IRQ_MODE, 0x12
172 .equ SYS_MODE, 0x1F
173
174 .end
Archivos adjuntos
Para referirse a los adjuntos de una página, usa attachment:nombredelarchivo, como se muestra abajo en la lista de archivos. NO uses la URL del enlace [get], ya que puede cambiar fácilmente y dejar de funcionar.No tienes permisos para adjuntar un archivo a esta página.