startup-STM32F10x.c

00001 #include <stdint.h>
00002 #include <stm32f10x_map.h>
00003 
00004 
00005 extern int main(void);
00006 
00007 typedef void (*ISR_func)(void);
00008 
00009   
00010 #define SECTION(x) __attribute__ ((section(#x)))
00011 #define ISR_VECTOR_SECTION SECTION(.isr_vector)
00012 static void sys_reset(void) __attribute__((naked));
00013 void NMI_handler(void) __attribute__((interrupt));
00014 void HardFault_handler(void) __attribute__((interrupt));
00015 void MemManage_handler(void) __attribute__((interrupt));
00016 void BusFault_handler(void) __attribute__((interrupt));
00017 void UsageFault_handler(void) __attribute__((interrupt));
00018 
00019 static void unhandled_int(void) __attribute__((interrupt));
00020 
00021 #define UNHANDLED_ALIAS __attribute__((weak, alias("unhandled_int")));
00022 void Main_Stack_End(void);
00023 void HardFault_handler(void)__attribute__((weak, alias("dHardFault_handler")));
00024 void MemManage_handler(void)__attribute__((weak, alias("dMemManage_handler")));
00025 void BusFault_handler(void) __attribute__((weak, alias("dBusFault_handler")));
00026 void UsageFault_handler(void)__attribute__((weak, alias("dUsageFault_handler")));
00027  void Reserved_handler(void) UNHANDLED_ALIAS;
00028  void SVCall_handler(void) UNHANDLED_ALIAS;
00029  void DebugMonitor_handler(void) UNHANDLED_ALIAS;
00030  void PendSV_handler(void) UNHANDLED_ALIAS;
00031  void SysTick_handler(void) UNHANDLED_ALIAS;
00032  void WWDG_handler(void) UNHANDLED_ALIAS;
00033  void PVD_handler(void) UNHANDLED_ALIAS;
00034  void TAMPER_handler(void) UNHANDLED_ALIAS;
00035  void RTC_handler(void) UNHANDLED_ALIAS;
00036  void FLASH_handler(void) UNHANDLED_ALIAS;
00037  void RCC_handler(void) UNHANDLED_ALIAS;
00038  void EXTI0_handler(void) UNHANDLED_ALIAS;
00039  void EXTI1_handler(void) UNHANDLED_ALIAS;
00040  void EXTI2_handler(void) UNHANDLED_ALIAS;
00041  void EXTI3_handler(void) UNHANDLED_ALIAS;
00042  void EXTI4_handler(void) UNHANDLED_ALIAS;
00043  void DMA1_Channel1_handler(void) UNHANDLED_ALIAS;
00044  void DMA1_Channel2_handler(void) UNHANDLED_ALIAS;
00045  void DMA1_Channel3_handler(void) UNHANDLED_ALIAS;
00046  void DMA1_Channel4_handler(void) UNHANDLED_ALIAS;
00047  void DMA1_Channel5_handler(void) UNHANDLED_ALIAS;
00048  void DMA1_Channel6_handler(void) UNHANDLED_ALIAS;
00049  void DMA1_Channel7_handler(void) UNHANDLED_ALIAS;
00050  void ADC1_2_handler(void) UNHANDLED_ALIAS;
00051  void USB_HP_CAN_TX_handler(void) UNHANDLED_ALIAS;
00052  void USB_LP_CAN_RX0_handler(void) UNHANDLED_ALIAS;
00053  void CAN_RX1_handler(void) UNHANDLED_ALIAS;
00054  void CAN_SCE_handler(void) UNHANDLED_ALIAS;
00055  void EXTI9_5_handler(void) UNHANDLED_ALIAS;
00056  void TIM1_BRK_handler(void) UNHANDLED_ALIAS;
00057  void TIM1_UP_handler(void) UNHANDLED_ALIAS;
00058  void TIM1_TRG_COM_handler(void) UNHANDLED_ALIAS;
00059  void TIM1_CC_handler(void) UNHANDLED_ALIAS;
00060  void TIM2_handler(void) UNHANDLED_ALIAS;
00061  void TIM3_handler(void) UNHANDLED_ALIAS;
00062  void TIM4_handler(void) UNHANDLED_ALIAS;
00063  void I2C1_EV_handler(void) UNHANDLED_ALIAS;
00064  void I2C1_ER_handler(void) UNHANDLED_ALIAS;
00065  void I2C2_EV_handler(void) UNHANDLED_ALIAS;
00066  void I2C2_ER_handler(void) UNHANDLED_ALIAS;
00067  void SPI1_handler(void) UNHANDLED_ALIAS;
00068  void SPI2_handler(void) UNHANDLED_ALIAS;
00069  void USART1_handler(void) UNHANDLED_ALIAS;
00070  void USART2_handler(void) UNHANDLED_ALIAS;
00071  void USART3_handler(void) UNHANDLED_ALIAS;
00072  void EXTI15_10_handler(void) UNHANDLED_ALIAS;
00073  void RTCAlarm_handler(void) UNHANDLED_ALIAS;
00074  void USBWakeup_handler(void) UNHANDLED_ALIAS; 
00075  void TIM8_BRK_handler(void) UNHANDLED_ALIAS;
00076  void TIM8_UP_handler(void) UNHANDLED_ALIAS;
00077  void TIM8_TRG_COM_handler(void) UNHANDLED_ALIAS;
00078  void TIM8_CC_handler(void) UNHANDLED_ALIAS;
00079  void ADC3_handler(void) UNHANDLED_ALIAS;
00080  void FSMC_handler(void) UNHANDLED_ALIAS;
00081  void SDIO_handler(void) UNHANDLED_ALIAS;
00082  void TIM5_handler(void) UNHANDLED_ALIAS;
00083  void SPI3_handler(void) UNHANDLED_ALIAS;
00084  void UART4_handler(void) UNHANDLED_ALIAS;
00085  void UART5_handler(void) UNHANDLED_ALIAS;
00086  void TIM6_handler(void) UNHANDLED_ALIAS;
00087  void TIM7_handler(void) UNHANDLED_ALIAS;
00088  void DMA2_Channel1_handler(void) UNHANDLED_ALIAS;
00089  void DMA2_Channel2_handler(void) UNHANDLED_ALIAS;
00090  void DMA2_Channel3_handler(void) UNHANDLED_ALIAS;
00091  void DMA2_Channel4_5_handler(void) UNHANDLED_ALIAS;
00092 
00093 const ISR_func isr_vector[76] ISR_VECTOR_SECTION =
00094   {
00095     Main_Stack_End,
00096     sys_reset,
00097     NMI_handler,
00098     HardFault_handler,
00099     MemManage_handler,
00100     BusFault_handler,
00101     UsageFault_handler,
00102     Reserved_handler,
00103     Reserved_handler,
00104     Reserved_handler,
00105     Reserved_handler,
00106     SVCall_handler,
00107     DebugMonitor_handler,
00108     Reserved_handler,
00109     PendSV_handler,
00110     SysTick_handler,
00111     WWDG_handler,
00112     PVD_handler,
00113     TAMPER_handler,
00114     RTC_handler,
00115     FLASH_handler,
00116     RCC_handler,
00117     EXTI0_handler,
00118     EXTI1_handler,
00119     EXTI2_handler,
00120     EXTI3_handler,
00121     EXTI4_handler,
00122     DMA1_Channel1_handler,
00123     DMA1_Channel2_handler,
00124     DMA1_Channel3_handler,
00125     DMA1_Channel4_handler,
00126     DMA1_Channel5_handler,
00127     DMA1_Channel6_handler,
00128     DMA1_Channel7_handler,
00129     ADC1_2_handler,
00130     USB_HP_CAN_TX_handler,
00131     USB_LP_CAN_RX0_handler,
00132     CAN_RX1_handler,
00133     CAN_SCE_handler,
00134     EXTI9_5_handler,
00135     TIM1_BRK_handler,
00136     TIM1_UP_handler,
00137     TIM1_TRG_COM_handler,
00138     TIM1_CC_handler,
00139     TIM2_handler,
00140     TIM3_handler,
00141     TIM4_handler,
00142     I2C1_EV_handler,
00143     I2C1_ER_handler,
00144     I2C2_EV_handler,
00145     I2C2_ER_handler,
00146     SPI1_handler,
00147     SPI2_handler,
00148     USART1_handler,
00149     USART2_handler,
00150     USART3_handler,
00151     EXTI15_10_handler,
00152     RTCAlarm_handler,
00153     USBWakeup_handler, 
00154     TIM8_BRK_handler,
00155     TIM8_UP_handler,
00156     TIM8_TRG_COM_handler,
00157     TIM8_CC_handler,
00158     ADC3_handler,
00159     FSMC_handler,
00160     SDIO_handler,
00161     TIM5_handler,
00162     SPI3_handler,
00163     UART4_handler,
00164     UART5_handler,
00165     TIM6_handler,
00166     TIM7_handler,
00167     DMA2_Channel1_handler,
00168     DMA2_Channel2_handler,
00169     DMA2_Channel3_handler,
00170     DMA2_Channel4_5_handler
00171   };
00172 
00173 
00174 
00175 
00176 extern uint8_t _data[];
00177 extern uint8_t _etext[];
00178 extern uint8_t _edata[];
00179 
00180 static void
00181 copy_initialized(void)
00182 {
00183   uint8_t *ram = _data;
00184   uint8_t *rom = _etext;
00185   while(ram < _edata) {
00186     *ram++ = *rom++;
00187   }
00188 }
00189 
00190 extern uint8_t __bss_start[];
00191 extern uint8_t __bss_end[];
00192 
00193 static void
00194 clear_bss(void)
00195 {
00196   uint8_t *m = __bss_start;
00197   while(m < __bss_end) {
00198     *m++ = 0;
00199   }
00200 }
00201 
00202 static void
00203 start_hse_clock(void)
00204 {
00205   /* Start external oscillator */
00206   RCC->CR |= RCC_CR_HSEON;
00207   /* Wait for oscillator to stabilize */
00208   while(!(RCC->CR & RCC_CR_HSERDY));
00209 }
00210 
00211 static void
00212 use_pll()
00213 {
00214    RCC->CFGR = (RCC_CFGR_MCO_NOCLOCK
00215                 | RCC_CFGR_PLLMULL6     /* PLL at 48MHz */
00216                 | RCC_CFGR_PLLSRC       /* PLL runs on HSE */
00217                 | RCC_CFGR_PPRE2_DIV1   /* APB2 at 48MHz */
00218                 | RCC_CFGR_PPRE1_DIV2   /* APB1 at 24MHz */
00219                 | RCC_CFGR_HPRE_DIV1    /* AHB at 48 MHz */
00220                 | RCC_CFGR_USBPRE       /* USB clock at same speed as PLL */
00221                 );
00222    RCC->CR |= RCC_CR_PLLON;
00223    /* Wait for PLL */
00224    while(!(RCC->CR & RCC_CR_PLLRDY));
00225    /* Switch to PLL as system clock */
00226    MODIFY_REG(RCC->CFGR, RCC_CFGR_SW,RCC_CFGR_SW_PLL);
00227 }
00228 
00229 static void
00230 enable_fault_exceptions(void)
00231 {
00232   SCB->SHCSR |= (SCB_SHCSR_MEMFAULTENA | SCB_SHCSR_BUSFAULTENA
00233                  | SCB_SHCSR_USGFAULTENA);
00234 }
00235 
00236 static void
00237 sys_reset(void)
00238 {
00239   copy_initialized();
00240   clear_bss();
00241   enable_fault_exceptions();
00242   start_hse_clock();
00243   use_pll();
00244   main();
00245   while(1);
00246   
00247 }
00248 
00249 void
00250 NMI_handler(void)
00251 {
00252   while(1);
00253 }
00254 
00255 
00256 static void
00257 unhandled_int(void)
00258 {
00259   while(1);
00260 }
00261 
00262 static void
00263 dHardFault_handler(void)
00264 {
00265   while(1);
00266 }
00267 
00268 static void
00269 dUsageFault_handler(void)
00270 {
00271   while(1);
00272 }
00273 
00274 static void
00275 dMemManage_handler(void)
00276 {
00277   while(1);
00278 }
00279 
00280 static void
00281 dBusFault_handler(void)
00282 {
00283   while(1);
00284 }

Generated on Mon Apr 11 14:23:35 2011 for Contiki 2.5 by  doxygen 1.6.1