解析 STM32 的启动过程

合集下载

解析STM32启动过程

解析STM32启动过程

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

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

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

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

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

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

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

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

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


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

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

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

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

STM32快速入门教程

STM32快速入门教程

STM32快速入门教程STM32是一种微控制器系列,由意法半导体(STMicroelectronics)公司推出。

它具有高性能、低功耗和丰富的外设功能,非常适合用于各种嵌入式应用。

本文将介绍STM32的快速入门教程,帮助读者快速上手使用STM32进行开发。

准备好硬件和软件环境后,我们可以开始编写程序了。

首先,我们需要创建一个新工程。

在Keil中,选择“Project”->“New uVision Project”,然后选择STM32的型号和储存路径。

在STM32CubeIDE中,选择“File”->“New”->“STM32 Project”,然后按照向导创建新工程。

接下来,我们需要配置工程的设置。

包括选择编译器、指定目标芯片型号、选择运行频率等。

在Keil中,选择“Options”->“Device”,然后选择目标芯片型号。

在STM32CubeIDE中,选择“Project”->“Properties”,然后选择目标芯片型号和运行频率。

配置完成后,我们需要编写代码。

在Keil中,选择“Project”->“Add New Item”,然后选择一个空白文件。

在STM32CubeIDE中,选择“File”->“New”->“Source File”,然后输入文件名。

编写代码时,我们可以使用STM32固件库提供的函数库,简化了底层驱动的编写。

编写代码的时候,我们需要定义引脚的用途和功能。

在Keil中,选择“Project”->“Manage”->“Board Selector”,然后选择目标芯片和功能。

在STM32CubeIDE中,选择“Pinout & Configuration”,然后选择功能和引脚。

接下来,我们可以测试编写的代码了。

我们可以使用串口输出、LED 闪烁等方式进行测试。

在Keil中,选择“View”->“Serial Window”,然后选择波特率和串口号。

STM32-bootloader流程解析

STM32-bootloader流程解析

STM32 bootloader 流程解析stm32在内部有硬件bootloader,但那是在生产烧录时使用的。

stm32在flash开头的4K程序空间是可以设置成防擦除的,是天生的bootloader存放区。

我的思想是在开头的4K空间(0x8000000-0x8000FFF)放置一个独立程序,主程序编译地址放在0x8001000后端。

上电时,bootloader程序先判断是否满足升级条件(IO电平判断),然后选择是循环等待升级,或者直接跳转到主程序区。

现给出流程如下,大家可交流探讨。

BOOT流程.JPG (11.13 KB)boot程序流程程序流程详细.JPG (35.79 KB)程序详细流程说的太过简单笼统了,经过一个来星期的调试,总算完成了这个东西..调试中发现一个问题,在已经开始执行BOOT程序之后,再进行切换到应用程序时,有些中断会出问题.而在BOOT启动时(所有软硬件操作都没开始)马上切换到应用程序就不会出问题.一直没找到怎么解决.最后只好把IAP程序和应用程序合在一起使用,在上电后的短时间内执行IAP,无响应就进入应用程序,没有所谓的BOOT区了.stm32在flash开头的4K程序空间是可以设置成防擦除的,是天生的bootloader存放区。

我的思想是在开头的4K空间(0x8000000-0x8000FFF)放置一个独立程序,主程序编译地址放在0x8001000后端。

楼主所说的stm32在flash开头的4K程序空间是可以设置成防擦除的,如何设置?而且主程序编译地址放在0x8001000后端,如何实现啊,望指教!!!我最近也在做类似的事情,但是在跳转到功能程序出问题了。

功能程序应该如何设置?如果一个程序不从默认的Flash地址开始存储,需要设置哪些东西,在Keil 开发环境中。

谢谢!。

STM32启动文件:startup_stm32f10x_hd.s等启动文件的简单描述

STM32启动文件:startup_stm32f10x_hd.s等启动文件的简单描述

STM32启动⽂件:startup_stm32f10x_hd.s等启动⽂件的简单描述在官⽅的库⽂件中,分别有如下⽂件:startup│││├─arm││││ startup_stm32f10x_cl.s││││ startup_stm32f10x_hd.s││││ startup_stm32f10x_hd_vl.s││││ startup_stm32f10x_ld.s││││ startup_stm32f10x_ld_vl.s││││ startup_stm32f10x_md.s││││ startup_stm32f10x_md_vl.s││││ startup_stm32f10x_xl.sR8T6使⽤的MD.s,中容量的arm芯⽚,⼤致的启动内容如下:初始化堆栈指针 SP初始化程序计数器指针 PC设置堆、栈的⼤⼩设置中断向量表的⼊⼝地址配置外部 SRAM 作为数据存储器调⽤ SystemInit() 函数配置 STM32 的系统时钟设置 C 库的分⽀⼊⼝ "__main” (最终⽤来调⽤ main 函数)startup_stm32f10x_hd.s 是⼀个启动⽂件,⾥⾯是使⽤汇编语⾔写好的基本程序,当STM32 芯⽚上电启动的时候,受限会执⾏这⾥的汇编程序,从⽽建⽴起来C 语⾔的运⾏环境,所以我们把这个⽂件称为启动⽂件。

改⽂件使⽤的汇编指令是 Cortex-M3 内核⽀持的指令,可以参考《Cortex-M3 权威指南中⽂》内指令集章节。

startup_stm32f10x_hd.s ⽂件是由ST官⽅提供的,该⽂件可以从KEIL5 安装⽬录中找到,也可以从STV3.5库⾥⾯找到,找到该⽂件后吧启动⽂件添加到⼯程⾥⾯即可。

不同型号的芯⽚以及不同编译环境使⽤的汇编⽂件是不⼀样的,但功能相同。

在keilMDK4中只有STM32F10x.s⽂件。

在<<STM32不完全⼿册⾥⾯>>,所有的例程都采⽤了⼀个叫STM32F10x.s的启动⽂件,⾥⾯定义了STM32的堆栈⼤⼩以及各种中断的名字及⼊⼝函数名称,还有启动相关的汇编代码。

stm32启动文件详解及SystemInit函数分析

stm32启动文件详解及SystemInit函数分析
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
;__main函数由编译器生成,负责初始化栈、堆等,并在最后跳转到用户自定义的main()函数,来到C的世界。
Stack_Size EQU 0x00000400 ;//定义堆栈大小
AREA STACK, NOINIT, READWRITE, ALIGN=3 ;//定义一个数据段 按8字节对齐 ;AREA 伪指令用于定义一个代码段或数据段 NOINIT:指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个内存单元值初始化为0
;链接器检查要求堆栈八字节对齐的任何代码是否仅由保持堆栈八字节对齐的代码直接或间接地调用。
PRESERVE8 ;//指示编译器8字节对齐
Байду номын сангаас THUMB ;//指示编译器以后的指令为THUMB指令
;中断向量表定义
; Vector Table Mapped to Address 0 at Reset
;中断函数仅仅实现了Reset_Handler,其他要么是死循环,要么仅仅定义了函数名称
;STM32被设置为从内部FLASH启动时(这也是最常见的一种情况),当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的启动过程可以分为硬件启动过程和软件启动过程。

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

stm32单片机的工作原理

stm32单片机的工作原理

stm32单片机的工作原理STM32单片机是一款广泛应用于嵌入式系统的微控制器,具有高性能、低功耗和丰富的外设资源等特点。

本文将详细介绍STM32单片机的工作原理,并对其各个部分进行解析。

一、概述STM32单片机是由意法半导体(STMicroelectronics)公司开发的一款32位微控制器。

它采用了先进的ARM Cortex-M内核,非常适用于嵌入式控制应用。

STM32单片机具有丰富的外设资源,如通用IO口、定时器、通信接口(如USART、SPI、I2C)等,可以满足不同应用的需求。

二、内核结构STM32单片机的内核结构采用了Harvard体系结构,主要由处理器核、存储器和总线组成。

处理器核负责指令执行和数据处理,存储器用于存储程序代码和数据,总线则用于连接处理器核和存储器。

1. 处理器核STM32单片机的处理器核采用了ARM Cortex-M系列的核心。

它具有强大的计算能力和高效的指令执行速度,支持多种指令集和调试接口,能够满足不同应用的需求。

处理器核负责执行存储在存储器中的程序代码,控制外设的操作,并根据指令完成相应的数据处理。

2. 存储器STM32单片机的存储器分为Flash存储器和RAM存储器两部分。

Flash存储器用于存储程序代码和常量数据,可在电源关闭后保持数据的不变性。

RAM存储器用于存储临时的变量和数据,速度较快但断电后数据会消失。

3. 总线STM32单片机的总线用于连接处理器核和存储器,同时也用于连接外设。

总线分为数据总线、地址总线和控制总线三部分。

数据总线用于传输数据,地址总线用于指定存储器或外设的地址,控制总线用于传递读写和控制信号。

三、外设资源STM32单片机具有丰富的外设资源,可以满足各种嵌入式控制应用的需求。

这些外设包括通用IO口、定时器、通信接口等。

1. 通用IO口通用IO口是STM32单片机最常用的外设之一,它可以配置为输入或输出,用于连接外部设备或传感器。

通用IO口的数量和类型取决于具体型号,一般都有多个引脚可供使用。

解析STM32的启动过程

解析STM32的启动过程

解析STM32的启动过程当前的嵌入式应用程序开发过程里,并且C语言成为了绝大部分场合的最佳选择。

如此一来main函数似乎成为了理所当然的起点——因为C程序往往从main函数开始执行。

但一个经常会被忽略的问题是:微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?很显然微控制器无法从硬件上定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,这样一来main函数的入口地址在微控制器的内部存储空间中不再是绝对不变的。

相信读者都可以回答这个问题,答案也许大同小异,但肯定都有个关键词,叫“启动文件”,用英文单词来描述是“Bootloader”。

无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从“复位”到“开始执行main函数”中间这段时间(称为启动过程)所必须进行的工作。

最为常见的51,AVR或MSP430等微控制器当然也有对应启动文件,但开发环境往往自动完整地提供了这个启动文件,不需要开发人员再行干预启动过程,只需要从main函数开始进行应用程序的设计即可。

话题转到STM32微控制器,无论是keiluvision4还是IAR EWARM开发环境,ST公司都提供了现成的直接可用的启动文件,程序开发人员可以直接引用启动文件后直接进行C应用程序的开发。

这样能大大减小开发人员从其它微控制器平台跳转至STM32平台,也降低了适应STM32微控制器的难度(对于上一代ARM 的当家花旦ARM9,启动文件往往是第一道难啃却又无法逾越的坎)。

相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方式有了比较大的变化。

ARM7/ARM9内核的控制器在复位后,CPU会从存储空间的绝对地址0x000000取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地址为0x000000(PC = 0x000000)同时中断向量表的位置并不是固定的。

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

解析STM32的启动过程当前的嵌入式应用程序开发过程里,并且C语言成为了绝大部分场合的最佳选择。

如此一来main函数似乎成为了理所当然的起点——因为C程序往往从main函数开始执行。

但一个经常会被忽略的问题是:微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?很显然微控制器无法从硬件上定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,这样一来main函数的入口地址在微控制器的内部存储空间中不再是绝对不变的。

相信读者都可以回答这个问题,答案也许大同小异,但肯定都有个关键词,叫“启动文件”,用英文单词来描述是“Bootloader”。

无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从“复位”到“开始执行main函数”中间这段时间(称为启动过程)所必须进行的工作。

最为常见的51,AVR或MSP430等微控制器当然也有对应启动文件,但开发环境往往自动完整地提供了这个启动文件,不需要开发人员再行干预启动过程,只需要从main函数开始进行应用程序的设计即可。

话题转到STM32微控制器,无论是keil uvision4还是IAR EWARM开发环境,ST公司都提供了现成的直接可用的启动文件,程序开发人员可以直接引用启动文件后直接进行C应用程序的开发。

这样能大大减小开发人员从其它微控制器平台跳转至STM32平台,也降低了适应STM32微控制器的难度(对于上一代ARM的当家花旦ARM9,启动文件往往是第一道难啃却又无法逾越的坎)。

相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方式有了比较大的变化。

ARM7/ARM9内核的控制器在复位后,CPU会从存储空间的绝对地址0x000000取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地址为0x000000(PC = 0x000000)同时中断向量表的位置并不是固定的。

而Cortex-M3内核则正好相反,有3种情况:1、通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x2000000,同时复位后PC指针位于0x2000000处;2、通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x8000000,同时复位后PC指针位于0x8000000处;3、通过boot引脚设置可以将中断向量表定位于内置Bootloader区,本文不对这种情况做论述;而Cortex-M3内核规定,起始地址必须存放堆顶指针,而第二个地址则必须存放复位中断入口向量地址,这样在Cortex-M3内核复位后,会自动从起始地址的下一个32位空间取出复位中断入口向量,跳转执行复位中断服务程序。

对比ARM7/ARM9内核,Cortex-M3内核则是固定了中断向量表的位置而起始地址是可变化的。

有了上述准备只是后,下面以STM32的2.02固件库提供的启动文件“stm32f10x_vector.s”为模板,对STM32的启动过程做一个简要而全面的解析。

程序清单一:;文件“stm32f10x_vector.s”,其中注释为行号DATA_IN_ExtSRAM EQU 0 ;1Stack_Size EQU 0x00000400 ;2AREA STACK, NOINIT, READWRITE, ALIGN = 3 ;3Stack_Mem SPACE Stack_Size ;4__initial_sp ;5Heap_Size EQU 0x00000400 ;6AREA HEAP, NOINIT, READWRITE, ALIGN = 3 ;7__heap_base ;8 Heap_Mem SPACE Heap_Size ;9 __heap_limit ;10 THUMB ;11 PRESERVE8 ;12 IMPORT NMIException ;13 IMPORT HardFaultException ;14 IMPORT MemManageException ;15 IMPORT BusFaultException ;16 IMPORT UsageFaultException ;17 IMPORT SVCHandler ;18 IMPORT DebugMonitor ;19 IMPORT PendSVC ;20 IMPORT SysTickHandler ;21 IMPORT WWDG_IRQHandler ;22 IMPORT PVD_IRQHandler ;23 IMPORT TAMPER_IRQHandler ;24 IMPORT RTC_IRQHandler ;25 IMPORT FLASH_IRQHandler ;26 IMPORT RCC_IRQHandler ;27 IMPORT EXTI0_IRQHandler ;28 IMPORT EXTI1_IRQHandler ;29 IMPORT EXTI2_IRQHandler ;30 IMPORT EXTI3_IRQHandler ;31 IMPORT EXTI4_IRQHandler ;32 IMPORT DMA1_Channel1_IRQHandler ;33 IMPORT DMA1_Channel2_IRQHandler ;34 IMPORT DMA1_Channel3_IRQHandler ;35 IMPORT DMA1_Channel4_IRQHandler ;36 IMPORT DMA1_Channel5_IRQHandler ;37 IMPORT DMA1_Channel6_IRQHandler ;38 IMPORT DMA1_Channel7_IRQHandler ;39 IMPORT ADC1_2_IRQHandler ;40 IMPORT USB_HP_CAN_TX_IRQHandler ;41 IMPORT USB_LP_CAN_RX0_IRQHandler ;42 IMPORT CAN_RX1_IRQHandler ;43 IMPORT CAN_SCE_IRQHandler ;44 IMPORT EXTI9_5_IRQHandler ;45 IMPORT TIM1_BRK_IRQHandler ;46 IMPORT TIM1_UP_IRQHandler ;47 IMPORT TIM1_TRG_COM_IRQHandler ;48 IMPORT TIM1_CC_IRQHandler ;49 IMPORT TIM2_IRQHandler ;50 IMPORT TIM3_IRQHandler ;51IMPORT TIM4_IRQHandler ;52 IMPORT I2C1_EV_IRQHandler ;53 IMPORT I2C1_ER_IRQHandler ;54 IMPORT I2C2_EV_IRQHandler ;55 IMPORT I2C2_ER_IRQHandler ;56 IMPORT SPI1_IRQHandler ;57 IMPORT SPI2_IRQHandler ;58 IMPORT USART1_IRQHandler ;59 IMPORT USART2_IRQHandler ;60 IMPORT USART3_IRQHandler ;61 IMPORT EXTI15_10_IRQHandler ;62 IMPORT RTCAlarm_IRQHandler ;63 IMPORT USBWakeUp_IRQHandler ;64 IMPORT TIM8_BRK_IRQHandler ;65 IMPORT TIM8_UP_IRQHandler ;66 IMPORT TIM8_TRG_COM_IRQHandler ;67 IMPORT TIM8_CC_IRQHandler ;68 IMPORT ADC3_IRQHandler ;69 IMPORT FSMC_IRQHandler ;70 IMPORT SDIO_IRQHandler ;71 IMPORT TIM5_IRQHandler ;72 IMPORT SPI3_IRQHandler ;73 IMPORT UART4_IRQHandler ;74 IMPORT UART5_IRQHandler ;75 IMPORT TIM6_IRQHandler ;76 IMPORT TIM7_IRQHandler ;77 IMPORT DMA2_Channel1_IRQHandler ;78 IMPORT DMA2_Channel2_IRQHandler ;79 IMPORT DMA2_Channel3_IRQHandler ;80 IMPORT DMA2_Channel4_5_IRQHandler ;81 AREA RESET, DATA, READONLY ;82 EXPORT __Vectors ;83 __Vectors ;84 DCD __initial_sp ;85 DCD Reset_Handler ;86 DCD NMIException ;87 DCD HardFaultException ;88 DCD MemManageException ;89 DCD BusFaultException ;90 DCD UsageFaultException ;91 DCD 0 ;92 DCD 0 ;93 DCD 0 ;94 DCD 0 ;95DCD SVCHandler ;96 DCD DebugMonitor ;97 DCD 0 ;98 DCD PendSVC ;99 DCD SysTickHandler ;100 DCD WWDG_IRQHandler ;101 DCD PVD_IRQHandler ;102 DCD TAMPER_IRQHandler ;103 DCD RTC_IRQHandler ;104 DCD FLASH_IRQHandler ;105 DCD RCC_IRQHandler ;106 DCD EXTI0_IRQHandler ;107 DCD EXTI1_IRQHandler ;108 DCD EXTI2_IRQHandler ;109 DCD EXTI3_IRQHandler ;110 DCD EXTI4_IRQHandler ;111 DCD DMA1_Channel1_IRQHandler ;112 DCD DMA1_Channel2_IRQHandler ;113 DCD DMA1_Channel3_IRQHandler ;114 DCD DMA1_Channel4_IRQHandler ;115 DCD DMA1_Channel5_IRQHandler ;116 DCD DMA1_Channel6_IRQHandler ;117 DCD DMA1_Channel7_IRQHandler ;118 DCD ADC1_2_IRQHandler ;119 DCD USB_HP_CAN_TX_IRQHandler ;120 DCD USB_LP_CAN_RX0_IRQHandler ;121 DCD CAN_RX1_IRQHandler ;122 DCD CAN_SCE_IRQHandler ;123 DCD EXTI9_5_IRQHandler ;124 DCD TIM1_BRK_IRQHandler ;125 DCD TIM1_UP_IRQHandler ;126 DCD TIM1_TRG_COM_IRQHandler ;127 DCD TIM1_CC_IRQHandler ;128 DCD TIM2_IRQHandler ;129 DCD TIM3_IRQHandler ;130 DCD TIM4_IRQHandler ;131 DCD I2C1_EV_IRQHandler ;132 DCD I2C1_ER_IRQHandler ;133 DCD I2C2_EV_IRQHandler ;134 DCD I2C2_ER_IRQHandler ;135 DCD SPI1_IRQHandler ;136 DCD SPI2_IRQHandler ;137 DCD USART1_IRQHandler ;138 DCD USART2_IRQHandler ;139DCD USART3_IRQHandler ;140 DCD EXTI15_10_IRQHandler ;141 DCD RTCAlarm_IRQHandler ;142 DCD USBWakeUp_IRQHandler ;143 DCD TIM8_BRK_IRQHandler ;144 DCD TIM8_UP_IRQHandler ;145 DCD TIM8_TRG_COM_IRQHandler ;146 DCD TIM8_CC_IRQHandler ;147 DCD ADC3_IRQHandler ;148 DCD FSMC_IRQHandler ;149 DCD SDIO_IRQHandler ;150 DCD TIM5_IRQHandler ;151 DCD SPI3_IRQHandler ;152 DCD UART4_IRQHandler ;153 DCD UART5_IRQHandler ;154 DCD TIM6_IRQHandler ;155 DCD TIM7_IRQHandler ;156 DCD DMA2_Channel1_IRQHandler ;157 DCD DMA2_Channel2_IRQHandler ;158 DCD DMA2_Channel3_IRQHandler ;159 DCD DMA2_Channel4_5_IRQHandler ;160 AREA |.text|, CODE, READONLY ;161 Reset_Handler PROC ;162 EXPORT Reset_Handler ;163 IF DATA_IN_ExtSRAM == 1 ;164 LDR R0,= 0x00000114 ;165 LDR R1,= 0x40021014 ;166 STR R0,[R1] ;167 LDR R0,= 0x000001E0 ;168 LDR R1,= 0x40021018 ;169 STR R0,[R1] ;170 LDR R0,= 0x44BB44BB ;171 LDR R1,= 0x40011400 ;172 STR R0,[R1] ;173 LDR R0,= 0xBBBBBBBB ;174 LDR R1,= 0x40011404 ;175 STR R0,[R1] ;176 LDR R0,= 0xB44444BB ;177 LDR R1,= 0x40011800 ;178 STR R0,[R1] ;179 LDR R0,= 0xBBBBBBBB ;180 LDR R1,= 0x40011804 ;181 STR R0,[R1] ;182 LDR R0,= 0x44BBBBBB ;183LDR R1,= 0x40011C00 ;184STR R0,[R1] ;185LDR R0,= 0xBBBB4444 ;186LDR R1,= 0x40011C04 ;187STR R0,[R1] ;188LDR R0,= 0x44BBBBBB ;189LDR R1,= 0x40012000 ;190STR R0,[R1] ;191LDR R0,= 0x44444B44 ;192LDR R1,= 0x40012004 ;193STR R0,[R1] ;194LDR R0,= 0x00001011 ;195LDR R1,= 0xA0000010 ;196STR R0,[R1] ;197LDR R0,= 0x00000200 ;198LDR R1,= 0xA0000014 ;199STR R0,[R1] ;200ENDIF ;201IMPORT __main ;202LDR R0, =__main ;203BX R0 ;204ENDP ;205ALIGN ;206IF :DEF:__MICROLIB ;207EXPORT __initial_sp ;208EXPORT __heap_base ;209EXPORT __heap_limit ;210ELSE ;211IMPORT __use_two_region_memory ;212EXPORT __user_initial_stackheap ;213__user_initial_stackheap ;214LDR R0, = Heap_Mem ;215LDR R1, = (Stack_Mem + Stack_Size) ;216LDR R2, = (Heap_Mem + Heap_Size) ;217LDR R3, = Stack_Mem ;218BX LR ;219ALIGN ;220ENDIF ;221END ;222ENDIF ;223END ;224如程序清单一,STM32的启动代码一共224行,使用了汇编语言编写,这其中的主要原因下文将会给出交代。

相关文档
最新文档