×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-08-27 发布时间:
|

概况:

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、


  1. ;;格式:PROGRAM symbol---其中symbol为分配模块的名字;;开始一个模块;PROGRAM和NAME指令的别名  

  2.     MODULE  ?cstartup ;汇编模块开始  

  3.           

  4.         ;; Forward declaration of sections.前置 段声明  

  5.           

  6.         ;;格式:SECTION section :type [flag] [(align)]  

  7.         ;;NOROOT表示如果这个段里的标号(如CSTACK/.intvec等)没引用,则被linker舍弃;ROOT则是一定不舍弃。  

  8.         ;;(1)表示字节对齐数,为2的幂,(2)表示4字节对齐,(3)表示8字节对齐  

  9.         ;;定义各种模式STACK,具体大小、位置是由linker文件(IAR中 .icf)决定的,这些STACK都定义在内部RAM中  

  10.         SECTION CSTACK:DATA:NOROOT(3) ;CSTACK数据段  

  11.         ;;通常INTVEC段被连接到flash闪存的开始地址,应该在.icf文件中有定义,如stmf10X系列 闪存起始地址:0x08000000  

  12.         SECTION .intvec:CODE:NOROOT(2) ;.intvec代码段  

  13.   

  14.         EXTERN  __iar_program_start ;;外部变量声明  

  15.         EXTERN  SystemInit        ;SystemInit声明,于外部定义  

  16.         PUBLIC  __vector_table ;;外部可调用;向其他模块输出符号。  


2、


  1.         DATA  

  2.   ;;中断向量表       

  3. __vector_table      ;;格式:DCD expr [,expr] …  ;Generates 32-bit constants.生成32bit常数  

  4.         DCD     sfe(CSTACK)  ;;格式:SFE (section [{+ | -} offset])  返回section段结束地址,SFB(section)返回section段开始地址;  

  5.         DCD     Reset_Handler             ; Reset Handler  

  6.         DCD     NMI_Handler               ; NMI Handler  

  7.         DCD     HardFault_Handler         ; Hard Fault Handler  

  8.         DCD     MemManage_Handler         ; MPU Fault Handler  

  9.         DCD     BusFault_Handler          ; Bus Fault Handler  

  10.         DCD     UsageFault_Handler        ; Usage Fault Handler  

  11.         DCD     0                         ; Reserved  

  12.         DCD     0                         ; Reserved  

  13.         DCD     0                         ; Reserved  

  14.         DCD     0                         ; Reserved  

  15.         DCD     SVC_Handler               ; SVCall Handler  

  16.         DCD     DebugMon_Handler          ; Debug Monitor Handler  

  17.         DCD     0                         ; Reserved  

  18.         DCD     PendSV_Handler            ; PendSV Handler  

  19.         DCD     SysTick_Handler           ; SysTick Handler  

  20.   

  21.          ; External Interrupts  

  22.         DCD     WWDG_IRQHandler           ; Window Watchdog  

  23.         DCD     PVD_IRQHandler            ; PVD through EXTI Line detect  

  24.         DCD     TAMPER_IRQHandler         ; Tamper  

  25.         DCD     RTC_IRQHandler            ; RTC  

  26.         DCD     FLASH_IRQHandler          ; Flash  

  27.         DCD     RCC_IRQHandler            ; RCC  

  28.         DCD     EXTI0_IRQHandler          ; EXTI Line 0  

  29.         DCD     EXTI1_IRQHandler          ; EXTI Line 1  

  30.         DCD     EXTI2_IRQHandler          ; EXTI Line 2  

  31.         DCD     EXTI3_IRQHandler          ; EXTI Line 3  

  32.         DCD     EXTI4_IRQHandler          ; EXTI Line 4  

  33.         DCD     DMA1_Channel1_IRQHandler  ; DMA1 Channel 1  

  34.         DCD     DMA1_Channel2_IRQHandler  ; DMA1 Channel 2  

  35.         DCD     DMA1_Channel3_IRQHandler  ; DMA1 Channel 3  

  36.         DCD     DMA1_Channel4_IRQHandler  ; DMA1 Channel 4  

  37.         DCD     DMA1_Channel5_IRQHandler  ; DMA1 Channel 5  

  38.         DCD     DMA1_Channel6_IRQHandler  ; DMA1 Channel 6  

  39.         DCD     DMA1_Channel7_IRQHandler  ; DMA1 Channel 7  

  40.         DCD     ADC1_2_IRQHandler         ; ADC1 & ADC2  

  41.         DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX  

  42.         DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0  

  43.         DCD     CAN1_RX1_IRQHandler       ; CAN1 RX1  

  44.         DCD     CAN1_SCE_IRQHandler       ; CAN1 SCE  

  45.         DCD     EXTI9_5_IRQHandler        ; EXTI Line 9..5  

  46.         DCD     TIM1_BRK_IRQHandler       ; TIM1 Break  

  47.         DCD     TIM1_UP_IRQHandler        ; TIM1 Update  

  48.         DCD     TIM1_TRG_COM_IRQHandler   ; TIM1 Trigger and Commutation  

  49.         DCD     TIM1_CC_IRQHandler        ; TIM1 Capture Compare  

  50.         DCD     TIM2_IRQHandler           ; TIM2  

  51.         DCD     TIM3_IRQHandler           ; TIM3  

  52.         DCD     TIM4_IRQHandler           ; TIM4  

  53.         DCD     I2C1_EV_IRQHandler        ; I2C1 Event  

  54.         DCD     I2C1_ER_IRQHandler        ; I2C1 Error  

  55.         DCD     I2C2_EV_IRQHandler        ; I2C2 Event  

  56.         DCD     I2C2_ER_IRQHandler        ; I2C2 Error  

  57.         DCD     SPI1_IRQHandler           ; SPI1  

  58.         DCD     SPI2_IRQHandler           ; SPI2  

  59.         DCD     USART1_IRQHandler         ; USART1  

  60.         DCD     USART2_IRQHandler         ; USART2  

  61.         DCD     USART3_IRQHandler         ; USART3  

  62.         DCD     EXTI15_10_IRQHandler      ; EXTI Line 15..10  

  63.         DCD     RTCAlarm_IRQHandler       ; RTC Alarm through EXTI Line  

  64.         DCD     USBWakeUp_IRQHandler      ; USB Wakeup from suspend  

  65.         DCD     TIM8_BRK_IRQHandler       ; TIM8 Break  

  66.         DCD     TIM8_UP_IRQHandler        ; TIM8 Update  

  67.         DCD     TIM8_TRG_COM_IRQHandler   ; TIM8 Trigger and Commutation  

  68.         DCD     TIM8_CC_IRQHandler        ; TIM8 Capture Compare  

  69.         DCD     ADC3_IRQHandler           ; ADC3  

  70.         DCD     FSMC_IRQHandler           ; FSMC  

  71.         DCD     SDIO_IRQHandler           ; SDIO  

  72.         DCD     TIM5_IRQHandler           ; TIM5  

  73.         DCD     SPI3_IRQHandler           ; SPI3  

  74.         DCD     UART4_IRQHandler          ; UART4  

  75.         DCD     UART5_IRQHandler          ; UART5  

  76.         DCD     TIM6_IRQHandler           ; TIM6  

  77.         DCD     TIM7_IRQHandler           ; TIM7  

  78.         DCD     DMA2_Channel1_IRQHandler  ; DMA2 Channel1  

  79.         DCD     DMA2_Channel2_IRQHandler  ; DMA2 Channel2  

  80.         DCD     DMA2_Channel3_IRQHandler  ; DMA2 Channel3  

  81.         DCD     DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5  

  82. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  

  83. ;;  

  84. ;; Default interrupt handlers.  

  85. ;;  



3、


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

  2.   

  3.         PUBWEAK Reset_Handler           ;;标识符(这里是函数名) 弱定义  

  4.         SECTION .text:CODE:REORDER(2)   ;;  

  5. Reset_Handler  

  6.         LDR     R0, =SystemInit  

  7.         BLX     R0  

  8.         LDR     R0, =__iar_program_start  

  9.         BX      R0  

  10.                  

  11.         PUBWEAK NMI_Handler  

  12.         SECTION .text:CODE:REORDER(1)  

  13. NMI_Handler  

  14.         B NMI_Handler  

  15.   

  16.         PUBWEAK HardFault_Handler  

  17.         SECTION .text:CODE:REORDER(1)  

  18. HardFault_Handler  

  19.         B HardFault_Handler  

  20.   

  21.         PUBWEAK MemManage_Handler  

  22.         SECTION .text:CODE:REORDER(1)  

  23. MemManage_Handler  

  24.         B MemManage_Handler  

  25.   

  26.         PUBWEAK BusFault_Handler  

  27.         SECTION .text:CODE:REORDER(1)  

  28. BusFault_Handler  

  29.         B BusFault_Handler  

  30.   

  31.         PUBWEAK UsageFault_Handler  

  32.         SECTION .text:CODE:REORDER(1)  

  33. .................................  

  34. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  



关于段控制指令:


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

如下:

  • /*###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 };  




  • 『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

    热门文章 更多
    51单片机CO2检测显示程序解析