/
combotablecrt_stm32f030x6.S
232 lines (174 loc) · 5.15 KB
/
combotablecrt_stm32f030x6.S
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
/*****************************************************************************
* isr vector table combined with startup code for stm32f030x4 and f030x6 *
* Author : Jan Oleksiewicz <jnk0le@hotmail.com> *
* License: CC0 *
*****************************************************************************/
//assumptions:
// - initialized sections are 4 byte aligned (init in 4 byte steps)
// - .bss is right after .data in RAM
// - .preinit_array is right after .data LMA in FLASH
// - .init_array is right after .preinit_array
// - main() doesn't return
.syntax unified
.thumb
.section .isr_vector_table, "ax", %progbits
// general allocation strategy:
// r0 - tmp
// r2 - working mem ptr (.data + .bss)
// r3 - .data final condition
// r4 - .bss final condition
// r5 - LMA data
// r6 - final cond for static initializers
.global __irq_vector_table // consistent with c version, should not compile if xxx_vectors.c gets also pulled in
__irq_vector_table:
.long __main_stack_end__
.long Reset_Handler
.long NMI_Handler
.long HardFault_Handler
// 28 bytes available here
2: ldmia r5!, {r0}
stmia r2!, {r0}
1: cmp r2, r3
bne 2b
ldr r4, bss_end
movs r0, #0
#if !defined(__CRT_NO_STATIC_INITIALIZERS)
ldr r6, init_array_end
b 3f // branch to cmp first, bss init fits into 8B space
6: ldmia r5!, {r0}
blx r0
5: cmp r5, r6
bne 6b
bl main
#else
b 3f // branch to cmp first, bss init fits into 8B space
5: bl main
//padding
b .
nop
nop
nop
nop
#endif
.long SVC_Handler
// 8 bytes available here
.thumb_func
.global Reset_Handler
Reset_Handler:
ldr r5, data_init_start
ldr r2, data_start
ldr r3, data_end
b 1b // branch to cmp first and escape from scattered space
.long PendSV_Handler
.long SysTick_Handler
// device irq's
.long WWDG_IRQHandler
// 4 bytes available here
.balign 4
data_init_start:
.long __data_init_start__
.long RTC_IRQHandler
.long FLASH_IRQHandler
.long RCC_IRQHandler
.long EXTI0_1_IRQHandler
.long EXTI2_3_IRQHandler
.long EXTI4_15_IRQHandler
// 4 bytes available here
.balign 4
data_start:
.long __data_start__
.long DMA1_Channel1_IRQHandler
.long DMA1_Channel2_3_IRQHandler
.long DMA1_Channel4_5_IRQHandler
.long ADC1_IRQHandler
.long TIM1_BRK_UP_TRG_COM_IRQHandler
.long TIM1_CC_IRQHandler
// 4 bytes available here
.balign 4
data_end:
.long __data_end__
.long TIM3_IRQHandler
// 8 bytes available here // TIM6_IRQHandler on x8 + TIM7_IRQHandler on xC
4: stmia r2!, {r0}
3: cmp r2, r4
bne 4b
b 5b // branch to cmp first and escape from scattered space
.long TIM14_IRQHandler
// 4 bytes available here // TIM15_IRQHandler on x8
.balign 4
bss_end:
.long __bss_end__
.long TIM16_IRQHandler
.long TIM17_IRQHandler
.long I2C1_IRQHandler
// 4 bytes available here // I2C2_IRQHandler on x8
.balign 4
#if !defined(__CRT_NO_STATIC_INITIALIZERS)
init_array_end:
.long __init_array_end
#else
.long 0
#endif
.long SPI1_IRQHandler
// 4 bytes available here // SPI2_IRQHandler on x8
.thumb_func
Default_Handler:
bkpt #0
b Default_Handler
.long USART1_IRQHandler
// USART2_IRQHandler on x8
// USART3_6_IRQHandler on xC
// weak assignments to Default_Handler
.weak NMI_Handler
.thumb_set NMI_Handler,Default_Handler
.weak HardFault_Handler
.thumb_set HardFault_Handler,Default_Handler
.weak SVC_Handler
.thumb_set SVC_Handler,Default_Handler
.weak PendSV_Handler
.thumb_set PendSV_Handler,Default_Handler
.weak SysTick_Handler
.thumb_set SysTick_Handler,Default_Handler
.weak WWDG_IRQHandler
.thumb_set WWDG_IRQHandler,Default_Handler
.weak RTC_IRQHandler
.thumb_set RTC_IRQHandler,Default_Handler
.weak FLASH_IRQHandler
.thumb_set FLASH_IRQHandler,Default_Handler
.weak RCC_IRQHandler
.thumb_set RCC_IRQHandler,Default_Handler
.weak EXTI0_1_IRQHandler
.thumb_set EXTI0_1_IRQHandler,Default_Handler
.weak EXTI2_3_IRQHandler
.thumb_set EXTI2_3_IRQHandler,Default_Handler
.weak EXTI4_15_IRQHandler
.thumb_set EXTI4_15_IRQHandler,Default_Handler
.weak DMA1_Channel1_IRQHandler
.thumb_set DMA1_Channel1_IRQHandler,Default_Handler
.weak DMA1_Channel2_3_IRQHandler
.thumb_set DMA1_Channel2_3_IRQHandler,Default_Handler
.weak DMA1_Channel4_5_IRQHandler
.thumb_set DMA1_Channel4_5_IRQHandler,Default_Handler
.weak ADC1_IRQHandler
.thumb_set ADC1_IRQHandler,Default_Handler
.weak TIM1_BRK_UP_TRG_COM_IRQHandler
.thumb_set TIM1_BRK_UP_TRG_COM_IRQHandler,Default_Handler
.weak TIM1_CC_IRQHandler
.thumb_set TIM1_CC_IRQHandler,Default_Handler
.weak TIM3_IRQHandler
.thumb_set TIM3_IRQHandler,Default_Handler
.weak TIM14_IRQHandler
.thumb_set TIM14_IRQHandler,Default_Handler
.weak TIM16_IRQHandler
.thumb_set TIM16_IRQHandler,Default_Handler
.weak TIM17_IRQHandler
.thumb_set TIM17_IRQHandler,Default_Handler
.weak I2C1_IRQHandler
.thumb_set I2C1_IRQHandler,Default_Handler
.weak SPI1_IRQHandler
.thumb_set SPI1_IRQHandler,Default_Handler
.weak USART1_IRQHandler
.thumb_set USART1_IRQHandler,Default_Handler
#if !defined(STM32F030x6)
#error "unsupported or unknown MCU"
#endif