IAR + STM32固件库 启动文件startup_stm32f10x_hd.s功用及注释

概况:

STM32库版本:V3.5.0

startup_stm32f10x_hd.s文件模块功能:

  • 设置初始堆栈指针;
  • 用ISR异常处理程序地址来设置向量表条目;
  • 配置系统时钟,配置安装在STM3210E-EVAL板子上被用作数据内存外部sram;
  • 设置初始PC程序计数器 指向__iar_program_start代码段地址。
在这个文件中的模块被包含在libs库中,可能被替换通过任何用户定义的模块--被PUBLIC定义的_program_start或者用户定义的一个开始标识;
为了覆盖在库中定义的cstartup,只需添加被修改版本到 工作台项目;
矢量表通常是位于地址0;
当在RAM中调试时,矢量表位于ram中,至少对齐2^6;
对于C-SPY来说,“__vector_table”有特殊的意义;
堆栈指针SP能够在__vector_table中找到,如果NVIC(嵌套中断向量控制器) vector  table register (VTOR)的地址不为0,则初始化到这块地址。

启动代码解析:

为简单 明朗些,分成几部分展示:
关于IAR指令,参见《EWARM_AssemblerReference.ENU.pdf》文档。
.icf内存配置文件,与这个启动文件也是有大大的关系。 
关于.icf 结构、功能分析,参见-- stm32存储器结构、 IAR 开发环境下的.icf 文件、.map文件 解析
1、
;;格式:PROGRAM symbol---其中symbol为分配模块的名字;;开始一个模块;PROGRAM和NAME指令的别名
    MODULE  ?cstartup ;汇编模块开始
        
        ;; Forward declaration of sections.前置 段声明
		
		;;格式:SECTION section :type [flag] [(align)]
		;;NOROOT表示如果这个段里的标号(如CSTACK/.intvec等)没引用,则被linker舍弃;ROOT则是一定不舍弃。
		;;(1)表示字节对齐数,为2的幂,(2)表示4字节对齐,(3)表示8字节对齐
		;;定义各种模式STACK,具体大小、位置是由linker文件(IAR中 .icf)决定的,这些STACK都定义在内部RAM中
        SECTION CSTACK:DATA:NOROOT(3) ;CSTACK数据段
		;;通常INTVEC段被连接到flash闪存的开始地址,应该在.icf文件中有定义,如stmf10X系列 闪存起始地址:0x08000000
        SECTION .intvec:CODE:NOROOT(2) ;.intvec代码段

        EXTERN  __iar_program_start ;;外部变量声明
        EXTERN  SystemInit        ;SystemInit声明,于外部定义
        PUBLIC  __vector_table ;;外部可调用;向其他模块输出符号。

2、
        DATA
  ;;中断向量表     
__vector_table		;;格式:DCD expr [,expr] …  ;Generates 32-bit constants.生成32bit常数
        DCD     sfe(CSTACK)  ;;格式:SFE (section [{+ | -} offset])  返回section段结束地址,SFB(section)返回section段开始地址;
        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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Default interrupt handlers.
;;

3、

        THUMB 							;;Mode control directives--模式控制指令

        PUBWEAK Reset_Handler			;;标识符(这里是函数名) 弱定义
        SECTION .text:CODE:REORDER(2)	;;
Reset_Handler
        LDR     R0, =SystemInit
        BLX     R0
        LDR     R0, =__iar_program_start
        BX      R0
               
        PUBWEAK NMI_Handler
        SECTION .text:CODE:REORDER(1)
NMI_Handler
        B NMI_Handler

        PUBWEAK HardFault_Handler
        SECTION .text:CODE:REORDER(1)
HardFault_Handler
        B HardFault_Handler

        PUBWEAK MemManage_Handler
        SECTION .text:CODE:REORDER(1)
MemManage_Handler
        B MemManage_Handler

        PUBWEAK BusFault_Handler
        SECTION .text:CODE:REORDER(1)
BusFault_Handler
        B BusFault_Handler

        PUBWEAK UsageFault_Handler
        SECTION .text:CODE:REORDER(1)
.................................
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

关于段控制指令:

SECTION section :type [flag] [(align)]

如下:

IAR + STM32固件库 启动文件startup_stm32f10x_hd.s功用及注释_第1张图片


关于.icf:--看注释

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08000000;/*中断向量表开始地址*/
/*-Memory Regions-*/
/*定义内部FLASH地址 */--/*定义内部RAM地址 */
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;/*闪存起始地址*/
define symbol __ICFEDIT_region_ROM_end__   = 0x0800FFFF;/*闪存结束地址---flash大小64k*/
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;/*SRAM起始地址*/
define symbol __ICFEDIT_region_RAM_end__   = 0x20004FFF;/*SRAM结束地址---SRAM大小20k*/
/*-Sizes-*//* 栈和堆大小*/
define symbol __ICFEDIT_size_cstack__ = 0x800; /*栈大小*/
define symbol __ICFEDIT_size_heap__   = 0x200;/*堆大小*/
/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;
define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };//CSTACK块属性(8字节对齐、大小__ICFEDIT_size_cstack__)
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };
/* 下列语句定义所定义地址空间内可完成的操作类型*/
initialize by copy { readwrite };
do not initialize  { section .noinit };

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; //__ICFEDIT_intvec_start__赋值给.intvec标识符

place in ROM_region   { readonly };
place in RAM_region   { readwrite,
                        block CSTACK, block HEAP };


你可能感兴趣的:(cortex-M3)