新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM啟動(dòng)過(guò)程(Cortex-M3 NXP LPC1768為例)

        ARM啟動(dòng)過(guò)程(Cortex-M3 NXP LPC1768為例)

        作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏
        1. 基本概念(CMSIS): Cortex Micro-controller Software Interface Standard,微控制器軟件接口標(biāo)準(zhǔn)。
        2. CMSIS標(biāo)準(zhǔn)的文件結(jié)構(gòu):
        a) core_cm.c (stdint.h)
        b) system_.c (core_cm, system_)
        c) startup_.s
        其中core_cm.c以及core_cm中為內(nèi)核設(shè)訪問(wèn)層,其中定義了定義了內(nèi)核中得外設(shè)幾丁質(zhì)以及一些內(nèi)核的訪問(wèn)及控制函數(shù)。
        startup_.s文件是系統(tǒng)的啟動(dòng)文件,其包括堆和棧的初始化配置、中斷向量表的配置以及將程序引導(dǎo)到main()函數(shù)等功能。
        system_和system_.c文件則是由ARM公司提供模版,各芯片制造商根據(jù)自己芯片的特點(diǎn)來(lái)編寫的。
        3. 注解startup_.s文件
        此文件主要完成三項(xiàng)工作:堆棧以及堆的初始化、定位中斷向量表、調(diào)用Reset Handler
        a) 堆棧以及堆的初始化
        ; Stack Configuration
        ; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
        ;
        Stack_Size EQU 0x00000200
        AREA STACK, NOINIT, READWRITE, ALIGN=3
        //指明8字節(jié)對(duì)齊(ALIGN=3)
        Stack_Mem SPACE Stack_Size
        __initial_sp //此標(biāo)號(hào)有一層隱含的意思那就是在M3中堆棧是滿遞減堆 //棧,因?yàn)樗付?strong>堆棧指針位于堆棧的高地址(在 //Stack_Mem之后)
        ; Heap Configuration
        ; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
        ;
        Heap_Size EQU 0x00000000
        AREA HEAP, NOINIT, READWRITE, ALIGN=3
        __heap_base
        Heap_Mem SPACE Heap_Size
        __heap_limit
        以上堆和棧的具體地址可以在工程編譯后產(chǎn)生的*.map文件中看到。
        b) 定位中斷向量表
        PRESERVE8
        //PRESERVE8指定了以下的代碼位8字節(jié)對(duì)齊
        THUMB
        //THUMB指定了接下來(lái)的代碼為THUMB指令集
        ; Vector Table Mapped to Address 0 at Reset
        AREA RESET, DATA, READONLY
        //此語(yǔ)句聲明RESET數(shù)據(jù)段
        EXPORT __Vectors
        //導(dǎo)出向量表標(biāo)號(hào),EXPORT作用類似于C語(yǔ)言中的extern
        __Vectors
        DCD __initial_sp ; Top of Stack
        DCD Reset_Handler ; Reset Handler
        DCD NMI_Handler ; NMI Handler
        DCD HardFault_Handler ; Hard Fault Handler
        DCD MemManage_Handler ; MPU Fault Handler
        DCD BusFault_Handler ; Bus Fault Handler
        DCD UsageFault_Handler ; Usage Fault Handler
        DCD 0 ; Reserved
        DCD 0 ; Reserved
        DCD 0 ; Reserved
        DCD 0 ; Reserved
        DCD SVC_Handler ; SVCall Handler
        DCD DebugMon_Handler ; Debug Monitor Handler
        DCD 0 ; Reserved
        DCD PendSV_Handler ; PendSV Handler
        DCD SysTick_Handler ; SysTick Handler
        ; External Interrupts
        DCD WDT_IRQHandler ; 16: Watchdog Timer
        DCD TIMER0_IRQHandler ; 17: Timer0
        DCD TIMER1_IRQHandler ; 18: Timer1
        DCD TIMER2_IRQHandler ; 19: Timer2
        DCD TIMER3_IRQHandler ; 20: Timer3
        DCD UART0_IRQHandler ; 21: UART0
        (……省略)
        c) 調(diào)用Reset Handler
        ; Reset Handler
        Reset_Handler
        PROC
        EXPORT Reset_Handler [WEAK]
        IMPORT SystemInit
        IMPORT __main
        LDR R0, =SystemInit
        BLX R0
        LDR R0, =__main
        BX R0
        ENDP
        注釋:引導(dǎo)程序進(jìn)入__main(此__main是C_Library中的函數(shù),非main())
        d) 其他的代碼
        這段代碼是NXP公司的LPC1700系列的MCU特有的一段代碼,其他公司的Cortex-M3 MCU的啟動(dòng)程序是沒有這段代碼的。
        這段代碼是指定LPC1700的CRP加密級(jí)別的代碼段,芯片上電后會(huì)自動(dòng)讀取這一地址的值以確定加密方式,其中CRP_Key = 0xffffffff為不加密(0級(jí)加密),CRP_Key = 0x12345678為1級(jí)加密,CRP_Key = 0x87654321為2級(jí)加密,CRP_Key = 0x43218765為3級(jí)加密(最高級(jí)加密),3級(jí)加密將會(huì)禁止所有的ISP指令,也就是說(shuō),芯片將不能讀寫、不能擦除。
        IF :LNOT::DEF:NO_CRP
        AREA |.ARM.__at_0x02FC|, CODE, READONLY
        CRP_Key
        DCD 0xFFFFFFFF
        ENDIF
        AREA |.text|, CODE, READONLY
        e)堆棧以及堆的初始化行為
        ; User Initial Stack & Heap
        IF :DEF:__MICROLIB
        EXPORT __initial_sp
        EXPORT __heap_base
        EXPORT __heap_limit
        ELSE
        IMPORT __use_two_region_memory
        EXPORT __user_initial_stackheap
        __user_initial_stackheap
        LDR R0, = Heap_Mem
        LDR R1, = (Stack_Mem + Stack_Size)
        LDR R2, = (Heap_Mem + Heap_Size)
        LDR R3, = Stack_Mem
        BX LR
        4. ARM啟動(dòng)工程詳解


        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 泌阳县| 邯郸市| 柳江县| 佳木斯市| 邵阳县| 巨鹿县| 商河县| 虹口区| 杭州市| 灵璧县| 霍林郭勒市| 北流市| 武冈市| 封丘县| 龙海市| 满洲里市| 无锡市| 新源县| 江达县| 灵台县| 蕲春县| 江阴市| 墨竹工卡县| 富顺县| 泉州市| 温泉县| 舞钢市| 孟村| 苍梧县| 玛沁县| 定远县| 宁远县| 凉山| 崇义县| 栖霞市| 镇原县| 涿州市| 阿拉善盟| 塔河县| 盱眙县| 蓬莱市|