历史上的今天
返回首页

历史上的今天

今天是:2025年08月14日(星期四)

正在发生

2018年08月14日 | ucOS_II移植:Stm32启动代码分析

2018-08-14 来源:eefocus

用的编译工具是keil,在用keil建立stm32工程时,一般会产生一个启动文件,STM32F10x.s,在st提供的库函数里,用cortexm3_macro.s和stm32f10x_vector.s来代替这个文件。不过内容都大同小异。

我在csdn上搜到了一个在stm32上移植好的ucos,打算在这个代码的基础上,添加注释,先学别人的,然后再自己移植。

我获得的这份例程,使用了startup_stm32f10x_md.s作为启动文件,其中,删去了部分采用扩展SRAM的代码。

其文件内容为

startup_stm32f10x_md.s


;******** (C) COPYRIGHT2010 STMicroelectronics ********************

;* File Name          : startup_stm32f10x_md.s

;* Author             : MCD Application Team

;* Version            : V3.3.0

;* Date               : 04/16/2010

;* Description:STM32F10x Medium Density Devices vector table for RVMDK

;*                      toolchain.  

;*                      This module performs:

;*                      - Set the initial SP

;*                      - Set the initial PC ==Reset_Handler

;*          - Set the vector table entries withthe exceptions ISR address

;*                      - Configure the clocksystem

;*         - Branches to __main in the C library(which eventually

;*                        calls main()).

;*            After Reset the CortexM3 processoris in Thread mode,

;*             priority is Privileged, and theStack is set to Main.

;* <<< UseConfiguration Wizard in Context Menu >>>   

;***********************************************************************

; THE PRESENT FIRMWAREWHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS

; WITH CODINGINFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.

; AS A RESULT, STMICROELECTRONICSSHALL NOT BE HELD LIABLE FOR ANY DIRECT,

; INDIRECT ORCONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE

; CONTENT OF SUCHFIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING

; INFORMATION CONTAINEDHEREIN IN CONNECTION WITH THEIR PRODUCTS.

;**********************************************************************

; Amount of memory (inbytes) allocated for Stack

; Tailor this value toyour application needs

; <h> StackConfiguration

;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>

; </h>

Stack_Size      EQU    0x00000400

;定义堆栈大小

                  AREA   STACK, NOINIT, READWRITE, ALIGN=3

Stack_Mem       SPACE  Stack_Size

__initial_sp

;此处定义STACK段的程序,该段入口为__initial_sp,这是值在后面放在了0x00000000的位置处,作为MSP的初始值,一般程序

;编译的时候,由编译器赋值。我的编译器将其赋为0x20001138,如果用到了外接的SRAM,需要用

;__initial_sp EQU0x20000000 + Stack_Size 来定义

; <h> HeapConfiguration

;   <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>

; </h>

                                   

Heap_Size       EQU    0x00000200

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3

__heap_base

Heap_Mem        SPACE  Heap_Size

__heap_limit

                PRESERVE8

                THUMB

; Vector Table Mapped toAddress 0 at Reset

;下面是地址0x00000000 开始处的中断向量表,此段名RESET不可更改,是编译器里默认的起始段

                AREA    RESET, DATA, READONLY

                EXPORT  __Vectors

                EXPORT  __Vectors_End

                EXPORT  __Vectors_Size

__Vectors     DCD     __initial_sp               ; Top of Stack

                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    OSPendSV                   ;PendSV Handler(for uCOS-II)

                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_2

                DCD     USB_HP_CAN1_TX_IRQHandler; USB HighPriority 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

__Vectors_End

__Vectors_Size  EQU __Vectors_End - __Vectors

                AREA    |.text|, CODE, READONLY

; Reset handler

Reset_Handler    PROC

;此处删除了原有的关于扩展SRAM的代码,看来这个是默认内部SRAM的                                 EXPORT  Reset_Handler             [WEAK]

     IMPORT __main

     IMPORT SystemInit      ;是初始化RCC外设等的函数,原来的程序是在main起来之后初始化的

                 LDR     R0, =SystemInit         ;这里多了一个SystemInit函数的调用,原来的是直接跳到__main

                 BLX     R0                           

                 LDR     R0, =__main

                 BX      R0

                 ENDP

; Dummy ExceptionHandlers (infinite loops which can be modified)

;这一段的函数定义和声明很是麻烦,其实,只要在DCD前面,用命令IMPORT 来声明一下也是可以的

NMI_Handler     PROC

                EXPORT  NMI_Handler                [WEAK]

                B      .

                ENDP

HardFault_Handler\

                PROC

                EXPORT  HardFault_Handler          [WEAK]

                B       .

                ENDP

MemManage_Handler\

                PROC

                EXPORT  MemManage_Handler          [WEAK]

                B       .

                ENDP

BusFault_Handler\

                PROC

                EXPORT  BusFault_Handler           [WEAK]

                B       .

                ENDP

UsageFault_Handler\

                PROC

                EXPORT  UsageFault_Handler         [WEAK]

                B       .

                ENDP

SVC_Handler     PROC

                EXPORT  SVC_Handler                [WEAK]

                B       .

                ENDP

DebugMon_Handler\

                PROC

                EXPORT  DebugMon_Handler           [WEAK]

                B       .

                ENDP

;PendSV_Handler  PROC

;                EXPORT  PendSV_Handler             [WEAK]

; (for uCOS-II)

OSPendSV        PROC

                EXPORT  OSPendSV                   [WEAK]

                B       .

                ENDP

SysTick_Handler PROC

                EXPORT  SysTick_Handler            [WEAK]

                B       .

                ENDP

Default_Handler PROC

                EXPORT  WWDG_IRQHandler            [WEAK]

                EXPORT  PVD_IRQHandler             [WEAK]

                EXPORT  TAMPER_IRQHandler          [WEAK]

                EXPORT  RTC_IRQHandler             [WEAK]

                EXPORT  FLASH_IRQHandler           [WEAK]

                EXPORT  RCC_IRQHandler             [WEAK]

                EXPORT  EXTI0_IRQHandler           [WEAK]

                EXPORT  EXTI1_IRQHandler           [WEAK]

                EXPORT  EXTI2_IRQHandler           [WEAK]

                EXPORT EXTI3_IRQHandler           [WEAK]

                EXPORT  EXTI4_IRQHandler           [WEAK]

                EXPORT  DMA1_Channel1_IRQHandler   [WEAK]

                EXPORT  DMA1_Channel2_IRQHandler   [WEAK]

                EXPORT  DMA1_Channel3_IRQHandler   [WEAK]

                EXPORT  DMA1_Channel4_IRQHandler   [WEAK]

                EXPORT  DMA1_Channel5_IRQHandler   [WEAK]

                EXPORT  DMA1_Channel6_IRQHandler   [WEAK]

                EXPORT  DMA1_Channel7_IRQHandler   [WEAK]

                EXPORT  ADC1_2_IRQHandler          [WEAK]

                EXPORT  USB_HP_CAN1_TX_IRQHandler  [WEAK]

                EXPORT  USB_LP_CAN1_RX0_IRQHandler [WEAK]

                EXPORT  CAN1_RX1_IRQHandler        [WEAK]

                EXPORT  CAN1_SCE_IRQHandler        [WEAK]

                EXPORT  EXTI9_5_IRQHandler         [WEAK]

                EXPORT  TIM1_BRK_IRQHandler        [WEAK]

                EXPORT  TIM1_UP_IRQHandler         [WEAK]

                EXPORT  TIM1_TRG_COM_IRQHandler    [WEAK]

                EXPORT  TIM1_CC_IRQHandler         [WEAK]

                EXPORT  TIM2_IRQHandler            [WEAK]

                EXPORT  TIM3_IRQHandler            [WEAK]

                EXPORT  TIM4_IRQHandler            [WEAK]

                EXPORT  I2C1_EV_IRQHandler         [WEAK]

                EXPORT  I2C1_ER_IRQHandler         [WEAK]

                EXPORT  I2C2_EV_IRQHandler         [WEAK]

                EXPORT  I2C2_ER_IRQHandler         [WEAK]

                EXPORT  SPI1_IRQHandler            [WEAK]

                EXPORT  SPI2_IRQHandler            [WEAK]

                EXPORT  USART1_IRQHandler          [WEAK]

                EXPORT  USART2_IRQHandler          [WEAK]

                EXPORT  USART3_IRQHandler          [WEAK]

                EXPORT EXTI15_10_IRQHandler       [WEAK]

                EXPORT  RTCAlarm_IRQHandler        [WEAK]

                EXPORT  USBWakeUp_IRQHandler       [WEAK]

WWDG_IRQHandler

PVD_IRQHandler

TAMPER_IRQHandler

RTC_IRQHandler

FLASH_IRQHandler

RCC_IRQHandler

EXTI0_IRQHandler

EXTI1_IRQHandler

EXTI2_IRQHandler

EXTI3_IRQHandler

EXTI4_IRQHandler

DMA1_Channel1_IRQHandler

DMA1_Channel2_IRQHandler

DMA1_Channel3_IRQHandler

DMA1_Channel4_IRQHandler

DMA1_Channel5_IRQHandler

DMA1_Channel6_IRQHandler

DMA1_Channel7_IRQHandler

ADC1_2_IRQHandler

USB_HP_CAN1_TX_IRQHandler

USB_LP_CAN1_RX0_IRQHandler

CAN1_RX1_IRQHandler

CAN1_SCE_IRQHandler

EXTI9_5_IRQHandler

TIM1_BRK_IRQHandler

TIM1_UP_IRQHandler

TIM1_TRG_COM_IRQHandler

TIM1_CC_IRQHandler

TIM2_IRQHandler

TIM3_IRQHandler

TIM4_IRQHandler

I2C1_EV_IRQHandler

I2C1_ER_IRQHandler

I2C2_EV_IRQHandler

I2C2_ER_IRQHandler

SPI1_IRQHandler

SPI2_IRQHandler

USART1_IRQHandler

USART2_IRQHandler

USART3_IRQHandler

EXTI15_10_IRQHandler

RTCAlarm_IRQHandler

USBWakeUp_IRQHandler

                B      .

                ENDP

                ALIGN

;*******************************************************************************

; User Stack and Heapinitialization

;*******************************************************************************

                 IF      :DEF:__MICROLIB           

                ;这里是定义了microlib的情况,一般用在单片机上,都定义这个库

                 EXPORT  __initial_sp

                 EXPORT  __heap_base

                 EXPORT  __heap_limit

               

                 ELSE

               

                 IMPORT  __use_two_region_memory

                 EXPORT  __user_initial_stackheap

                 

__user_initial_stackheap

                 LDR     R0, = Heap_Mem

                 LDR     R1, =(Stack_Mem + Stack_Size)

                 LDR     R2, = (Heap_Mem +  Heap_Size)

                 LDR    R3, = Stack_Mem

                 BX      LR

                 ALIGN

                 ENDIF

                 END

;******************* (C)COPYRIGHT 2010 STMicroelectronics *****END OF FILE*****

startup_stm32f10x_md.s结束


推荐阅读

史海拾趣

Dailywell Electronics Co Ltd公司的发展小趣事

随着业务的不断扩展和市场需求的增加,德利威电子在1998年实现了全系列防水开关的生产,并取得了RS33A开关专利。同年,公司还扩大了经营规模,搬入了自购的厂办大楼,并增加了资本额至一千五百万元。这些举措不仅提升了公司的生产能力和产品品质,也为公司未来的发展奠定了坚实的基础。

芯力微(CHI Power)公司的发展小趣事

芯力微深知人才是企业发展的核心动力。因此,公司一直注重人才的培养和引进。公司建立了一套完善的人才培养机制,为员工提供广阔的发展空间和良好的职业前景。同时,芯力微还积极引进国内外优秀人才,打造了一支高素质、专业化的团队。这支团队不仅具备丰富的行业经验和技术能力,还具备高度的责任感和使命感。他们为公司的发展贡献了自己的智慧和力量。

Ememory Technology Inc公司的发展小趣事

随着电子行业的快速发展和市场竞争的加剧,eMemory始终保持着对新技术和新市场的敏锐洞察力。公司不断推出新的硅智财产品和解决方案,以满足客户不断变化的需求。同时,eMemory还积极拓展国际市场,与全球多家知名芯片设计厂商建立了长期稳定的合作关系。这些努力使得eMemory在电子行业中保持着领先地位,并为其未来的发展奠定了坚实的基础。

上海超致公司的发展小趣事

随着技术的不断积累和创新,上海超致在功率半导体领域取得了重大突破。公司成功推出了全球首款量产SJ-IGBT产品,这一产品具有电流密度大、综合器件性能优的特点,在硅基成本下实现了性能的显著提升。此外,上海超致还不断拓宽产品线,产品广泛应用于太阳能微逆变器、车载OBC、充电桩、UPS电源等多个领域。这些产品的推出不仅满足了市场的需求,也进一步提升了公司的市场竞争力。

得力(deli)公司的发展小趣事

得力公司在文具和打印机领域取得成功后,并未满足于此,而是继续寻求新的增长点。2016年,得力集团与余姚得力工具有限公司合资成立宁波得力工具有限公司,正式进入电动工具领域。得力凭借其在技术研发和品质控制方面的优势,迅速在电动工具市场占据一席之地。特别是其自主研发的“红芯”系列电动工具,凭借其高品质、高性价比的特点,赢得了用户的广泛好评。

Aeroflex公司的发展小趣事

得力公司最初以文具制造起家,但在电子科技快速发展的时代,公司意识到必须转型升级以适应市场需求。于是,得力决定进军专业门槛高、技术壁垒深的打印机产业。经过数年的科研攻坚,得力成功研发出首台激光工程机,并在随后几年内,发展成为国内唯一一家同时掌握激光、喷墨打印核心技术研发、生产能力的企业。这一跨越不仅展现了得力公司在科技创新方面的决心和毅力,也为其在电子行业树立了新的里程碑。

问答坊 | AI 解惑

Ansoft简单版软件

有限元分析软件!…

查看全部问答>

NXP LPC1343 开发板 学习之旅(序言)

       俗语说的好,“万事开头难”,确实如此啊,从收到LPC1343的开发板到现在,已经有一段时间了,但是却迟迟未能进入学习和开发的状态(一直在忙一个产品的出货。。。 ),也没有像论坛里其他的仁人志士一样,分 ...…

查看全部问答>

WINCE下怎么知道一个驱动被device.exe加载后的线程ID号?Performance Monitor的device.exe/xxx这个xxx编号表示什么

WINCE下怎么知道一个驱动被device.exe加载后的线程ID号?Performance Monitor的device.exe/xxx这个xxx编号表示什么?…

查看全部问答>

我好晕啊,软件调试一个实时时钟程序竟然提示我需要的系统资源不够!!!!!!!!!!!

不在迷茫中死亡,就在郁闷中爆发!!!!!!!!!!!!!!!! AVR,I will kill you!…

查看全部问答>

关于wince 5.0的sdk 与vs2005的问题

首次安装wince 5.0的开发环境,不知道该如何安装 弱弱的问一下大家是怎么安装wince 5.0的开发环境的? 我装了pb 5.0 Microsoft ActiveSync 4.5 evc 4.0 编译映像后生成sdk。 安装sdk通过evc 将程序下的板子上没有问题。 但要求用vs2005开发软 ...…

查看全部问答>

如何去学嵌入式系统开发

如何去学嵌入式系统开发…

查看全部问答>

一年工作经验的wince程序员求职

本人从事wince开发已经一年,主要是做symbol的mc3000,mc50等工业pda的程序开发,做过的项目主要有:     1、某大型超市的卖场盘点、收货系统:无线实时系统,pda端程序、服务器端程序和oracle数据库的相关存储过程由我自己一人完成。开 ...…

查看全部问答>

大学、FPGA、工作

自己即将大学毕业,自己也一直希望能从事FPGA方面的工作。但自己对FPGA研究不是很深入,只有几个月的时间,学校老师上FPGA的课程时只是简单的讲了VHDL,以及有关FPGA方面的简单边缘的扩展知识。另一个硬件描述语言verilog hdl也是自己自学的,感觉 ...…

查看全部问答>

TMS320C6713B片外SRAM中运行程序

大家好: 我设计了一款TMS320C6713B+FPGA的板子,目前有个问题困扰我很久了,即,该DSP能否让程序运行在片外SRAM中,如果可以需要注意哪些方面?我现在的现象是程序运行在DSP片内RAM中正常,运行在片外SRAM中不行(单独测试该SRAM正常,进行了充分 ...…

查看全部问答>