STM32 启动代码分析

发布者:创意狂想最新更新时间:2017-09-21 来源: eefocus关键字:stm32  启动代码 手机看文章 扫描二维码
随时随地手机看文章

对于keil的启动代码(针对STM32F042),添加 备注 和 自己的理解

;******************** (C) COPYRIGHT 2014 STMicroelectronics ********************
;* File Name          : startup_stm32f042.s
;* Author             : MCD Application Team,modified by Sky,
;* Version            : V1.5.0;* Date               : 05-December-2014,modified on,01-Nov-2016;* Description        : STM32F042 Devices vector table for;*                      for MDK-ARM toolchain.
;*                      This module performs:
;*                      - Set the initial SP
;*                      - Set the initial PC == Reset_Handler
;*                      - Set the vector table entries with the exceptions ISR address
;*                      - Configure the system clock
;*                      - Branches to __main in the C library (which eventually
;*                        calls main()).
;*                      After Reset the CortexM0 processor is in Thread mode,
;*                      priority is Privileged, and the Stack is set to Main.
;* <<< Use Configuration Wizard in Context Menu >>>  
;*******************************************************************************
;  @attention
;
;  Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
;  You may not use this file except in compliance with the License.
;  You may obtain a copy of the License at:
;
;         http:;;www.st.com/software_license_agreement_liberty_v2
;
;  Unless required by applicable law or agreed to in writing, software
;  distributed under the License is distributed on an "AS IS" BASIS,
;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;  See the License for the specific language governing permissions and;  limitations under the License.
;
;*******************************************************************************




;
;
;notes:stack,heap,data seg,code seg address of mem is set by compiler
;
;










;
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; Stack Configuration
;   Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
;
\

;;EQU 定义宏
;;栈大小,1k
Stack_Size      EQU     0x00000400;;AREA 定义段,注意:一个程序是由多个段构成,如CODE,STACK,DATA,
;;ALIGN=3,8字节对齐
               AREA    STACK, NOINIT, READWRITE, ALIGN=3Stack_Mem       SPACE   Stack_Size
;;__initial_sp一个标号,由汇编器进行计算,代表上面SPACE分配内存的最后一个地址,栈为向下增长型
__initial_sp


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

;;堆512bytes
Heap_Size       EQU     0x00000200

               AREA    HEAP, NOINIT, READWRITE, ALIGN=3__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit
;;PRESERVE8,指定当前文件堆栈8bytes对齐
               PRESERVE8
;;THUMB,后面的指令要兼容THUMB指令
               THUMB


; Vector Table Mapped to Address 0 at Reset
;;定义一个叫做RESET的数据段
               AREA    RESET, DATA, READONLY
;;EXPORT声明标号为外部文件可用
               EXPORT  __Vectors
               EXPORT  __Vectors_End
               EXPORT  __Vectors_Size
;;DCD是按4字节分配存储单元
__Vectors       DCD     __initial_sp                   ; Top of Stack
                       DCD     Reset_Handler                  ; Reset Handler
                       DCD     NMI_Handler                    ; NMI Handler
                       DCD     HardFault_Handler              ; Hard Fault Handler
                       DCD     0                              ; Reserved
                       DCD     0                              ; Reserved
                       DCD     0                              ; Reserved
                       DCD     0                              ; Reserved
                       DCD     0                              ; Reserved
                       DCD     0                              ; Reserved
                       DCD     0                              ; Reserved
                       DCD     SVC_Handler                    ; SVCall Handler
                       DCD     0                              ; Reserved
                       DCD     0                              ; Reserved
                       DCD     PendSV_Handler                 ; PendSV Handler
                       DCD     SysTick_Handler                ; SysTick Handler

               ; External Interrupts
               DCD     WWDG_IRQHandler                ; Window Watchdog
               DCD     PVD_VDDIO2_IRQHandler          ; PVD and VDDIO2 through EXTI Line detect
               DCD     RTC_IRQHandler                 ; RTC through EXTI Line
               DCD     FLASH_IRQHandler               ; FLASH
               DCD     RCC_CRS_IRQHandler             ; RCC and CRS
               DCD     EXTI0_1_IRQHandler             ; EXTI Line 0 and 1
               DCD     EXTI2_3_IRQHandler             ; EXTI Line 2 and 3
               DCD     EXTI4_15_IRQHandler            ; EXTI Line 4 to 15
               DCD     TSC_IRQHandler                 ; TS
               DCD     DMA1_Channel1_IRQHandler       ; DMA1 Channel 1
               DCD     DMA1_Channel2_3_IRQHandler     ; DMA1 Channel 2 and Channel 3
               DCD     DMA1_Channel4_5_IRQHandler     ; DMA1 Channel 4, Channel 5
               DCD     ADC1_IRQHandler                ; ADC1
               DCD     TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation
               DCD     TIM1_CC_IRQHandler             ; TIM1 Capture Compare
               DCD     TIM2_IRQHandler                ; TIM2
               DCD     TIM3_IRQHandler                ; TIM3
               DCD     0                              ; Reserved
               DCD     0                              ; Reserved
               DCD     TIM14_IRQHandler               ; TIM14
               DCD     0                              ; Reserved
               DCD     TIM16_IRQHandler               ; TIM16
               DCD     TIM17_IRQHandler               ; TIM17
               DCD     I2C1_IRQHandler                ; I2C1
               DCD     0                              ; Reserved
               DCD     SPI1_IRQHandler                ; SPI1
               DCD     SPI2_IRQHandler                ; SPI2
               DCD     USART1_IRQHandler              ; USART1
               DCD     USART2_IRQHandler              ; USART2
               DCD     0                              ; Reserved
               DCD     CEC_CAN_IRQHandler             ; CEC and CAN
               DCD     USB_IRQHandler                 ; USB

__Vectors_End

__Vectors_Size  EQU  __Vectors_End - __Vectors

;;定义一个.text的代码段
               AREA    |.text|, CODE, READONLY

;STM32F03x devices feature 4Kbytes of static SRAM. STM32F04x devices feature
;6 Kbytes of static SRAM. STM32F05x devices feature 8Kbytes of static SRAM.
;STM32F07xS devices feature 16 Kbytes of static SRAM. STM32F09x devices feature
;32 Kbytes of static SRAM.





; Reset handler routine
;;PROC定义子程序
Reset_Handler    PROC
;;WEAK:弱定义
                EXPORT  Reset_Handler                 [WEAK]
       IMPORT  __main
       IMPORT  SystemInit


;;给R0赋值,sp的值
       LDR     R0, =__initial_sp          ; set stack pointer
;;R0给MSP寄存器
       MSR     MSP, R0  

;;Check if boot space corresponds to test memory

       LDR R0,=0x00000004
       LDR R1, [R0]
       ;;R1=0x08000004 OR R1=0x20000004 OR R1=0x1FXX XXXX
       ;;when R1=R1=0x1FXX XXXX,we can know that Reset_Handler'sAddress is not right,
       ;;it maybe in reserved or systemmemory or optionbyte,we must remap address for start
;;Logical shift right by register LSRS

       LSRS R1, R1, #24
       ;R2=0x0000001F
       LDR R2,=0x1F
       CMP R1, R2

       BNE ApplicationStart  

;; SYSCFG clock enable    
    ;RCC_APB2ENR,0x40021018
       LDR R0,=0x40021018
       LDR R1,=0x00000001
       STR R1, [R0]

;; Set CFGR1 register with flash memory remap at address 0
    ;SYS_CFGR1,0x40010000
       LDR R0,=0x40010000
       LDR R1,=0x00000000
       STR R1, [R0]
ApplicationStart
                LDR     R0, =SystemInit
                BLX     R0
                LDR     R0, =__main
                BX      R0
                ENDP

; Dummy Exception Handlers (infinite loops which can be modified)

NMI_Handler     PROC
               EXPORT  NMI_Handler                    [WEAK]
                   ;;B .   无限循环
               B       .
               ENDP
HardFault_Handler\
               PROC
               EXPORT  HardFault_Handler              [WEAK]
               B       .
               ENDP
SVC_Handler     PROC
               EXPORT  SVC_Handler                    [WEAK]
               B       .
               ENDP
PendSV_Handler  PROC
               EXPORT  PendSV_Handler                 [WEAK]
               B       .
               ENDP
SysTick_Handler PROC
               EXPORT  SysTick_Handler                [WEAK]
               B       .
               ENDP

Default_Handler PROC

               EXPORT  WWDG_IRQHandler                [WEAK]
               EXPORT  PVD_VDDIO2_IRQHandler          [WEAK]
               EXPORT  RTC_IRQHandler                 [WEAK]
               EXPORT  FLASH_IRQHandler               [WEAK]
               EXPORT  RCC_CRS_IRQHandler             [WEAK]
               EXPORT  EXTI0_1_IRQHandler             [WEAK]
               EXPORT  EXTI2_3_IRQHandler             [WEAK]
               EXPORT  EXTI4_15_IRQHandler            [WEAK]
               EXPORT  TSC_IRQHandler                  [WEAK]
               EXPORT  DMA1_Channel1_IRQHandler       [WEAK]
               EXPORT  DMA1_Channel2_3_IRQHandler     [WEAK]
               EXPORT  DMA1_Channel4_5_IRQHandler     [WEAK]
               EXPORT  ADC1_IRQHandler                [WEAK]
               EXPORT  TIM1_BRK_UP_TRG_COM_IRQHandler [WEAK]
               EXPORT  TIM1_CC_IRQHandler             [WEAK]
               EXPORT  TIM2_IRQHandler                [WEAK]
               EXPORT  TIM3_IRQHandler                [WEAK]
               EXPORT  TIM14_IRQHandler               [WEAK]
               EXPORT  TIM16_IRQHandler               [WEAK]
               EXPORT  TIM17_IRQHandler               [WEAK]
               EXPORT  I2C1_IRQHandler                [WEAK]
               EXPORT  SPI1_IRQHandler                [WEAK]
               EXPORT  SPI2_IRQHandler                [WEAK]
               EXPORT  USART1_IRQHandler              [WEAK]
               EXPORT  USART2_IRQHandler              [WEAK]
               EXPORT  CEC_CAN_IRQHandler             [WEAK]
               EXPORT  USB_IRQHandler                 [WEAK]


WWDG_IRQHandler
PVD_VDDIO2_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_CRS_IRQHandler
EXTI0_1_IRQHandler
EXTI2_3_IRQHandler
EXTI4_15_IRQHandler
TSC_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_3_IRQHandler
DMA1_Channel4_5_IRQHandler
ADC1_IRQHandler
TIM1_BRK_UP_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM14_IRQHandler
TIM16_IRQHandler
TIM17_IRQHandler
I2C1_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
CEC_CAN_IRQHandler
USB_IRQHandler  

               B       .

               ENDP

               ALIGN

;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
                IF      :DEF:__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 STMicroelectronics *****END OF FILE*****


关键字:stm32  启动代码 引用地址:STM32 启动代码分析

上一篇:STM32经验心得(一)
下一篇:STM32 IAP在线升级详解

推荐阅读最新更新时间:2024-03-16 15:37

stm32之DMA彻底研究
在做实验之前,首先必须明白什么是DMA,DMA的作用又体现在哪里。 DMA,即直接内存存储,在一些数据的传输中,采用DMA方式,从而将CPU解放出来。 让CPU有足够的时间处理其他的事情。 stm32使用DMA的相关操作: 1、DMA的配置 要配置的有DMA传输通道选择,传输的成员和方向、普通模式还是循环模式等等。 void DMA_Configuration(void) { DMA_InitTypeDef DMA_InitStructure; //DMA设置: //设置DMA源:内存地址&串口数据寄存器地址 //方向:内存-- 外设 //每次传输位:8bit //传输大小DMA_BufferSize=SEN
[单片机]
STM32 DAC详解
上一篇介绍了《 STM32ADC详解 》,既然有模拟转数字的ADC模块,那么就必然有数字转模拟的DAC模块。顾名思义,该模块仅具有ADC的补充功能。它将数字二进制值转换为模拟电压输出。DAC模块具有多种用途,包括音频生成,波形生成等。通常在大多数8位微控制器中,此模块不可用,并且通过脉宽调制(PWM)可以稍微满足其需求。部分原因是由于它们的硬件资源和运行速度相对较低。所有STM32单片机都具有PWM模块,但大容量STM32也具有DAC模块。STM32DAC模块不是很复杂,并且在工作原理方面与ADC模块相似。 01、DAC简介 从STM32F207数据手册看到,STM32F207具有两个DAC模块。 每个DAC具有独立的通道
[单片机]
<font color='red'>STM32</font> DAC详解
STM32定时器溢出模式计时设置
环境: 主机:WIN7 开发环境:MDK4.23 MCU:STM32F103CBT6 源代码1: 说明:定时器采用TIM2,时钟源为内部8M晶振,向上溢出模式.此定时器用在延时函数,最小可以延时1us,故没有采用中断形式定时. 初始化代码: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //重新将Timer设置为缺省值 TIM_DeInit(TIM2); //采用内部时钟给TIM2提供时钟源 TIM_InternalClockConfig(TIM2); timInitStruct.TIM_ClockDivision = TIM_CKD_DIV2;
[单片机]
有关STM32外设配置的几个常见问题
在做STM32开发应用的过程中,常常会遇到这样那样的问题,其中相当部分问题是与各外设及相关GPIO的配置有关的。就这方面的问题,这里一起总结交流下。 目前的STM32芯片是基于ARM内核的可编程微处理器,我们可以简单地把内核以外的东西统称为外设,比方 TIMER、UART、SPI、USB、I2C、存储器等功能模块。以32F427芯片功能框图为例,那些红圈上的都是。 好,我们直接切入主题。围绕外设的配置,我们遇到的问题,大致可以分为两大类。 一、时钟问题,就这方面的问题又可以细分为几小点。 1.1 时钟没打开就使用。 这个不难理解,就是相关外设的时钟没有打开。比如UART5的时钟没有打开,SPI的时钟没打开
[单片机]
有关<font color='red'>STM32</font>外设配置的几个常见问题
STM32硬件i2c的EV卡死问题的终极解决(已通过老化测试40h)
鉴于各位对于stm32的硬件i2c均存在质疑且在此处下载的所有硬件i2c程序均基于一个模板 大家对于硬件i2c的说法均在初始化上而对于发送接收程序并没有多少改动 所以我个人对这一段进行了优化,加上了超时自动跳出和标志位的动作,完美解决了硬件i2c的卡死问题 这里就是一个初始化的程序,应注意,clockspeed不应该高于100k 这是一个初始化的顺序,应注意,i2c的初始化应在RCC和GPIO之后进行 上面这一段就是新增的程序模块,为的是对于易卡死的while循环做出限制,防止死循环。 只需将已有的程序中所有的关于硬件i2c的while循环均加上这一条就可以使用了。 此处如果在I2C1_hardware_wait_ci
[单片机]
<font color='red'>STM32</font>硬件i2c的EV卡死问题的终极解决(已通过老化测试40h)
基于STM32的平衡小车设计过程
一、简介 接触STM32开发一段时间了,想用STM32做一个有意思的项目,经历了无数的调参调参再调参,终于让它站稳了,接一下就一步步的跟大家介绍一下,项目的整体实现过程— 二、项目介绍 STM32平衡小车是一种基于STM32芯片的智能小车,它可以通过自动控制来保持平衡,使其可以在不同的地形上稳定行驶。其使用范围非常广泛。需要用到一些基本的硬件组件,例如电机、轮子、陀螺仪、加速度计、电池等。通过设计的电路板进行连接,组成一个完整的系统。 三、硬件设计 根据上述需求,我进行了电路图设计 四、软件设计 4.1电机驱动编写 4.1.1电机引脚说明 编码电机 引脚说明: M1电机电源线(12V) GND编码器地线 C
[单片机]
基于<font color='red'>STM32</font>的平衡小车设计过程
STM32串口接收发送子程序
/*上传STM32串口接收发送子程序,调试验证OK,供参考*/ #include STM32_UartImpl.h static UART_HandleTypeDef* pstm32uart_entry = NULL; int STM32_SendBuffer(const char* pcmd); const char* STM32_GetBuffer(void); #define UART__TIMEOUT 500 void WaitSTM32UartReady() { HAL_UART_StateTypeDef status; do { status = HAL_UART_GetState(pstm
[单片机]
STM32单片机中断详解
中断,在单片机中占有非常重要的地位。代码默认地从上向下执行,遇到条件或者其他语句,会按照指定的地方跳转。而在单片机执行代码的过程中,难免会有一些突发的情况需要处理,这样就会打断当前的代码,待处理完突发情况之后,程序会回到被打断的地方继续执行。 1 EXTI控制器 外部中断/事件控制器(EXTI)管理了控制器的 23 个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。 外部信号进入经过1的边沿检测电路,检测是否符合(有2和3的上升沿和下降沿选择寄存器决定),产生信号,然后和4软件
[单片机]
<font color='red'>STM32</font>单片机中断详解
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved