<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 牛人業(yè)話(huà) > STM32再學(xué)習——啟動(dòng)流程分析

STM32再學(xué)習——啟動(dòng)流程分析

作者:jobs 時(shí)間:2014-04-17 來(lái)源:電子產(chǎn)品世界 收藏

  我們寫(xiě)程序,基本上采用C語(yǔ)言來(lái)編寫(xiě),以main( )作為程序的入口。但實(shí)際上,mian()并不是最先要執行的,在這之前需要做一些基本的工作,如堆、棧的定義;main函數的復位連接等,這些工作就需要一個(gè)專(zhuān)門(mén)的啟動(dòng)程序來(lái)完成,由于需要做的工作內容不多,并且需要更直接的管理內存,一般采用匯編編寫(xiě)。

本文引用地址:http://dyxdggzs.com/article/236700.htm

  無(wú)論是、系列的單片機,還是簡(jiǎn)單的如51,PIC等,都以為上述原因,需要啟動(dòng)程序,只不過(guò)51,PIC等單片機的啟動(dòng)程序已經(jīng)在相應的IDE編譯、鏈接的時(shí)候隱含的編譯了,故在寫(xiě)單片機程序的時(shí)候無(wú)需考慮。而的啟動(dòng)有相應的啟動(dòng)文件,本文將采用KEIL MDK自帶的啟動(dòng)文件F10x.s進(jìn)行分析。

  1 啟動(dòng)模式的選擇

  STM32芯片自帶的啟動(dòng)方式有3種如下表

啟動(dòng)模式選擇引腳

啟動(dòng)模式

說(shuō)明

BOOT1

BOOT0

X

0

主閃存存儲器

主閃存存儲器作為啟動(dòng)區域

0

1

系統存儲器

系統存儲器作為啟動(dòng)區域

1

1

內置SRAM

內置SRAM作為啟動(dòng)葡萄

  STM32的啟動(dòng)選擇,通過(guò)設置BOOT1、BOOT0的引腳的高低電平即可選擇。其中主閃存啟動(dòng)是將程序下載到內置的Flash進(jìn)行啟動(dòng)(該flash可運行程序),該程序可以掉電保存,下次開(kāi)機可自動(dòng)啟動(dòng);系統存儲器啟動(dòng)是將程序寫(xiě)入到一快特定的區域,一般由廠(chǎng)家直接寫(xiě)入,不能被隨意更改或擦除。內置SRAM啟動(dòng),由于SRAM掉電丟失,不能保存程序,一般只用于程序的調試。

  就程序的啟動(dòng)而言,采用以上3種方式啟動(dòng),但對于一個(gè)系統的程序來(lái)說(shuō),如果程序執行文件很大,而STM32內置的存儲空間有限,就需要外置Nand flash/Nor flash 和SDRAM,即程序存儲在flash中,程序執行在SDRAM中,既節約了成本有提高了運行效率。如果采用外置的Flash+SDRAM的方式,就需要一個(gè)更加復雜的啟動(dòng)文件(bootloader),需要考慮flash的COPY,Flash的驅動(dòng),內存的管理,通信機制等,本文暫不涉及此內容,以后有機會(huì )專(zhuān)門(mén)講述。

  2 啟動(dòng)文件STM32F10x.s分析

  關(guān)于STM32F10x.s的啟動(dòng)文件,主要做了3個(gè)工作:分配和初始化堆、棧;定義復位向量并初始化;中斷向量表及其相應的異常處理程序。

  2.1 定義堆、棧及其初始化

  堆和棧是能夠運行C語(yǔ)言的前提,如以下程序:

  定義棧:

  Stack_Size EQU 0x00000200

  AREA STACK, NOINIT, READWRITE, ALIGN=3

  Stack_Mem SPACE Stack_Size

  __initial_sp

  定義堆:

  Heap_Size EQU 0x00000000

  AREA HEAP, NOINIT, READWRITE, ALIGN=3

  __heap_base

  Heap_Mem SPACE Heap_Size

  __heap_limit

  初始化堆、棧:

  _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

  2.2 定義復位向量

  Boot引腳的設置不同,復位時(shí),起始地址的位置不同,SRAM的起始地址為0x2000000, flash的起始地址為0x8000000。Cortex-M3內核規定,起始地址必須存放堆定指針,而第二個(gè)地址必須存放復位中斷入口向量。在系統復位時(shí),內核會(huì )自動(dòng)從其實(shí)地址的下一個(gè)地址(即32位)空間取出復位中斷入口向量,然后跳轉到復位中斷服務(wù)程序,該服務(wù)程序就會(huì )跳轉到main()執行程序。

  中斷向量表(部分向量):

  __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

  復位中斷服務(wù)程序

  ; Reset Handler // 該程序會(huì )跳轉到main()

  Reset_Handler PROC

  EXPORT Reset_Handler [WEAK]

  IMPORT __main

  LDR R0, =__main

  BX R0

  ENDP

  3 其他中斷向量及服務(wù)子程序

  在啟動(dòng)文件中,只定義了中斷向量,其相應的服務(wù)子程序跳轉到空操作。為以后擴展中斷服務(wù)程序做了準備。

  在以上這些都勝利跑完之后,我們的微處理器(MCU)就開(kāi)始main函數之旅……

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

c語(yǔ)言相關(guān)文章:c語(yǔ)言教程


存儲器相關(guān)文章:存儲器原理




關(guān)鍵詞: STM32 嵌入式 ARM

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>