STM32_MDK启动代码分析

合集下载

STM32启动代码分析简化实战

STM32启动代码分析简化实战

STM32启动代码分析简化实战首先,我们来分析一下ST启动代码的结构。

通常,STM32的启动代码由两部分组成:启动文件和启动代码。

启动文件是一份汇编代码,其中定义了向量表、堆栈以及各个中断服务程序的跳转入口。

启动文件会在编译过程中被链接到用户程序的最起始处。

启动代码是一份C代码,用于初始化系统时钟和片上外设。

在启动文件的入口函数中,会调用启动代码的一些函数来完成这些初始化工作。

接下来,我们来看一下如何简化STM32启动代码。

通常情况下,启动代码会包含大量的初始化函数调用、配置寄存器的代码,这些代码会造成代码体积较大,且对于初学者来说,阅读和理解起来可能较为困难。

为了简化启动代码,我们可以使用CubeMX工具生成初始化代码。

CubeMX是ST官方提供的一款图形化工具,可以帮助我们自动生成初始化代码。

首先,我们需要安装并打开CubeMX工具。

然后,选择对应的MCU型号,并进行一些基本配置,如时钟源、系统频率等。

接下来,点击"Pinout & Configuration"选项卡,进行外设的配置。

可以选择需要使用的外设,并进行一些基本的参数设置。

完成配置后,点击"Project"选项卡,选择生成代码的目标IDE,比如Keil MDK、IAR Embedded Workbench等,并点击"Generate Code"按钮生成代码。

生成的代码将包含了系统时钟和外设的初始化代码,以及一些基本的配置文件,如头文件、链接脚本等。

最后,我们来进行一些实战演示。

以Blink LED为例,我们通过CubeMX生成初始化代码,并在主函数中添加LED闪烁的代码。

首先,在CubeMX中将GPIO口配置为输出模式,并选择对应的引脚和管脚模式。

生成代码后,在main.c文件中找到MX_GPIO_Init函数,将其中的代码复制到主函数中。

然后,在主函数中添加LED闪烁的代码,即将LED引脚设置为高电平后延时一段时间,然后将LED引脚设置为低电平再延时一段时间。

STM32启动文件详解

STM32启动文件详解

STM32启动文件详解(2012-07-28 11:22:34)转载▼分类:STM32标签:stm32启动在<<STM32不完全手册里面>>,用的是STM32F103RBT6,所有的例程都采用了一个叫STM32F10x.s的启动文件,里面定义了STM32的堆栈大小以及各种中断的名字及入口函数名称,还有启动相关的汇编代码。

STM32F10x.s是MDK提供的启动代码,从其里面的内容看来,它只定义了3个串口,4个定时器。

实际上STM32的系列产品有5个串口的型号,也只有有2个串口的型号,定时器也是,做多的有8个定时器。

比如,如果你用的STM32F103ZET6,而启动文件用的是STM32F10x.s的话,你可以正常使用串口1~3的中断,而串口4和5的中断,则无**常使用。

又比如,你TIM1~4的中断可以正常使用,而5~8的,则无法使用。

而在固件库里出现3个文件startup_stm32f10x_ld.sstartup_stm32f10x_md.sstartup_stm32f10x_hd.s其中,ld.s适用于小容量产品;md.s适用于中等容量产品;hd适用于大容量产品;这里的容量是指FLASH的大小.判断方法如下:小容量:FLASH≤32K中容量:64K≤FLASH≤128K大容量:256K≤FLASH;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** ;* File Name : startup_stm32f10x_hd.s;* Author : MCD Application Team;* Version : V3.5.0;* Date : 11-March-2011;* Description : STM32F10x High Density Devices vector table 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 clock system and also configure the external;* SRAM mounted on STM3210E-EVAL board to be used as data;* memory (optional, to be enabled by user);* - Branches to __main in the C library (which eventually;* calls main()).;* After Reset the CortexM3 processor is in Thread mode,;* priority is Privileged, and the Stack is set to Main.;* 说明: 此文件为STM32F10x高密度设备的MDK工具链的启动文件;* 该模块执行以下操作:;* -设置初始堆栈指针(SP);* -设置初始程序计数器(PC)为复位向量,并在执行main函数前初始化系统时钟;* -设置向量表入口为异常事件的入口地址;* -复位之后处理器为线程模式,优先级为特权级,堆栈设置为MSP主堆栈;* <<< Use Configuration Wizard in Context Menu >>>; 首先对栈和堆的大小进行定义,并在代码区的起始处建立中断向量表,其第一个表项是栈; 顶地址,第二个表项是复位中断服务入口地址。

解析STM32启动过程

解析STM32启动过程

解析STM32启动过程
STM32启动过程是指当电源被接通时,STM32芯片进行自检并加载固
件的过程。

这个过程可以分为四个主要阶段:复位阶段、时钟初始化阶段、中断向量表重定位阶段和主函数执行阶段。

时钟初始化阶段是STM32启动的第二个阶段。

在复位阶段,系统时钟
会被配置为默认的内部RC振荡器,通常为8MHz。

在时钟初始化阶段,可
以通过程序代码来配置系统时钟,包括选择和配置时钟源、设置时钟分频等。

时钟的初始化是系统正常运行的前提条件,因为大多数外设的工作频
率都与系统时钟相关。

主函数执行阶段是STM32启动的最后一个阶段。

在中断向量表重定位
完成后,主函数会被调用执行。

主函数中通常会初始化系统的各种外设,
配置时钟、GPIO、中断等,并进入一个无限循环等待外设事件的发生。


旦外设事件发生,会触发中断,处理对应的中断服务程序。

总结来说,STM32启动过程包括复位阶段、时钟初始化阶段、中断向
量表重定位阶段和主函数执行阶段。

复位阶段进行系统自检和硬件初始化,时钟初始化阶段配置系统时钟,中断向量表重定位阶段将中断向量表重定
位到实际的起始地址,主函数执行阶段初始化外设并进入循环等待外设事
件的发生。

这个过程是STM32系统启动的基本过程,对于系统的正常运行
起着关键作用。

解析STM32的启动过程

解析STM32的启动过程

解析STM32的启动过程STM32的启动过程可以分为硬件启动过程和软件启动过程两部分。

硬件启动过程主要是指芯片上电后的初始化阶段,而软件启动过程则是指固定在芯片内的启动程序的执行过程。

硬件启动过程1.上电复位:当STM32芯片上电后,会进行一次复位操作,将片内的所有寄存器初始化为默认值。

2.时钟初始化:芯片复位后,需要初始化芯片的各个时钟源和时钟分频系数。

例如,配置系统时钟、外设时钟和外设时钟的分频。

3.外设初始化:初始化芯片的各个外设,包括GPIO、USART、SPI、I2C等。

外设初始化主要是配置相应的寄存器使它们能够正常工作。

4.中断向量表:中断向量表是储存在芯片中的一系列函数指针,用于响应中断事件。

在硬件启动过程中,需要将中断向量表的地址设定为固定的位置,并将其中各个中断的函数指针初始化为默认的中断服务函数。

5.系统堆栈初始化:系统堆栈是用于存储函数调用时的临时变量和程序返回地址的存储区域。

在硬件启动过程中,需要初始化系统堆栈指针,为后续的函数调用和中断处理做准备。

6. 程序复位:在芯片复位后,可以选择从外部存储器(如Flash)中加载启动程序,或从内部存储器(如内置Bootloader)中加载启动程序。

启动程序一般是一个二进制文件,其中包含了一系列的初始化指令和应用程序的入口点。

软件启动过程1.初始化函数:启动程序首先执行初始化函数,用于初始化C库、变量和硬件资源等。

例如,初始化堆栈指针、启动C库和启用FPU等。

2.系统时钟初始化:启动程序需要初始化系统时钟,以使系统能够正常工作。

这包括设置主时钟源、配置主时钟分频系数和外设时钟分频系数等。

3.初始化其他硬件资源:启动程序会初始化其他的硬件资源,例如外设、存储器、中断控制器等。

4.跳转到主函数入口点:启动程序最后一步是跳转到主函数的入口点,开始执行用户代码。

总结STM32的启动过程可以分为硬件启动过程和软件启动过程。

硬件启动过程包括上电复位、时钟初始化、外设初始化、中断向量表配置和系统堆栈初始化等操作。

MDK main函数运行前的详细分析

MDK main函数运行前的详细分析

图 2-10 MAP 文件分析 0x0800 015D 地址是函数_scatterload_copy 的入口,该函数到底 copy 了什么 值呢?在此之前我们先要熟悉一下.map 文件 .map 文件是值包括了映像文件信息图和其它信息的一个映射文件, 该文件包 含了: (1) 从映像文件中删除的输入段中未使用段的统计信息,对应参数-remove; (2) 域符号映射和全局、局部符号及生成符号映射统计信息,对应参数 -symbol; (3) 映射文件的信息图,对应参数-map,该信息中包含映像文件中的每个加载 域、运行域和输入段的大小和地址,如 2-11 图、2-12 图所示:
图 2-19
经 过 该 函 数 处 理 得 : r0=0x2000 0098,r1=0x2000 0698,r2=0x2000 0298,r3=0x2000 0298。最后用户栈顶被设置成 0x2000 0698,完成了堆栈的初始 化工作,程序返回到 rt_entry_main
三、 总结
最终函数终于跳转到我们的 main 函数执行我们写的代码。 总结启动文件的整个过程,分为如下: (1) 系统初始化,包括对中断向量表的重新映射; (2) 加载 RW 段; (3) ZI 段清零; (4) 初始化用户堆栈; (5) 初始化微库(具体干什么我也不知道,屏蔽此处函数好像也能正常运行) ; (6) 调用 main 函数。
Main 函数运行前的分析(原创,转载请注明出处)
一、 启动文件的介绍
在 MDK 的启动文件 startup_stm32f10x_md_vl 中,该文件分别定义了栈段、 堆段、存放中断向量表的数据段、还有一个代码段 大小为 0x400 的栈段定义如图 1-1:
图 1-1 大小为 0x200 的堆段如图 1-2:

STM32启动文件的选择及宏定义及芯片型号更改IAP总结

STM32启动文件的选择及宏定义及芯片型号更改IAP总结

STM32启动文件的选择及宏定义及芯片型号更改IAP总结对于STM32芯片,启动文件主要包括以下几个部分:1.启动向量表:包含中断服务程序的地址信息,用于系统初始化和中断处理等功能。

2.中断服务程序:对中断进行处理的代码,包括系统初始化时的复位中断和其他外部中断。

3.系统初始化代码:完成芯片的初始化工作,包括时钟配置、外设初始化、堆栈初始化等。

在选择启动文件时,需要注意以下几点:1.芯片型号匹配:确保所选择的启动文件与使用的芯片型号兼容,以确保正常的系统初始化和中断处理。

2. 如需使用外部存储器:如果需要使用外部存储器,如外部Flash 或RAM,需要选择支持外部存储器的启动文件。

3. 如需使用操作系统:如果需要在系统中运行操作系统,如FreeRTOS或uc/OS等,需要选择对应操作系统的启动文件。

在启动文件中,还涉及宏定义的使用。

宏定义是一种预处理指令,用于在编译时替换特定的文本字符串。

在启动文件中,通常会使用宏定义来配置系统的时钟频率、中断向量表的起始地址等参数。

在更改芯片型号时1.切换器件描述文件:在工程文件中,需要将所使用的芯片型号对应的器件描述文件进行切换。

这个文件通常在项目设置中进行配置。

2.修改启动文件:将原有的启动文件替换为新的芯片型号所对应的启动文件。

3.更新宏定义:在新的启动文件中,需要确认并更新宏定义,以确保系统的配置和参数正确。

4.复查外设配置:在启动文件中,有可能包含对外设的初始化代码。

在更改芯片型号后,需要复查外设的配置和初始化。

总结起来,选择合适的STM32启动文件,需要根据所使用的芯片型号来进行选择,并注意更改宏定义和复查外设配置。

这样才能确保系统正常初始化和中断处理的功能。

STM32启动代码分析、简化、实战

STM32启动代码分析、简化、实战

本文通过对STM32的官方固件库STM32F10x_StdPeriph_Lib_V3.5.0里的MDK启动文件分析,简化部分不需要的代码,并从繁杂的固件库里,精炼出一个类似于“hello world”的入门实战小程序——点亮一个LED。

该工程仅仅包含一个启动文件和一个有main函数的C文件。

本文初衷:不用固件库建立自己的工程!实验软件:Keil uVision4实验硬件:神舟IV号开发板芯片型号:STM32F107VCSTM32启动代码分析、简化、实战汇编基础:1.伪指令:EQU语法格式:名称EQU表达式{,类型}EQU伪指令用于为程序中的常量、标号等定义一个等效的字符名称,类似于C语言的#define。

其中EQU可以用“*”代替。

名称为EQU伪指令定义的字符名称,当表达式为32位的常量时,可以指定表达式的数据类型,可以有一下三种类型:CODE16、CODE32和DA TA2.伪指令:AREA语法格式:AREA段名{,属性1}{,属性2}……AREA命令指示汇编程序汇编一个新的代码段或数据段。

段是独立的、指定的、不可见的代码或数据块,它们由链接程序处理。

段名:可以为段选择任何段名。

但是,以一个数字开始的名称必须包含在竖杠号内,否则会产生一个缺失段名错误。

例如,|1_DataArea|。

有些名称是习惯性的名称。

例如:|.text|用于表示由C编译程序产生的代码段,或用于以某种方式与C库关联的代码段。

属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。

常用的属性如下:——CODE属性:用于定义代码段,默认为READONLY。

——DA TA属性:用于定义数据段,默认为READWRITE。

——READONLY属性:指定本段为只读,代码段默认为READONLY。

——READWRITE属性:指定本段为可读可写,数据段的默认属性为READWRITE。

——ALIGN属性:使用方式为ALIGN表达式。

一文了解STM32启动过程

一文了解STM32启动过程

一文了解STM32启动过程1 概述说明每一款(芯片)的启动文件都值得去研究,因为它可是你的程序跑的最初一段路,不可以不知道。

通过了解启动文件,我们可以体会到处理器的架构、指令集、中断向量安排等内容,是非常值得玩味的。

(STM32)作为一款高端Cortex-M3系列(单片机),有必要了解它的启动文件。

打好基础,为以后优化程序,写出高质量的代码最准备。

本文以一个实际测试代码--START_(TE)ST为例进行阐述。

整体过程STM32整个启动过程是指从上电开始,一直到运行到main 函数之间的这段过程,步骤为(以使用微库为例):①上电后(硬件)设置SP、PC②设置系统(时钟)③软件设置SP④加载.data、.bss,并初始化栈区⑤跳转到C文件的main函数代码启动过程涉及的文件不仅包含startup_stm32f10x_hd.s,还涉及到了MDK自带的连接库文件entry.o、entry2.o、entry5.o、entry7.o 等(从生成的map文件可以看出来)。

2 程序在Flash上的存储结构在真正讲解启动过程之前,先要讲解程序下载到Flash上的结构和程序运行时(执行到main函数)时的S(RAM)数据结构。

程序在用户Flash上的结构如下图所示。

下图是通过阅读hex文件和在MDK下调试综合提炼出来的。

上图中:MSP初始值由编译器生成,是主堆栈的初始值。

初始化数据段是.data未初始化数据段是.bss.data和.bss是在__main里进行初始化的,对于(ARM)Com (pi)ler,__main主要执行以下函数:其中__scatterlo(ad)会对.data和.bss进行初始化。

加载数据段和初始化栈的参数加载数据段和初始化栈的参数分别有4个,这里只讲解加载数据段的参数,至于初始化栈的参数类似。

0x0800033c Flash上的数据段(初始化数据段和未初始化数据段)起始地址0x20000000加载到SRAM上的目的地址0x0000000c数据段的总大小0x080002f4调用函数_scatterload_copy需要说明的是初始化栈的函数-- 0x08000304与加载数据段的函数不一样,为_scatterload_zeroinit,它的目的就是将栈空间清零。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//DCD 与&与意义和作用相同。
//格式:{label} DCD expr{,expr}{,expr}......
//label: 内存块起始地址标号。
//expr: 常数表达式或程序中的标号
//内存分配字节数由 expr 个数决定
__Vectors
DCD __initial_sp
; Top of Stack
//定义一个数据段,按 8 字节对齐
//AREA: 伪指令用于定义一个代码段或数据段
//NOINIT:指定此数据段仅仅保留了内存单元
//而没有将各初始值写入内存单元
//或者将各个内存单元值初始化为 0
//READWRITE: 代表可读可写
//ALIGN: 对齐伪指令 ALIGN
//指令格式: ALIGN Num
;* <<< Use Configuration Wizard in Context Menu >>>
;******************************************************************************
*
; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING
DMA1_Channel5_IRQHandler ; DMA1 Channel 5
DMA1_Channel6_IRQHandler ; DMA1 Channel 6
DMA1_Channel7_IRQHandler ; DMA1 Channel 7
ADC1_2_IRQHandler
; ADC1 and ADC2
CAN1_TX_IRQHandler
; CAN1 TX
CAN1_RX0_IRQHandler
; CAN1 RX0
CAN1_RX1_IRQHandler
; CAN1 RX1
CAN1_SCE_IRQHandler
; CAN1 SCE
EXTI9_5_IRQHandler
; EXTI Line 9..5
TIM1_BRK_IRQHandler
: MCD Application Team
;* Version
: V3.3.0
;* Date
: 04/16/2010
;* Description
: STM32F10x Connectivity line devices vector table for RVMDK
;*
toolchain.
;*
This module performs:
; Flash
RCC_IRQHandler
; RCC
EXTI0_IRQHandler
; EXTI Line 0
EXTI1_IRQHandler
; EXTI Line 1
EXTI2_IRQHandler
; EXTI Line 2
EXTI3_IRQHandler
; EXTI Line 3
EXTI4_IRQHandler
; TIM1 Break
TIM1_UP_IRQHandler
; TIM1 Update
TIM1_TRG_COM_IRQHandler
; TIM1 Trigger and
DCD DCD DCD DCD DCD DCD DCD DCD DCD DCD DCD DCD DCD DCD
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
__heap_limit
//代表堆末尾地址的标号
PRESERVE8
//制定当前文件堆栈按照 8 字节对齐
THUMB
CHENGE 20100831 HEFEI Chenge625@
-2-
STM32F107 SCHWESER STUDY NOTES
//指示编译器为 THUMB 指令 //如果需要汇编器将插入位以保证对齐
//指令格式: ALIGN = Dat
//Num 必须是 2 的幂,如:2、4、8 和 16 等
//Dat 代表 2 的 Dat 次方运算,Dat=3 则 Num=8
//作用:数据段必须严格按照 Num 字节对齐
__heap_base
Heap_Mem
SPACE Heap_Size
//保留 Heap_Size=0x200 的堆空间
__initial_sp
//堆栈顶部地址标号
; <h> Heap Configuration ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ; </h>
Heap_Size
EQU 0x00000200
//定义堆空间大小为 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
EXPORT __Vectors_End //定义一个可以在其他文件中使用的全局标号代表中断地址结束
EXPORT __Vectors_Size //定义一个可以在其他文件中使用的全局标号代表中断地址空间
//DCD:分配一段内存单元,并用指令的数据初始化
//DCD 分配的内存需要字对齐
//一般可用来定义数据表格或其他常数
*
; Amount of memory (in bytes) allocated for Stack ; Tailor this value to your application needs ; <h> Stack Configuration ; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ; </h>
DIRECT,
; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS
ARISING FROM THE
; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
STM32F107 SCHWESER STUDY NOTES
;******************** (C) COPYRIGHT 2010 STMicroelectronics ********************
;* File Name
: startup_stm32f10x_cl.s
;* Author
Stack_Size
EQU 0x00000400//定义堆栈空间大小为 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
//定义一个数据段,按 8 字节对齐
CHENGE 20100831 HEFEI Chenge625@
-1-
STM32F107 SCHWESER STUDY NOTES
CODING
; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
;******************************************************************************
; 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
CUSTOMERS
; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM
TO SAVE TIME.
; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
//Num 必须是 2 的幂,如:2、4、8 和 16 等
//Dat 代表 2 的 Dat 次方运算,Dat=3 则 Num=8
//作用:数据段必须严格按照 Num 字节对齐
Stack_Mem
SPACE Stack_Size
//保留 Stack_Size=0x400 大小的堆栈空间
//分配连续 Stack_Size 字节的存储单元并初始化为 0
; EXTI Line 4
DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DMA1_Channel2_IRQHandler ; DMA1 Channel 2
DMA1_Channel3_IRQHandler ; DMA1 Channel 3
DMA1_Channel4_IRQHandler ; DMA1 Channel 4
;*
- Set the initial SP
;*
- Set the initial PC == Reset_Handler
相关文档
最新文档