1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
|
.org 0x200
.global Reset_Handler,hard_fault_handler,svc_handler,pendsv_handler,systick,irq0,irq1,irq2,irq3,irq4,irq5,irq6,irq7,irq8,irq9,irq10,irq11,irq12,irq13,irq14,irq15,irq16,irq17,irq18,irq19,irq20,irq21,irq22,irq23,irq24,irq25,irq26,irq27,irq28,irq29,irq30,irq31
.long
Reset_Handler:
ldr r0,=hardware_init
bx r0
.thumb_func
hard_fault_handler:
ldr r0,=HARD_FAULT_IRQHandler
bx r0
nop
.thumb_func
svc_handler:
ldr r0,=SVC_IRQHandler
bx r0
nop
.thumb_func
pendsv_handler:
ldr r0,=PENDSV_IRQHandler
bx r0
nop
.thumb_func
systick:
ldr r0,=SYSTICK_IRQHandler
bx r0
nop
.thumb_func
irq0:
mov r0,#4*0
b isr
.thumb_func
irq1:
mov r0,#4*1
b isr
.thumb_func
irq2:
mov r0,#4*2
b isr
.thumb_func
irq3:
mov r0,#4*3
b isr
.thumb_func
irq4:
mov r0,#4*4
b isr
.thumb_func
irq5:
mov r0,#4*5
b isr
.thumb_func
irq6:
mov r0,#4*6
b isr
.thumb_func
irq7:
mov r0,#4*7
b isr
.thumb_func
irq8:
mov r0,#4*8
b isr
.thumb_func
irq9:
mov r0,#4*9
b isr
.thumb_func
irq10:
mov r0,#4*10
b isr
.thumb_func
irq11:
mov r0,#4*11
b isr
.thumb_func
irq12:
mov r0,#4*12
b isr
.thumb_func
irq13:
mov r0,#4*13
b isr
.thumb_func
irq14:
mov r0,#4*14
b isr
.thumb_func
irq15:
mov r0,#4*15
b isr
.thumb_func
irq16:
mov r0,#4*16
b isr
.thumb_func
irq17:
mov r0,#4*17
b isr
.thumb_func
irq18:
mov r0,#4*18
b isr
.thumb_func
irq19:
mov r0,#4*19
b isr
.thumb_func
irq20:
mov r0,#4*20
b isr
.thumb_func
irq21:
mov r0,#4*21
b isr
.thumb_func
irq22: mov r0,#4*22
b isr
.thumb_func
irq23:
mov r0,#4*23
b isr
.thumb_func
irq24:
mov r0,#4*24
b isr
.thumb_func
irq25: mov r0,#4*25
b isr
.thumb_func
irq26:
mov r0,#4*26
b isr
.thumb_func
irq27:
mov r0,#4*27
b isr
.thumb_func
irq28:
mov r0,#4*28
b isr
.thumb_func
irq29:
mov r0,#4*29
b isr
.thumb_func
irq30:
mov r0,#4*30
b isr
.thumb_func
irq31:
mov r0,#4*31
b isr
.thumb_func
isr:
ldr r1,=isr_table
ldr r0,[r0, r1]
bx r0
.align 4
isr_table:
.long USB_IRQHandler
.long IIC_IRQHandler
.long QSPI_IRQHandler
.long SPI0_IRQHandler
.long SPI1_IRQHandler
.long UART0_IRQHandler
.long UART1_IRQHandler
.long MEMCP_IRQHandler
.long RSA_IRQHandler
.long SCI0_IRQHandler
.long SCI1_IRQHandler
.long BT_IRQHandler
.long GPIO_IRQHandler
.long TIMER0_IRQHandler
.long TIMER1_IRQHandler
.long TIMER2_IRQHandler
.long TIMER3_IRQHandler
.long TIMER4_IRQHandler
.long TIMER5_IRQHandler
.long TIMER6_IRQHandler
.long TIMER7_IRQHandler
.long TIMER8_IRQHandler
.long SM4_IRQHandler
.long SEC_IRQHandler
.long MSR_IRQHandler
.long TRNG_IRQHandler
.long WDT_IRQHandler
.thumb
.thumb_func
hardware_init:
ldr r1, =__exidx_start
ldr r2, =__data_start__
ldr r3, =__data_end__
sub r3, r2
ble .L_loop1_done
.L_loop1:
sub r3, #4
ldr r0, [r1,r3]
str r0, [r2,r3]
bgt .L_loop1
.L_loop1_done:
/* Single BSS section scheme.
*
* The BSS section is specified by following symbols
* _sbss: start of the BSS section.
* _ebss: end of the BSS section.
*
* Both addresses must be aligned to 4 bytes boundary.
*/
ldr r1, =__bss_start__
ldr r2, =__bss_end__
mov r0, #0
sub r2, r1
ble .L_loop3_done
.L_loop3:
sub r2, #4
str r0, [r1, r2]
bgt .L_loop3
.L_loop3_done:
ldr r0,=0x12345
ldr r3,=0x1111
bl main
.globl delay
.syntax unified
delay:
subs r0,#1
bne delay
nop
bx lr
.align 1
.thumb_func
.weak Default_Handler
.type Default_Handler, %function
Default_Handler:
b .
.size Default_Handler, . - Default_Handler
/* Macro to define default handlers. Default handler
* will be weak symbol and just dead loops. They can be
* overwritten by other handlers */
.macro def_irq_handler handler_name
.weak \handler_name
.set \handler_name, Default_Handler
.endm
def_irq_handler HARD_FAULT_IRQHandler
def_irq_handler SVC_IRQHandler
def_irq_handler PENDSV_IRQHandler
def_irq_handler SYSTICK_IRQHandler
def_irq_handler USB_IRQHandler
def_irq_handler IIC_IRQHandler
def_irq_handler QSPI_IRQHandler
def_irq_handler SPI0_IRQHandler
def_irq_handler SPI1_IRQHandler
def_irq_handler UART0_IRQHandler
def_irq_handler UART1_IRQHandler
def_irq_handler MEMCP_IRQHandler
def_irq_handler RSA_IRQHandler
def_irq_handler SCI0_IRQHandler
def_irq_handler SCI1_IRQHandler
def_irq_handler BT_IRQHandler
def_irq_handler GPIO_IRQHandler
def_irq_handler EXTI0_IRQHandler
def_irq_handler EXTI1_IRQHandler
def_irq_handler EXTI2_IRQHandler
def_irq_handler TIMER0_IRQHandler
def_irq_handler TIMER1_IRQHandler
def_irq_handler TIMER2_IRQHandler
def_irq_handler TIMER3_IRQHandler
def_irq_handler TIMER4_IRQHandler
def_irq_handler TIMER5_IRQHandler
def_irq_handler TIMER6_IRQHandler
def_irq_handler TIMER7_IRQHandler
def_irq_handler TIMER8_IRQHandler
def_irq_handler SM4_IRQHandler
def_irq_handler SEC_IRQHandler
def_irq_handler MSR_IRQHandler
def_irq_handler TRNG_IRQHandler
def_irq_handler WDT_IRQHandler
|