俺发现如果加这个low_level_init.c文件,它会执行这个文件里的__low_level_init()函数,当然要把编译选项里的RUN TO MAIN 里的勾去掉才看得到。
__interwork int __low_level_init(void)
{
// 关闭中断
asm("CPSID I");
//=====================================================================================================
// 复位目标系统的NVIC,恢复为上电默认值
//=====================================================================================================
NVIC_DeInit();
NVIC_SCBDeInit();
// 如果在RAM中调试, 修改中断向量表首地址 NVIC_VectTab_RAM = 0x20000000
// NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
// 否则修改中断向量表在Flash中, NVIC_VectTab_FLASH = 0x08000000
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
//=====================================================================================================
// 系统时钟初始化
//=====================================================================================================
// RCC system reset(for debug purpose)
// 将RCC寄存器恢复为上电默认值
RCC_DeInit();
// Enable HSE
// 打开high-speed external clock signal
RCC_HSEConfig(RCC_HSE_ON);
// 等待外部外部晶振ready
RCC_WaitForHSEStartUp();
// Enable Prefetch Buffer
// 启用预取缓冲区
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
// FLASH_Latency_0 = 000: 0等待状态, 当 0 < SYSCLK≤24MHz
// FLASH_Latency_1 = 001: 1等待状态, 当 24MHz < SYSCLK≤ 48MHz
// FLASH_Latency_2 = 010: 2等待状态, 当 48MHz < SYSCLK≤ 72MHz
// SYSCLK = 72MHz
// Flash 2 wait state
FLASH_SetLatency(FLASH_Latency_2);
// HCLK = SYSCLK
// HCLK = 处理器时钟
// SYSCLK = PLL_CLK or HSE or HSI
RCC_HCLKConfig(RCC_SYSCLK_Div1);
// PCLK2 = HCLK
// PCLK2 = 72MHz
RCC_PCLK2Config(RCC_HCLK_Div1);
// PCLK1 最大不可超过36MHz
// PCLK1 = 72MHz / 2 = 36MHz
RCC_PCLK1Config(RCC_HCLK_Div2);
// ADCCLK = PCLK2/2
// ADCCLK = 12MHz
RCC_ADCCLKConfig(RCC_PCLK2_Div2);
// PLLCLK = 8MHz * 9 = 72 MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
// Enable PLL
RCC_PLLCmd(ENABLE);
// 等待PLL Ready
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
// 连接SYSCLK到PLL_CLK, SYSCLK = PLL_CLK
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
// 等待 SYSCLK 稳定
while(RCC_GetSYSCLKSource() != 0x08)
{
}
return 1;
}