新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32啟動代碼分析

        STM32啟動代碼分析

        作者: 時間:2016-11-25 來源:網絡 收藏
        啟動代碼文件名是STM32F10X.S,它的作用先總結下,然后再分析。啟動代碼作用一般是:1)堆和棧的初始化;2)向量表定義;3)地址重映射及中斷向量表的轉移;4)設置系統時鐘頻率;5)中斷寄存器的初始化;6)進入C應用程序。

        (1)按啟動代碼的次序,先看堆和棧的初始化:

        本文引用地址:http://www.104case.com/article/201611/321528.htm

        Stack_Size EQU 0x00000200 ;定義Stack_Size為0x00000200

        AREA STACK, NOINIT, READWRITE, ALIGN=3 ;定義棧,可初始為0,8字節對齊
        Stack_Mem SPACE Stack_Size ;分配0x200個連續字節,并初始化為0
        __initial_sp ;匯編代碼地址標號

        Heap_Size EQU 0x00000000

        AREA HEAP, NOINIT, READWRITE, ALIGN=3
        __heap_base
        Heap_Mem SPACE Heap_Size
        __heap_limit


        PRESERVE8;指定當前文件堆棧8字節對齊
        THUMB ;告訴匯編器下面是32為的Thumb指令,如果需要匯編器將插入位以保證對齊

        (2)中斷向量表定義

        AREA RESET, DATA, READONLY ;定義復位向量段,只讀
        EXPORT __Vectors ;定義一個可以在其他文件中使用的全局標號。此處表示中斷地址

        __Vectors DCD __initial_sp ;給__initial_sp分配4字節32位的地址0x0
        DCD Reset_Handler ; 給標號Reset Handler分配地址為0x00000004
        DCD NMI_Handler ; 給標號NMI Handler分配地址0x00000008
        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 ;這種形式就是保留地址,不給任何標號分配
        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 WWDG_IRQHandler ; Window Watchdog
        DCD PVD_IRQHandler ; PVD through EXTI Line detect
        DCD TAMPER_IRQHandler ; Tamper
        DCD RTC_IRQHandler ; RTC
        DCD FLASH_IRQHandler ; Flash
        DCD RCC_IRQHandler ; RCC
        DCD EXTI0_IRQHandler ; EXTI Line 0
        DCD EXTI1_IRQHandler ; EXTI Line 1
        DCD EXTI2_IRQHandler ; EXTI Line 2
        DCD EXTI3_IRQHandler ; EXTI Line 3
        DCD EXTI4_IRQHandler ; EXTI Line 4
        DCD DMAChannel1_IRQHandler ; DMA Channel 1
        DCD DMAChannel2_IRQHandler ; DMA Channel 2
        DCD DMAChannel3_IRQHandler ; DMA Channel 3
        DCD DMAChannel4_IRQHandler ; DMA Channel 4
        DCD DMAChannel5_IRQHandler ; DMA Channel 5
        DCD DMAChannel6_IRQHandler ; DMA Channel 6
        DCD DMAChannel7_IRQHandler ; DMA Channel 7
        DCD ADC_IRQHandler ; ADC
        DCD USB_HP_CAN_TX_IRQHandler ; USB High Priority or CAN TX
        DCD USB_LP_CAN_RX0_IRQHandler ; USB Low Priority or CAN RX0
        DCD CAN_RX1_IRQHandler ; CAN RX1
        DCD CAN_SCE_IRQHandler ; CAN SCE
        DCD EXTI9_5_IRQHandler ; EXTI Line 9..5
        DCD TIM1_BRK_IRQHandler ; TIM1 Break
        DCD TIM1_UP_IRQHandler ; TIM1 Update
        DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation
        DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
        DCD TIM2_IRQHandler ; TIM2
        DCD TIM3_IRQHandler ; TIM3
        DCD TIM4_IRQHandler ; TIM4
        DCD I2C1_EV_IRQHandler ; I2C1 Event
        DCD I2C1_ER_IRQHandler ; I2C1 Error
        DCD I2C2_EV_IRQHandler ; I2C2 Event
        DCD I2C2_ER_IRQHandler ; I2C2 Error
        DCD SPI1_IRQHandler ; SPI1
        DCD SPI2_IRQHandler ; SPI2
        DCD USART1_IRQHandler ; USART1
        DCD USART2_IRQHandler ; USART2
        DCD USART3_IRQHandler ; USART3
        DCD EXTI15_10_IRQHandler ; EXTI Line 15..10
        DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line
        DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend

        (3)中斷向量表的轉移

        AREA |.text|, CODE, READONLY ;代碼段定義


        ; Reset Handler

        Reset_Handler PROC;標記一個函數的開始
        EXPORT Reset_Handler [WEAK];[WEAK] 選項表示當所有的源文件都沒有 定義這樣一個標號時,編譯器也不給出錯誤信息,在多數情況下將該標號置為 0 ,若該標號為 B 或 BL 指令引用,則將 B 或 BL指令置為 NOP 操作。EXPORT提示編譯器該標號可以為外部文件引用。
        IMPORT __main ;通知編譯器要使用的標號在其他文件
        LDR R0, =__main;使用“=”表示LDR目前是偽指令不是標準指令。這里是把__main的地址給RO。
        BX R0;BX是ARM指令集和THUMB指令集之間程序的跳轉
        ENDP


        ; Dummy Exception Handlers (infinite loops which can be modified)

        NMI_Handler m;"m"其實就是PROC表示匯編函數的開始
        EXPORT NMI_Handler [WEAK]
        B .
        ENDP
        HardFault_Handler ;""是換行的意思
        PROC
        EXPORT HardFault_Handler [WEAK]
        B . ;"."號到底是什么含義呢,目前還沒查到資料??赡苁潜A舻刂罚┮院笮薷牡陌?br /> ENDP
        MemManage_Handler
        PROC
        EXPORT MemManage_Handler [WEAK]
        B .
        ENDP
        BusFault_Handler
        PROC
        EXPORT BusFault_Handler [WEAK]
        B .
        ENDP
        UsageFault_Handler
        PROC
        EXPORT UsageFault_Handler [WEAK]
        B .
        ENDP
        SVC_Handler PROC
        EXPORT SVC_Handler [WEAK]
        B .
        ENDP
        DebugMon_Handler
        PROC
        EXPORT DebugMon_Handler [WEAK]
        B .
        ENDP
        PendSV_Handler PROC
        EXPORT PendSV_Handler [WEAK]
        B .
        ENDP
        SysTick_Handler PROC
        EXPORT SysTick_Handler [WEAK]
        B .
        ENDP

        Default_Handler PROC

        EXPORT WWDG_IRQHandler [WEAK]
        EXPORT PVD_IRQHandler [WEAK]
        EXPORT TAMPER_IRQHandler [WEAK]
        EXPORT RTC_IRQHandler [WEAK]
        EXPORT FLASH_IRQHandler [WEAK]
        EXPORT RCC_IRQHandler [WEAK]
        EXPORT EXTI0_IRQHandler [WEAK]
        EXPORT EXTI1_IRQHandler [WEAK]
        EXPORT EXTI2_IRQHandler [WEAK]
        EXPORT EXTI3_IRQHandler [WEAK]
        EXPORT EXTI4_IRQHandler [WEAK]
        EXPORT DMAChannel1_IRQHandler [WEAK]
        EXPORT DMAChannel2_IRQHandler [WEAK]
        EXPORT DMAChannel3_IRQHandler [WEAK]
        EXPORT DMAChannel4_IRQHandler [WEAK]
        EXPORT DMAChannel5_IRQHandler [WEAK]
        EXPORT DMAChannel6_IRQHandler [WEAK]
        EXPORT DMAChannel7_IRQHandler [WEAK]
        EXPORT ADC_IRQHandler [WEAK]
        EXPORT USB_HP_CAN_TX_IRQHandler [WEAK]
        EXPORT USB_LP_CAN_RX0_IRQHandler [WEAK]
        EXPORT CAN_RX1_IRQHandler [WEAK]
        EXPORT CAN_SCE_IRQHandler [WEAK]
        EXPORT EXTI9_5_IRQHandler [WEAK]
        EXPORT TIM1_BRK_IRQHandler [WEAK]
        EXPORT TIM1_UP_IRQHandler [WEAK]
        EXPORT TIM1_TRG_COM_IRQHandler [WEAK]
        EXPORT TIM1_CC_IRQHandler [WEAK]
        EXPORT TIM2_IRQHandler [WEAK]
        EXPORT TIM3_IRQHandler [WEAK]
        EXPORT TIM4_IRQHandler [WEAK]
        EXPORT I2C1_EV_IRQHandler [WEAK]
        EXPORT I2C1_ER_IRQHandler [WEAK]
        EXPORT I2C2_EV_IRQHandler [WEAK]
        EXPORT I2C2_ER_IRQHandler [WEAK]
        EXPORT SPI1_IRQHandler [WEAK]
        EXPORT SPI2_IRQHandler [WEAK]
        EXPORT USART1_IRQHandler [WEAK]
        EXPORT USART2_IRQHandler [WEAK]
        EXPORT USART3_IRQHandler [WEAK]
        EXPORT EXTI15_10_IRQHandler [WEAK]
        EXPORT RTCAlarm_IRQHandler [WEAK]
        EXPORT USBWakeUp_IRQHandler [WEAK]

        WWDG_IRQHandler
        PVD_IRQHandler
        TAMPER_IRQHandler
        RTC_IRQHandler
        FLASH_IRQHandler
        RCC_IRQHandler
        EXTI0_IRQHandler
        EXTI1_IRQHandler
        EXTI2_IRQHandler
        EXTI3_IRQHandler
        EXTI4_IRQHandler
        DMAChannel1_IRQHandler
        DMAChannel2_IRQHandler
        DMAChannel3_IRQHandler
        DMAChannel4_IRQHandler
        DMAChannel5_IRQHandler
        DMAChannel6_IRQHandler
        DMAChannel7_IRQHandler
        ADC_IRQHandler
        USB_HP_CAN_TX_IRQHandler
        USB_LP_CAN_RX0_IRQHandler
        CAN_RX1_IRQHandler
        CAN_SCE_IRQHandler
        EXTI9_5_IRQHandler
        TIM1_BRK_IRQHandler
        TIM1_UP_IRQHandler
        TIM1_TRG_COM_IRQHandler
        TIM1_CC_IRQHandler
        TIM2_IRQHandler
        TIM3_IRQHandler
        TIM4_IRQHandler
        I2C1_EV_IRQHandler
        I2C1_ER_IRQHandler
        I2C2_EV_IRQHandler
        I2C2_ER_IRQHandler
        SPI1_IRQHandler
        SPI2_IRQHandler
        USART1_IRQHandler
        USART2_IRQHandler
        USART3_IRQHandler
        EXTI15_10_IRQHandler
        RTCAlarm_IRQHandler
        USBWakeUp_IRQHandler

        B .

        ENDP
        ALIGN


        (4)堆和棧的初始化

        IF :DEF:__MICROLIB ;“DEF”的用法——:DEF:X 就是說X定義了則為真,否則為假

        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

        ALIGN ;填充字節使地址對齊

        ENDIF

        END



        關鍵詞: stm32啟動代

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 陆丰市| 阳山县| 莱西市| 陆丰市| 玉林市| 九寨沟县| 临汾市| 道孚县| 三台县| 宁国市| 成都市| 互助| 含山县| 南华县| 高清| 康保县| 无极县| 苗栗县| 中宁县| 黄石市| 丰镇市| 海兴县| 温宿县| 织金县| 青川县| 新津县| 文成县| 六盘水市| 定安县| 黑河市| 昂仁县| 浙江省| 那曲县| 乳源| 许昌县| 华池县| 乌兰察布市| 微山县| 彭阳县| 阿克陶县| 东明县|