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
00206 RCC->CR |= RCC_CR_HSEON;
00207
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
00216 | RCC_CFGR_PLLSRC
00217 | RCC_CFGR_PPRE2_DIV1
00218 | RCC_CFGR_PPRE1_DIV2
00219 | RCC_CFGR_HPRE_DIV1
00220 | RCC_CFGR_USBPRE
00221 );
00222 RCC->CR |= RCC_CR_PLLON;
00223
00224 while(!(RCC->CR & RCC_CR_PLLRDY));
00225
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 }