打印

__low_level_init()函数的问题?有哪位大虾帮忙解决一下!

[复制链接]
7420|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jgphu|  楼主 | 2012-6-18 10:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jgphu 于 2012-6-18 16:18 编辑

下面这个函数是将底层初始化,描述上说是在启动代码调用。

一般STM32的启动的硬件初始化和向量地址入口都在.S文件下初始化。就不需要这个__low_level_init()函数了。但现在的工程有这个函数没有.S文件了,我想问一下,它描述说在启动代码调用,但启动代码道底在什么地方?


/*
*********************************************************************************************************
*                                           __low_level_init()
*
* Description : Perform low-level initialization.
*
* Argument(s) : none.
*
* Return(s)   : none.
*
* Caller(s)   : IAR startup code.
*
* Note(s)     : none.
*********************************************************************************************************
*/
#ifdef STM32_EXT_SRAM
#pragma location="ICODE"
__interwork int __low_level_init(void)
{

                                                                /* FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL   */
                                                                /* if another Bank is req'd, adjust the Reg Addrs       */

    *(volatile  CPU_INT32U  *)0x40021014 = 0x00000114;          /* Enable FSMC clock                                    */


    *(volatile  CPU_INT32U  *)0x40021018 = 0x000001E0;          /* Enable GPIOD, GPIOE, GPIOF and GPIOG clocks          */


                                                                /* --------------------- CFG GPIO --------------------- */
                                                                /* SRAM Data lines, NOE and NWE configuration           */
                                                                /* SRAM Address lines configuration                     */
                                                                /* NOE and NWE configuration                            */
                                                                /* NE3 configuration                                    */
                                                                /* NBL0, NBL1 configuration                             */
    *(volatile  CPU_INT32U  *)0x40011400 = 0x44BB44BB;
    *(volatile  CPU_INT32U  *)0x40011404 = 0xBBBBBBBB;

    *(volatile  CPU_INT32U  *)0x40011800 = 0xB44444BB;
    *(volatile  CPU_INT32U  *)0x40011804 = 0xBBBBBBBB;

    *(volatile  CPU_INT32U  *)0x40011C00 = 0x44BBBBBB;
    *(volatile  CPU_INT32U  *)0x40011C04 = 0xBBBB4444;

    *(volatile  CPU_INT32U  *)0x40012000 = 0x44BBBBBB;
    *(volatile  CPU_INT32U  *)0x40012004 = 0x44444B44;


                                                                /* --------------------- CFG FSMC --------------------- */
    *(volatile  CPU_INT32U  *)0xA0000010 = 0x00001011;          /* Enable FSMC Bank1_SRAM Bank                          */
    *(volatile  CPU_INT32U  *)0xA0000014 = 0x00000200;

    return (1);
}
#endif
沙发
jgphu|  楼主 | 2012-6-18 16:19 | 只看该作者
求教!

使用特权

评论回复
板凳
airwill| | 2012-6-19 08:45 | 只看该作者
你这是什么工程, 什么CPU, 什么编译器呢?
在启动代码进入 main()之前会调用这个函数.
在我的 KEIL  MDK 的 F407 工程里没有看到你的函数.
不过有类似的结构: 如下

; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
        IMPORT  __main

                 ;FPU settings
                 LDR     R0, =0xE000ED88           ; Enable CP10,CP11
                 LDR     R1,[R0]
                 ORR     R1,R1,#(0xF << 20)
                 STR     R1,[R0]

                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

我看了一下, 这里的 SystemInit()  函数里面调用了非常类似楼主的 __low_level_init() 的函数 SystemInit_ExtMemCtl().

使用特权

评论回复
地板
puppyh| | 2012-6-19 09:59 | 只看该作者
下面这个函数是将底层初始化,描述上说是在启动代码调用。

一般STM32的启动的硬件初始化和向量地址入口都在.S文件下初始化。就不需要这个__low_level_init()函数了。但现在的工程有这个函数没有.S文件了,我想问一 ...
jgphu 发表于 2012-6-18 10:05


老兄怎么也算是ST MCU版的专家了,已经排名第7位,这么点小问题都搞不定?
不清楚你的这段代码是哪个版本的?大概的意思如下:
如果你使用的变量定义在外部SRAM时,这段代码才被使用
#ifdef STM32_EXT_SRAM            <---你需要在打开“STM32_EXT_SRAM”这个define。
#pragma location="ICODE"         <---通知编译器以下代码放在代码区
__interwork int __low_level_init(void)   <----显示为IAR内部编译代码
{
下面的代码是对FSMC进行初始化,以便后面系统对RAM空间进行初始化时,能够对外部RAM进行操作。

使用特权

评论回复
5
jgphu|  楼主 | 2012-6-20 10:19 | 只看该作者
呵呵受教了。共同学习,共同进步。

使用特权

评论回复
6
sjnh| | 2012-6-26 08:36 | 只看该作者
__low_level_init 位于 arm\lib\low_level_init.c 中, 此函数被 cmain.s 中的 ?main 函数调用,可以在此函数中放置时钟等初始化代码。
IAR启动顺序:
Reset_Handler 或 __iar_program_start (位于cstartup.s中)
-->
__iar_program_start 中 进入 ?main (位于cmain.s中),会调用 __low_level_init

也可以像3楼中,不调用__iar_program_start,需要开始调用SystemInit(),或在自己的main函数开始位置放置SystemInit()

使用特权

评论回复
评论
bear1 2019-6-14 10:35 回复TA
不错,IAR. 
7
bear1| | 2019-6-14 10:37 | 只看该作者
sjnh 发表于 2012-6-26 08:36
__low_level_init 位于 arm\lib\low_level_init.c 中, 此函数被 cmain.s 中的 ?main 函数调用,可以在此函 ...

不错,IAR.

使用特权

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

本版积分规则

7

主题

642

帖子

2

粉丝