IAR + STM32固件库 启动文件startup_stm32f10x_hd.s功用及注释
2015-12-08 21:51
507 查看
概况:
STM32库版本:V3.5.0startup_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 };
相关文章推荐
- 12-5和12-6考试总结
- can总线保护电路
- 使用spring的JdbcTemplate查询
- JavaScript部分知识点汇总
- 创建轴网
- 单例模式
- ARC的原理详解
- [python IDE] 舒服的pycharm设置
- mysql-5.6.17编译安装和常见问题
- Eclipse快捷键大全
- 【Android游戏开发二十七】讲解游戏开发与项目下的hdpi 、mdpi与ldpi资源文件夹以及游戏高清版本的设置
- 母函数总结
- VMware 11 安装 Yosemite 全程
- 如何在visio 2013中插入公式
- 二叉树的创建,遍历,叶节点数,总结点数,深度
- Qt中如何禁掉所有UI操作以及注意事项(处理各个widget的eventFilter这一层,但是感觉不好,为什么不使用QApplication呢)
- 【Android游戏开发二十六】追加简述SurfaceView 与 GLSurfaceView效率!
- Autolayout 第三方开源库
- ubuntu系统下安装gstreamer的ffmpeg支持
- POJ3616 Milking Time 简单DP