aboutsummaryrefslogtreecommitdiffstats
path: root/os/ports/GCC/ARMCMx/STM32/vectors.c
blob: d2306add0beb17ca9b7a38622eaf1f6f8a03f141 (plain)
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
/*
    ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.

    This file is part of ChibiOS/RT.

    ChibiOS/RT is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.

    ChibiOS/RT is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/**
 * @file    STM32/vectors.c
 * @brief   Interrupt vectors for the STM32 family.
 *
 * @defgroup ARMCMx_STM32_VECTORS STM32 Interrupt Vectors
 * @ingroup ARMCMx_SPECIFIC
 * @details Interrupt vectors for the STM32 family.
 * @{
 */

#include "ch.h"

#if !defined(STM32F10X_LD) && !defined(STM32F10X_LD_VL) &&                  \
    !defined(STM32F10X_MD) && !defined(STM32F10X_MD_VL) &&                  \
    !defined(STM32F10X_HD) && !defined(STM32F10X_XL) &&                     \
    !defined(STM32F10X_CL)
#include "board.h"
#endif

#if !defined(__DOXYGEN__)
extern void __ram_end__(void);
extern void ResetHandler(void);
extern void NMIVector(void);
extern void HardFaultVector(void);
extern void MemManageVector(void);
extern void BusFaultVector(void);
extern void UsageFaultVector(void);
extern void Vector1C(void);
extern void Vector20(void);
extern void Vector24(void);
extern void Vector28(void);
extern void SVCallVector(void);
extern void DebugMonitorVector(void);
extern void Vector34(void);
extern void PendSVVector(void);
extern void SysTickVector(void);
extern void Vector40(void);
extern void Vector44(void);
extern void Vector48(void);
extern void Vector4C(void);
extern void Vector50(void);
extern void Vector54(void);
extern void Vector58(void);
extern void Vector5C(void);
extern void Vector60(void);
extern void Vector64(void);
extern void Vector68(void);
extern void Vector6C(void);
extern void Vector70(void);
extern void Vector74(void);
extern void Vector78(void);
extern void Vector7C(void);
extern void Vector80(void);
extern void Vector84(void);
extern void Vector88(void);
extern void Vector8C(void);
extern void Vector90(void);
extern void Vector94(void);
extern void Vector98(void);
extern void Vector9C(void);
extern void VectorA0(void);
extern void VectorA4(void);
extern void VectorA8(void);
extern void VectorAC(void);
extern void VectorB0(void);
extern void VectorB4(void);
extern void VectorB8(void);
extern void VectorBC(void);
extern void VectorC0(void);
extern void VectorC4(void);
extern void VectorC8(void);
extern void VectorCC(void);
extern void VectorD0(void);
extern void VectorD4(void);
extern void VectorD8(void);
extern void VectorDC(void);
extern void VectorE0(void);
extern void VectorE4(void);
extern void VectorE8(void);
#if defined(STM32F10X_MD_VL) || defined(STM32F10X_HD) || defined(STM32F10X_CL)
extern void VectorEC(void);
extern void VectorF0(void);
extern void VectorF4(void);
#endif
#if defined(STM32F10X_HD) || defined(STM32F10X_CL)
extern void VectorF8(void);
extern void VectorFC(void);
extern void Vector100(void);
extern void Vector104(void);
extern void Vector108(void);
extern void Vector10C(void);
extern void Vector110(void);
extern void Vector114(void);
extern void Vector118(void);
extern void Vector11C(void);
extern void Vector120(void);
extern void Vector124(void);
extern void Vector128(void);
extern void Vector12C(void);
#endif
#if defined(STM32F10X_CL)
extern void Vector130(void);
extern void Vector134(void);
extern void Vector138(void);
extern void Vector13C(void);
extern void Vector140(void);
extern void Vector144(void);
extern void Vector148(void);
extern void Vector14C(void);
#endif
#endif

/**
 * @brief   STM32 vectors table.
 */
#if !defined(__DOXYGEN__)
__attribute__ ((section("vectors")))
#endif
void  (*_vectors[])(void) = {
  __ram_end__,        ResetHandler,       NMIVector,          HardFaultVector,
  MemManageVector,    BusFaultVector,     UsageFaultVector,   Vector1C,
  Vector20,           Vector24,           Vector28,           SVCallVector,
  DebugMonitorVector, Vector34,           PendSVVector,       SysTickVector,
  Vector40,           Vector44,           Vector48,           Vector4C,
  Vector50,           Vector54,           Vector58,           Vector5C,
  Vector60,           Vector64,           Vector68,           Vector6C,
  Vector70,           Vector74,           Vector78,           Vector7C,
  Vector80,           Vector84,           Vector88,           Vector8C,
  Vector90,           Vector94,           Vector98,           Vector9C,
  VectorA0,           VectorA4,           VectorA8,           VectorAC,
  VectorB0,           VectorB4,           VectorB8,           VectorBC,
  VectorC0,           VectorC4,           VectorC8,           VectorCC,
  VectorD0,           VectorD4,           VectorD8,           VectorDC,
  VectorE0,           VectorE4,           VectorE8,
#if defined(STM32F10X_MD_VL) || defined(STM32F10X_HD) ||                    \
    defined(STM32F10X_XL)    || defined(STM32F10X_CL)
  VectorEC,           VectorF0,           VectorF4,
#endif
#if defined(STM32F10X_HD)    || defined(STM32F10X_XL) || defined(STM32F10X_CL)
  VectorF8,           VectorFC,           Vector100,          Vector104,
  Vector108,          Vector10C,          Vector110,          Vector114,
  Vector118,          Vector11C,          Vector120,          Vector124,
  Vector128,          Vector12C,
#endif
#if defined(STM32F10X_CL)
  Vector130,          Vector134,          Vector138,          Vector13C,
  Vector140,          Vector144,          Vector148,          Vector14C
#endif
};

/**
 * @brief   Unhandled exceptions handler.
 * @details Any undefined exception vector points to this function by default.
 *          This function simply stops the system into an infinite loop.
 *
 * @notapi
 */
#if !defined(__DOXYGEN__)
__attribute__ ((naked))
#endif
void _unhandled_exception(void) {

  asm volatile (
    ".weak NMIVector            \nNMIVector:                \n\t"
    ".weak HardFaultVector      \nHardFaultVector:          \n\t"
    ".weak MemManageVector      \nMemManageVector:          \n\t"
    ".weak BusFaultVector       \nBusFaultVector:           \n\t"
    ".weak UsageFaultVector     \nUsageFaultVector:         \n\t"
    ".weak Vector1C             \nVector1C:                 \n\t"
    ".weak Vector20             \nVector20:                 \n\t"
    ".weak Vector24             \nVector24:                 \n\t"
    ".weak Vector28             \nVector28:                 \n\t"
    ".weak SVCallVector         \nSVCallVector:             \n\t"
    ".weak DebugMonitorVector   \nDebugMonitorVector:       \n\t"
    ".weak Vector34             \nVector34:                 \n\t"
    ".weak PendSVVector         \nPendSVVector:             \n\t"
    ".weak SysTickVector        \nSysTickVector:            \n\t"
    ".weak Vector40             \nVector40:                 \n\t"
    ".weak Vector44             \nVector44:                 \n\t"
    ".weak Vector48             \nVector48:                 \n\t"
    ".weak Vector4C             \nVector4C:                 \n\t"
    ".weak Vector50             \nVector50:                 \n\t"
    ".weak Vector54             \nVector54:                 \n\t"
    ".weak Vector58             \nVector58:                 \n\t"
    ".weak Vector5C             \nVector5C:                 \n\t"
    ".weak Vector60             \nVector60:                 \n\t"
    ".weak Vector64             \nVector64:                 \n\t"
    ".weak Vector68             \nVector68:                 \n\t"
    ".weak Vector6C             \nVector6C:                 \n\t"
    ".weak Vector70             \nVector70:                 \n\t"
    ".weak Vector74             \nVector74:                 \n\t"
    ".weak Vector78             \nVector78:                 \n\t"
    ".weak Vector7C             \nVector7C:                 \n\t"
    ".weak Vector80             \nVector80:                 \n\t"
    ".weak Vector84             \nVector84:                 \n\t"
    ".weak Vector88             \nVector88:                 \n\t"
    ".weak Vector8C             \nVector8C:                 \n\t"
    ".weak Vector90             \nVector90:                 \n\t"
    ".weak Vector94             \nVector94:                 \n\t"
    ".weak Vector98             \nVector98:                 \n\t"
    ".weak Vector9C             \nVector9C:                 \n\t"
    ".weak VectorA0             \nVectorA0:                 \n\t"
    ".weak VectorA4             \nVectorA4:                 \n\t"
    ".weak VectorA8             \nVectorA8:                 \n\t"
    ".weak VectorAC             \nVectorAC:                 \n\t"
    ".weak VectorB0             \nVectorB0:                 \n\t"
    ".weak VectorB4             \nVectorB4:                 \n\t"
    ".weak VectorB8             \nVectorB8:                 \n\t"
    ".weak VectorBC             \nVectorBC:                 \n\t"
    ".weak VectorC0             \nVectorC0:                 \n\t"
    ".weak VectorC4             \nVectorC4:                 \n\t"
    ".weak VectorC8             \nVectorC8:                 \n\t"
    ".weak VectorCC             \nVectorCC:                 \n\t"
    ".weak VectorD0             \nVectorD0:                 \n\t"
    ".weak VectorD4             \nVectorD4:                 \n\t"
    ".weak VectorD8             \nVectorD8:                 \n\t"
    ".weak VectorDC             \nVectorDC:                 \n\t"
    ".weak VectorE0             \nVectorE0:                 \n\t"
    ".weak VectorE4             \nVectorE4:                 \n\t"
    ".weak VectorE8             \nVectorE8:                 \n\t"
#if defined(STM32F10X_MD_VL) || defined(STM32F10X_HD) ||                    \
    defined(STM32F10X_XL)    || defined(STM32F10X_CL)
    ".weak VectorEC             \nVectorEC:                 \n\t"
    ".weak VectorF0             \nVectorF0:                 \n\t"
    ".weak VectorF4             \nVectorF4:                 \n\t"
#endif
#if defined(STM32F10X_HD)    || defined(STM32F10X_XL) || defined(STM32F10X_CL)
    ".weak VectorF8             \nVectorF8:                 \n\t"
    ".weak VectorFC             \nVectorFC:                 \n\t"
    ".weak Vector100            \nVector100:                \n\t"
    ".weak Vector104            \nVector104:                \n\t"
    ".weak Vector108            \nVector108:                \n\t"
    ".weak Vector10C            \nVector10C:                \n\t"
    ".weak Vector110            \nVector110:                \n\t"
    ".weak Vector114            \nVector114:                \n\t"
    ".weak Vector118            \nVector118:                \n\t"
    ".weak Vector11C            \nVector11C:                \n\t"
    ".weak Vector120            \nVector120:                \n\t"
    ".weak Vector124            \nVector124:                \n\t"
    ".weak Vector128            \nVector128:                \n\t"
    ".weak Vector12C            \nVector12C:                \n\t"
#endif
#if defined(STM32F10X_CL)
    ".weak Vector130            \nVector130:                \n\t"
    ".weak Vector134            \nVector134:                \n\t"
    ".weak Vector138            \nVector138:                \n\t"
    ".weak Vector13C            \nVector13C:                \n\t"
    ".weak Vector140            \nVector140:                \n\t"
    ".weak Vector144            \nVector144:                \n\t"
    ".weak Vector148            \nVector148:                \n\t"
    ".weak Vector14C            \nVector14C:                \n\t"
#endif
  );

  while (TRUE)
    ;
}

/** @} */