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内存配置文件,与这个启动文件也是有大大的关系。 
;;格式: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)]

如下:



关于.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 };


<think>好的,我现在需要帮助用户解决如何正确导入STM32F10x系列的启动文件startup_stm32f10x_hd.s的问题。首先,我需要回忆一下STM32开发中的启动文件相关知识。根据引用[2]的内容,启动文件根据Flash容量分为ld、md、hd三种,分别对应小容量、中等容量大容量产品。用户提到的是hd.s文件,所以对应的应该是大容量芯片,即Flash≥256KB的型号,比如STM32F103ZE等。 接下来,用户的问题是如何导入这个启动文件到项目中。我需要分步骤说明,可能包括创建项目结构、添加启动文件到工程、配置编译器选项、检查链接脚本以及验证配置是否正确。同时,需要确保用户正确选择启动文件,否则可能会出现卡死在启动文件的B处的问题,如引用[1]所述。 首先,项目结构方面,用户应该在工程目录下有一个专门的文件夹存放启动文件,比如Libraries/CMSIS/startup。然后,在IDE中(比如Keil MDK)添加该文件到项目的启动文件组中。这里需要提醒用户注意选择正确的启动文件,避免使用错误的容量版本导致问题。 然后,配置编译器选项。需要确保定义了STM32F10X_HD宏,这样在编译时预处理会根据宏选择正确的启动文件。这一步很关键,如果没定义宏,可能导致编译时使用了错误的代码路径,进而引发错误。 接下来是链接脚本的设置,确保链接器使用的脚本与芯片型号匹配。例如,大容量芯片可能需要使用stm32f10x_hd.ld文件。如果链接脚本不正确,程序可能无法正确分配内存,导致启动失败。 最后,验证配置是否正确。编译并调试程序,观察是否还会卡死在B处。如果仍然有问题,需要检查启动文件是否正确,宏定义是否设置,以及芯片型号是否选对。此外,启动文件中的栈大小设置也需要检查,根据引用[3],栈的大小在启动文件中定义,如果栈太小可能导致栈溢出,程序运行异常。 可能还需要提醒用户注意启动文件的来源,确保是从官方库获取的,避免使用第三方修改过的版本。同时,不同开发环境(如IAR、GCC)的配置步骤可能有所不同,但总体思路类似。 在生成相关问题时,需要考虑用户可能遇到的后续问题,比如如何选择正确的启动文件,如何解决启动失败的问题,以及启动文件中栈堆的配置等。这些问题都是用户在导入启动文件后可能会遇到的,因此提前列出有助于他们进一步排查问题。</think>### 如何正确导入 `startup_stm32f10x_hd.s` 到 STM32F10x 项目 #### 1. **确认芯片容量启动文件匹配** - **启动文件分类**: - `startup_stm32f10x_ld.s`:小容量(Flash ≤32KB) - `startup_stm32f10x_md.s`:中容量(64KB ≤ Flash ≤128KB) - `startup_stm32f10x_hd.s`:大容量(Flash ≥256KB)[^2] - 需通过芯片型号(如 STM32F103ZET6)确认 Flash 容量,选择对应文件。若选错可能导致程序卡死在启动文件(如 `B .` 指令处)[^1]。 #### 2. **项目配置步骤(以 Keil MDK 为例)** - **步骤 1:添加启动文件到工程** 1. 在项目目录创建 `Libraries/CMSIS/startup` 文件夹,将 `startup_stm32f10x_hd.s` 放入。 2. 在 Keil 中右键点击项目 → 选择 `Add Existing Files...` → 添加该文件启动文件组。 ```plaintext 项目结构示例: ├── Core ├── Drivers └── Libraries └── CMSIS └── startup └── startup_stm32f10x_hd.s ``` - **步骤 2:设置编译宏定义** 1. 右键项目 → `Options for Target` → `C/C++` 标签页。 2. 在 `Define` 中添加 `STM32F10X_HD`(必须与启动文件后缀匹配)。 - **步骤 3:配置链接脚本** 1. 确保链接脚本(如 `stm32f10x_flash.ld`)与芯片 Flash 容量一致。 2. 若使用标准库,需包含对应内存映射定义(如 `STM32F10X_HD` 对应的向量表)。 #### 3. **验证配置** - **编译检查**:无报错且生成 `.axf` 文件。 - **调试验证**:下载程序后单步执行,观察是否跳过 `B .` 指令(卡死通常因初始化失败或堆栈溢出)[^3]。 #### 4. **常见问题解决** - **问题 1:卡死在 `B .` 指令** - 检查启动文件是否与芯片容量匹配。 - 确认 `STM32F10X_HD` 宏已定义。 - **问题 2:栈溢出** - 修改启动文件中 `Stack_Size`(默认 1024 字节),增大后重新编译。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值