Contiki 2.5
startup-STM32F10x.c
1 #include <stdint.h>
2 #include <stm32f10x_map.h>
3 
4 
5 extern int main(void);
6 
7 typedef void (*ISR_func)(void);
8 
9 
10 #define SECTION(x) __attribute__ ((section(#x)))
11 #define ISR_VECTOR_SECTION SECTION(.isr_vector)
12 static void sys_reset(void) __attribute__((naked));
13 void NMI_handler(void) __attribute__((interrupt));
14 void HardFault_handler(void) __attribute__((interrupt));
15 void MemManage_handler(void) __attribute__((interrupt));
16 void BusFault_handler(void) __attribute__((interrupt));
17 void UsageFault_handler(void) __attribute__((interrupt));
18 
19 static void unhandled_int(void) __attribute__((interrupt));
20 
21 #define UNHANDLED_ALIAS __attribute__((weak, alias("unhandled_int")));
22 void Main_Stack_End(void);
23 void HardFault_handler(void)__attribute__((weak, alias("dHardFault_handler")));
24 void MemManage_handler(void)__attribute__((weak, alias("dMemManage_handler")));
25 void BusFault_handler(void) __attribute__((weak, alias("dBusFault_handler")));
26 void UsageFault_handler(void)__attribute__((weak, alias("dUsageFault_handler")));
27  void Reserved_handler(void) UNHANDLED_ALIAS;
28  void SVCall_handler(void) UNHANDLED_ALIAS;
29  void DebugMonitor_handler(void) UNHANDLED_ALIAS;
30  void PendSV_handler(void) UNHANDLED_ALIAS;
31  void SysTick_handler(void) UNHANDLED_ALIAS;
32  void WWDG_handler(void) UNHANDLED_ALIAS;
33  void PVD_handler(void) UNHANDLED_ALIAS;
34  void TAMPER_handler(void) UNHANDLED_ALIAS;
35  void RTC_handler(void) UNHANDLED_ALIAS;
36  void FLASH_handler(void) UNHANDLED_ALIAS;
37  void RCC_handler(void) UNHANDLED_ALIAS;
38  void EXTI0_handler(void) UNHANDLED_ALIAS;
39  void EXTI1_handler(void) UNHANDLED_ALIAS;
40  void EXTI2_handler(void) UNHANDLED_ALIAS;
41  void EXTI3_handler(void) UNHANDLED_ALIAS;
42  void EXTI4_handler(void) UNHANDLED_ALIAS;
43  void DMA1_Channel1_handler(void) UNHANDLED_ALIAS;
44  void DMA1_Channel2_handler(void) UNHANDLED_ALIAS;
45  void DMA1_Channel3_handler(void) UNHANDLED_ALIAS;
46  void DMA1_Channel4_handler(void) UNHANDLED_ALIAS;
47  void DMA1_Channel5_handler(void) UNHANDLED_ALIAS;
48  void DMA1_Channel6_handler(void) UNHANDLED_ALIAS;
49  void DMA1_Channel7_handler(void) UNHANDLED_ALIAS;
50  void ADC1_2_handler(void) UNHANDLED_ALIAS;
51  void USB_HP_CAN_TX_handler(void) UNHANDLED_ALIAS;
52  void USB_LP_CAN_RX0_handler(void) UNHANDLED_ALIAS;
53  void CAN_RX1_handler(void) UNHANDLED_ALIAS;
54  void CAN_SCE_handler(void) UNHANDLED_ALIAS;
55  void EXTI9_5_handler(void) UNHANDLED_ALIAS;
56  void TIM1_BRK_handler(void) UNHANDLED_ALIAS;
57  void TIM1_UP_handler(void) UNHANDLED_ALIAS;
58  void TIM1_TRG_COM_handler(void) UNHANDLED_ALIAS;
59  void TIM1_CC_handler(void) UNHANDLED_ALIAS;
60  void TIM2_handler(void) UNHANDLED_ALIAS;
61  void TIM3_handler(void) UNHANDLED_ALIAS;
62  void TIM4_handler(void) UNHANDLED_ALIAS;
63  void I2C1_EV_handler(void) UNHANDLED_ALIAS;
64  void I2C1_ER_handler(void) UNHANDLED_ALIAS;
65  void I2C2_EV_handler(void) UNHANDLED_ALIAS;
66  void I2C2_ER_handler(void) UNHANDLED_ALIAS;
67  void SPI1_handler(void) UNHANDLED_ALIAS;
68  void SPI2_handler(void) UNHANDLED_ALIAS;
69  void USART1_handler(void) UNHANDLED_ALIAS;
70  void USART2_handler(void) UNHANDLED_ALIAS;
71  void USART3_handler(void) UNHANDLED_ALIAS;
72  void EXTI15_10_handler(void) UNHANDLED_ALIAS;
73  void RTCAlarm_handler(void) UNHANDLED_ALIAS;
74  void USBWakeup_handler(void) UNHANDLED_ALIAS;
75  void TIM8_BRK_handler(void) UNHANDLED_ALIAS;
76  void TIM8_UP_handler(void) UNHANDLED_ALIAS;
77  void TIM8_TRG_COM_handler(void) UNHANDLED_ALIAS;
78  void TIM8_CC_handler(void) UNHANDLED_ALIAS;
79  void ADC3_handler(void) UNHANDLED_ALIAS;
80  void FSMC_handler(void) UNHANDLED_ALIAS;
81  void SDIO_handler(void) UNHANDLED_ALIAS;
82  void TIM5_handler(void) UNHANDLED_ALIAS;
83  void SPI3_handler(void) UNHANDLED_ALIAS;
84  void UART4_handler(void) UNHANDLED_ALIAS;
85  void UART5_handler(void) UNHANDLED_ALIAS;
86  void TIM6_handler(void) UNHANDLED_ALIAS;
87  void TIM7_handler(void) UNHANDLED_ALIAS;
88  void DMA2_Channel1_handler(void) UNHANDLED_ALIAS;
89  void DMA2_Channel2_handler(void) UNHANDLED_ALIAS;
90  void DMA2_Channel3_handler(void) UNHANDLED_ALIAS;
91  void DMA2_Channel4_5_handler(void) UNHANDLED_ALIAS;
92 
93 const ISR_func isr_vector[76] ISR_VECTOR_SECTION =
94  {
95  Main_Stack_End,
96  sys_reset,
97  NMI_handler,
98  HardFault_handler,
99  MemManage_handler,
100  BusFault_handler,
101  UsageFault_handler,
102  Reserved_handler,
103  Reserved_handler,
104  Reserved_handler,
105  Reserved_handler,
106  SVCall_handler,
107  DebugMonitor_handler,
108  Reserved_handler,
109  PendSV_handler,
110  SysTick_handler,
111  WWDG_handler,
112  PVD_handler,
113  TAMPER_handler,
114  RTC_handler,
115  FLASH_handler,
116  RCC_handler,
117  EXTI0_handler,
118  EXTI1_handler,
119  EXTI2_handler,
120  EXTI3_handler,
121  EXTI4_handler,
122  DMA1_Channel1_handler,
123  DMA1_Channel2_handler,
124  DMA1_Channel3_handler,
125  DMA1_Channel4_handler,
126  DMA1_Channel5_handler,
127  DMA1_Channel6_handler,
128  DMA1_Channel7_handler,
129  ADC1_2_handler,
130  USB_HP_CAN_TX_handler,
131  USB_LP_CAN_RX0_handler,
132  CAN_RX1_handler,
133  CAN_SCE_handler,
134  EXTI9_5_handler,
135  TIM1_BRK_handler,
136  TIM1_UP_handler,
137  TIM1_TRG_COM_handler,
138  TIM1_CC_handler,
139  TIM2_handler,
140  TIM3_handler,
141  TIM4_handler,
142  I2C1_EV_handler,
143  I2C1_ER_handler,
144  I2C2_EV_handler,
145  I2C2_ER_handler,
146  SPI1_handler,
147  SPI2_handler,
148  USART1_handler,
149  USART2_handler,
150  USART3_handler,
151  EXTI15_10_handler,
152  RTCAlarm_handler,
153  USBWakeup_handler,
154  TIM8_BRK_handler,
155  TIM8_UP_handler,
156  TIM8_TRG_COM_handler,
157  TIM8_CC_handler,
158  ADC3_handler,
159  FSMC_handler,
160  SDIO_handler,
161  TIM5_handler,
162  SPI3_handler,
163  UART4_handler,
164  UART5_handler,
165  TIM6_handler,
166  TIM7_handler,
167  DMA2_Channel1_handler,
168  DMA2_Channel2_handler,
169  DMA2_Channel3_handler,
170  DMA2_Channel4_5_handler
171  };
172 
173 
174 
175 
176 extern uint8_t _data[];
177 extern uint8_t _etext[];
178 extern uint8_t _edata[];
179 
180 static void
181 copy_initialized(void)
182 {
183  uint8_t *ram = _data;
184  uint8_t *rom = _etext;
185  while(ram < _edata) {
186  *ram++ = *rom++;
187  }
188 }
189 
190 extern uint8_t __bss_start[];
191 extern uint8_t __bss_end[];
192 
193 static void
194 clear_bss(void)
195 {
196  uint8_t *m = __bss_start;
197  while(m < __bss_end) {
198  *m++ = 0;
199  }
200 }
201 
202 static void
203 start_hse_clock(void)
204 {
205  /* Start external oscillator */
206  RCC->CR |= RCC_CR_HSEON;
207  /* Wait for oscillator to stabilize */
208  while(!(RCC->CR & RCC_CR_HSERDY));
209 }
210 
211 static void
212 use_pll()
213 {
214  RCC->CFGR = (RCC_CFGR_MCO_NOCLOCK
215  | RCC_CFGR_PLLMULL6 /* PLL at 48MHz */
216  | RCC_CFGR_PLLSRC /* PLL runs on HSE */
217  | RCC_CFGR_PPRE2_DIV1 /* APB2 at 48MHz */
218  | RCC_CFGR_PPRE1_DIV2 /* APB1 at 24MHz */
219  | RCC_CFGR_HPRE_DIV1 /* AHB at 48 MHz */
220  | RCC_CFGR_USBPRE /* USB clock at same speed as PLL */
221  );
222  RCC->CR |= RCC_CR_PLLON;
223  /* Wait for PLL */
224  while(!(RCC->CR & RCC_CR_PLLRDY));
225  /* Switch to PLL as system clock */
226  MODIFY_REG(RCC->CFGR, RCC_CFGR_SW,RCC_CFGR_SW_PLL);
227 }
228 
229 static void
230 enable_fault_exceptions(void)
231 {
232  SCB->SHCSR |= (SCB_SHCSR_MEMFAULTENA | SCB_SHCSR_BUSFAULTENA
233  | SCB_SHCSR_USGFAULTENA);
234 }
235 
236 static void
237 sys_reset(void)
238 {
239  copy_initialized();
240  clear_bss();
241  enable_fault_exceptions();
242  start_hse_clock();
243  use_pll();
244  main();
245  while(1);
246 
247 }
248 
249 void
250 NMI_handler(void)
251 {
252  while(1);
253 }
254 
255 
256 static void
257 unhandled_int(void)
258 {
259  while(1);
260 }
261 
262 static void
263 dHardFault_handler(void)
264 {
265  while(1);
266 }
267 
268 static void
269 dUsageFault_handler(void)
270 {
271  while(1);
272 }
273 
274 static void
275 dMemManage_handler(void)
276 {
277  while(1);
278 }
279 
280 static void
281 dBusFault_handler(void)
282 {
283  while(1);
284 }