打印

low_level_init.c文件加不加进工程都能编译通过

[复制链接]
3902|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jackzbb|  楼主 | 2010-4-6 15:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
但从MAP文件看,代码有1K左右的变化,请哪位学长详述一下,谢谢。
沙发
maomao2126| | 2010-4-6 15:26 | 只看该作者
要看该文件中定义的东西其他文件中有没有用到,如果仅仅是定义了一些变量或者函数
而其他文件中不会调用到,那编译肯定是不会出错了

使用特权

评论回复
板凳
ShakaLeo| | 2010-4-6 18:24 | 只看该作者
刚试了一下IAR,不加low_level_init.c也没有问题,编译器会自己生成一个__low_level_init,但这个__low_level_init只做一件事,就是把R0的值改写为1. 因为后面的启动代码会使用__low_level_init()的返回值,也就是说__low_level_init()的返回值默认是1.

使用特权

评论回复
地板
jackzbb|  楼主 | 2010-4-6 18:44 | 只看该作者
俺发现如果加这个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;
}

使用特权

评论回复
5
ShakaLeo| | 2010-4-6 19:57 | 只看该作者
工程文件件中定义了__low_level_init,那就应该运行这个定义了的。我理解编译器是在预编译阶段搜索一下工程文件中有没有定义的__low_level_init,如果有就连接到程序的最开始,如果没有就把默认的__low_level_init连接到程序的最开始。另外,楼主在low_level_init.c里做了这么多初始化工作似乎没什么必要,在这里做一些初始化外部存储器总线、禁止或使能看门狗之类的工作还行,楼主的这些初始化工作大可以放在main函数里进行。

使用特权

评论回复
6
jackzbb|  楼主 | 2010-4-7 16:43 | 只看该作者
似乎没几个人对这个问题感兴趣。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

74

帖子

0

粉丝