新聞中心

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

        STM32f10x啟動代碼分析

        作者: 時間:2016-11-24 來源:網絡 收藏
        我用的stm32官方版本3.5的固件庫。單片機STM32f103zet,所以的用的啟動代碼是startup_stm32f10x_hd.s。
        讀這個文件的時候用到了很多資料,大部分來自網絡,作者不詳,感謝他們。
        其中知名的有,理想智芯科技的李想老師,玩轉stm32的作者野火團隊,感謝他們。
        這是arm公司的技術支持可以用中文http://infocenter.arm.com/help/index.jsp。
        ;EQU偽指令 為0x00000400取個別名Stack_Size
        ;Stack_Size指定棧的大小
        Stack_Size EQU 0x00000400

        ;AREA偽指令定義一個段STACK(棧段),屬性為:NOINIT(不初始化), READWRITE(可讀可寫), ALIGN=3(8字
        ;節對齊)。
        AREA STACK, NOINIT, READWRITE, ALIGN=3

        ;APACE偽指令分配棧空間
        ;Stack_Mem變量在棧低
        ;__initial_sp變量的棧頂
        Stack_Mem SPACE Stack_Size
        __initial_sp

        ;下面代碼語法同上,定義堆空間
        Heap_Size EQU 0x00000200
        AREA HEAP, NOINIT, READWRITE, ALIGN=3
        __heap_base
        Heap_Mem SPACE Heap_Size
        __heap_limit
        PRESERVE8 ;8字節對齊
        THUMB ;用32位的Thumb指令
        ;定義REST段,屬性DATA(數據類型),READONLY(只讀)
        AREA RESET, DATA, READONLY
        EXPORT __Vectors;輸出 __Vectors變量,可以在其他文件使用
        EXPORT __Vectors_End ;輸出 __Vectors_End 變量,可以在其他文件使用
        EXPORT __Vectors_Size ;輸出 __Vectors_Size 變量,可以在其他文件使用

        ;下面代碼完成中斷向量的存儲工作,
        ;DCD xxxx_xxxx 意為安字存儲xxxx_xxxx變量的首地址
        ;__Vectors變量存儲的內容為__initial_sp變量的地址
        ;__Vectors的地址為中斷向量表的首地址
        ;__Vectors_End的地址為中斷向量表的結束地址地址
        ;__Vectors_Size 代表向量標的大小
        __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 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 DMA1_Channel1_IRQHandler ; DMA1 Channel 1
        DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2
        DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3
        DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4
        DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5
        DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6
        DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7
        DCD ADC1_2_IRQHandler ; ADC1 & ADC2
        DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX
        DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0
        DCD CAN1_RX1_IRQHandler ; CAN1 RX1
        DCD CAN1_SCE_IRQHandler ; CAN1 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
        DCD TIM8_BRK_IRQHandler ; TIM8 Break
        DCD TIM8_UP_IRQHandler ; TIM8 Update
        DCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation
        DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare
        DCD ADC3_IRQHandler ; ADC3
        DCD FSMC_IRQHandler ; FSMC
        DCD SDIO_IRQHandler ; SDIO
        DCD TIM5_IRQHandler ; TIM5
        DCD SPI3_IRQHandler ; SPI3
        DCD UART4_IRQHandler ; UART4
        DCD UART5_IRQHandler ; UART5
        DCD TIM6_IRQHandler ; TIM6
        DCD TIM7_IRQHandler ; TIM7
        DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1
        DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2
        DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3
        DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5
        __Vectors_End
        __Vectors_Size EQU __Vectors_End - __Vectors


        ;定義|.text|段,屬性為:CODE(代碼), READONLY(只讀)。
        ;|.text|習慣性命名,表示由C編譯程序產生的代碼段,或用于以某種方式與C庫關聯的代碼段
        AREA |.text|, CODE, READONLY

        ;下面代碼相當于定義了Reset_Handler這個函數,我們通過Reset_Handler變量的地址就可以跳轉過來
        ;由于這個段是這個文件唯一的代碼段,且把main函數地址作為變量導入所以,cpu上電后會從下面程序開始
        ;運行。
        Reset_Handler PROC

        ;EXPORT xxxx [WEAK]這句偽指令很重要。意思是說如果在其他文件中沒有定義xxxx這個變量,
        ;那么這里定義的xxxx,1.有效,2.作為輸出供其他文件中的函數調用。如果其文件定義了xxxx那么這個文件定
        ;義的xxxx無效。可以再arm的匯編指南中查閱到。
        EXPORT Reset_Handler [WEAK]
        ;導入變量__main與SystemInit。一個是用戶主程序,一個是系統時鐘初始化程序
        IMPORT __main
        IMPORT SystemInit
        ;有返回的調用SystemInit函數,初始化系統時鐘
        ;可以看出,在進入main函數之前,這里先初始換了系統時鐘。在主函數中,就不用調用這個函數了
        ;SystemInit這個函數是在文件system_stm32f10x.c中實現的。system_stm32f10x.c在固件庫的目錄為
        ;STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3DeviceSupportSTSTM32F10x
        LDR R0, =SystemInit
        BLX R0
        ;無返回的調用main函數,把控制全交給main函數。
        LDR R0, =__main
        BX R0
        ENDP

        ;下面從NMI_Handler到SysTick_Handler PROC定義的是內核中斷函數。
        ;在這里可以看出,如果用戶不定義這些函數,經使用下面的定義。由偽指令EXPORT [WEAK]決定
        ;一定中斷發生且被允許,將執行B .。這是個死循環相當于jump $
        NMI_Handler PROC
        EXPORT NMI_Handler [WEAK]
        B .
        ENDP
        HardFault_Handler
        PROC
        EXPORT HardFault_Handler [WEAK]
        B .
        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

        ;下面中斷函數有st給出,同樣用戶如果不自己定義,
        ;一定中斷允許且發生,將進入死循環
        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 DMA1_Channel1_IRQHandler [WEAK]
        EXPORT DMA1_Channel2_IRQHandler [WEAK]
        EXPORT DMA1_Channel3_IRQHandler [WEAK]
        EXPORT DMA1_Channel4_IRQHandler [WEAK]
        EXPORT DMA1_Channel5_IRQHandler [WEAK]
        EXPORT DMA1_Channel6_IRQHandler [WEAK]
        EXPORT DMA1_Channel7_IRQHandler [WEAK]
        EXPORT ADC1_2_IRQHandler [WEAK]
        EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK]
        EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK]
        EXPORT CAN1_RX1_IRQHandler [WEAK]
        EXPORT CAN1_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]
        EXPORT TIM8_BRK_IRQHandler [WEAK]
        EXPORT TIM8_UP_IRQHandler [WEAK]
        EXPORT TIM8_TRG_COM_IRQHandler [WEAK]
        EXPORT TIM8_CC_IRQHandler [WEAK]
        EXPORT ADC3_IRQHandler [WEAK]
        EXPORT FSMC_IRQHandler [WEAK]
        EXPORT SDIO_IRQHandler [WEAK]
        EXPORT TIM5_IRQHandler [WEAK]
        EXPORT SPI3_IRQHandler [WEAK]
        EXPORT UART4_IRQHandler [WEAK]
        EXPORT UART5_IRQHandler [WEAK]
        EXPORT TIM6_IRQHandler [WEAK]
        EXPORT TIM7_IRQHandler [WEAK]
        EXPORT DMA2_Channel1_IRQHandler [WEAK]
        EXPORT DMA2_Channel2_IRQHandler [WEAK]
        EXPORT DMA2_Channel3_IRQHandler [WEAK]
        EXPORT DMA2_Channel4_5_IRQHandler [WEAK]
        WWDG_IRQHandler
        PVD_IRQHandler
        TAMPER_IRQHandler
        RTC_IRQHandler
        FLASH_IRQHandler
        RCC_IRQHandler
        EXTI0_IRQHandler
        EXTI1_IRQHandler
        EXTI2_IRQHandler
        EXTI3_IRQHandler
        EXTI4_IRQHandler
        DMA1_Channel1_IRQHandler
        DMA1_Channel2_IRQHandler
        DMA1_Channel3_IRQHandler
        DMA1_Channel4_IRQHandler
        DMA1_Channel5_IRQHandler
        DMA1_Channel6_IRQHandler
        DMA1_Channel7_IRQHandler
        ADC1_2_IRQHandler
        USB_HP_CAN1_TX_IRQHandler
        USB_LP_CAN1_RX0_IRQHandler
        CAN1_RX1_IRQHandler
        CAN1_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
        TIM8_BRK_IRQHandler
        TIM8_UP_IRQHandler
        TIM8_TRG_COM_IRQHandler
        TIM8_CC_IRQHandler
        ADC3_IRQHandler
        FSMC_IRQHandler
        SDIO_IRQHandler
        TIM5_IRQHandler
        SPI3_IRQHandler
        UART4_IRQHandler
        UART5_IRQHandler
        TIM6_IRQHandler
        TIM7_IRQHandler
        DMA2_Channel1_IRQHandler
        DMA2_Channel2_IRQHandler
        DMA2_Channel3_IRQHandler
        DMA2_Channel4_5_IRQHandler
        B .
        ENDP
        ALIGN


        ;下面這些代碼初始化堆棧。
        ;他們是相當復雜的,以你為我們的main和__main是不同的,__main進過編譯后的main,
        ;編譯器要對進入main做了些手腳,初始化C語言環境,其中就要堆棧。
        ;下面這些就是在那時候用的。可以跟蹤到他們在進入main前的執行。
        ;當然要在disassembly先才可以看到。
        ;見解來自Triquinne from elecfans
        ;http://www.elecfans.com/emb/danpianji/20120910287921_6.html
        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
        ALIGN
        ENDIF
        END



        好了就這么多了,上面的解釋也差不多了。


        關鍵詞: STM32f10x啟動代

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 千阳县| 东光县| 五莲县| 汉寿县| 南澳县| 孝感市| 沙雅县| 浦城县| 化隆| 鞍山市| 渝北区| 乳源| 左权县| 北安市| 双峰县| 西充县| 衡阳县| 永川市| 罗山县| 芜湖市| 桃园市| 潼关县| 石阡县| 建宁县| 磐石市| 固始县| 永济市| 资源县| 左云县| 离岛区| 郯城县| 定结县| 扶沟县| 延长县| 买车| 蓝山县| 汉中市| 马边| 永嘉县| 江永县| 广汉市|