您的位置:首页 > 其它

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

2015-12-08 21:51 507 查看

概况:

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)]

如下:



关于.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 };
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: