但从MAP文件看,代码有1K左右的变化,请哪位学长详述一下,谢谢。
要看该文件中定义的东西其他文件中有没有用到,如果仅仅是定义了一些变量或者函数
而其他文件中不会调用到,那编译肯定是不会出错了
刚试了一下IAR,不加low_level_init.c也没有问题,编译器会自己生成一个__low_level_init,但这个__low_level_init只做一件事,就是把R0的值改写为1. 因为后面的启动代码会使用__low_level_init()的返回值,也就是说__low_level_init()的返回值默认是1.
俺发现如果加这个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;
}
工程文件件中定义了__low_level_init,那就应该运行这个定义了的。我理解编译器是在预编译阶段搜索一下工程文件中有没有定义的__low_level_init,如果有就连接到程序的最开始,如果没有就把默认的__low_level_init连接到程序的最开始。另外,楼主在low_level_init.c里做了这么多初始化工作似乎没什么必要,在这里做一些初始化外部存储器总线、禁止或使能看门狗之类的工作还行,楼主的这些初始化工作大可以放在main函数里进行。