解析 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)同时中断向量表的位置并不是固定的。

STM32 boot0 boot1的启动方式

STM32 boot0 boot1的启动方式

STM32 三种启动模式对应的存储介质是芯片内置的,它们分别是:1.用户闪存 =芯片内置的Flash2.SRAM=芯片内置的RAM区,就是内存了。

3.系统存储器=芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段bootloader,就是同时的ISP升级程序,这个区域的内容在芯片出现后没有人能够修改或拆除,即它是一个ROM。

在每个STM32 的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时电平状态决定了芯片复位后从哪个区域开始执行程序:BOOT1=X ,BOOT0=0 :从用户闪存(flash)启动,这是正常模式,较多情况下使用这种模式。

BOOT1=1, BOOT0=1 :从内置SRAM(内存)启动,这种模式可以用于调试。

BOOT1=0 ,BOOT0=1 :从系统存储器启动,这种可以用于调试。

使用注意:(1)一般情况下如果我们想用用串口下载代码,则必须配置BOOT0为 1, BOOT1为 0,而如果想让 STM32 一按复位键就开始跑代码,则需要配置 BOOT0为0,BOOT1随便设。

(2)一般不使用内置SRAM启动(BOOT1=1 BOOT0=1),因为SRAM 掉电后数据就丢失。

多数情况下SRAM只是在调试时使用,也可以做其他一些用途。

如做故障的局部诊断,写一段小程序加载到SRAM中诊断板上的其他电路,或用此方法读写板上的Flash或EEPROM等。

还可以通过这种方法解除内部Flash的读写保护,当然解除读写保护的同时Flash的内容也被自动清除,以防止恶意的软件拷贝。

STM32引脚状态决定了用哪种方式启动。

Main Flash memory (flash启动) :是STM32内置的flash,一般我们使用JTAG或者SWD模式下载时,就是下载到这里面,启动后也直接从这启动程序。

System memory 从系统存储启动:这种模式启动的程序功能是有厂家设,一般很少使用,一般来说STM32在出厂是内置了一段bootloader,也就是我们常说的ISP程序,这是一块ROM,出厂后我发修改,这种启动模式,是为了从串口下载程序,因为厂家提供BootLoader中,可以通过bootloader将程序下载到系统Flash中。

简述stm32单片机开发过程 -回复

简述stm32单片机开发过程 -回复

简述stm32单片机开发过程-回复STM32单片机是由意法半导体(STMicroelectronics)公司推出的一款强大的嵌入式系统开发平台。

它基于ARM Cortex-M系列内核,并结合了丰富的外设和强大的性能。

在工业控制、智能家居、物联网、医疗设备等领域中得到了广泛的应用。

本文将以STM32单片机开发过程为主题,一步一步详细介绍。

第一步:选型在开始STM32单片机开发之前,首先要进行选型。

STMicroelectronics 公司提供了全系列的STM32单片机,有不同的系列、型号和封装可供选择。

选型时需要考虑项目的需求,比如处理器性能、外设接口、功耗要求、封装类型等。

第二步:开发环境搭建搭建合适的开发环境对于STM32单片机开发至关重要。

首先,需要选择合适的集成开发环境(IDE),如Keil MDK、IAR Embedded Workbench 等。

其次,需要安装相关的驱动和软件包,包括STM32CubeMX和HAL 库。

STM32CubeMX是STMicroelectronics公司提供的一个图形化工具,用于生成初始化代码、配置外设和引脚映射。

它大大简化了STM32单片机的开发流程,并提供了丰富的代码模板和示例。

HAL库是STM32单片机的硬件抽象层,提供了一套统一的API接口,方便开发者操作硬件。

通过配置STM32CubeMX并生成初始化代码,可以使用HAL库快速开始项目的开发。

第三步:项目配置在选型和开发环境搭建完成后,需要进行项目配置。

打开STM32CubeMX,选择对应的单片机型号,并配置外设和引脚映射。

可以根据项目需求选择所需的外设,比如GPIO、UART、SPI、I2C等。

同时,可以在STM32CubeMX中设置时钟源、系统时钟频率、中断优先级等。

配置完成后,点击"Generate code"按钮,STM32CubeMX将自动生成初始化代码,并生成相应的工程文件。

STM32 的三种不同启动模式

STM32 的三种不同启动模式

STM32 的三种不同启动模式STM32 三种启动模式对应的存储介质均是芯片内置的,它们是:1. 用户闪存:芯片内置的Flash。

2. SRAM:芯片内置的RAM 区,就是内存啦。

3. 系统存储器:芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP 程序。

这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM 区。

在每个STM32 的芯片上都有两个管脚BOOT0 和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序,见下表:BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。

BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂家设置。

BOOT1=1 BOOT0=1 从内置SRAM 启动,这种模式可以用于调试。

要注意的是,一般不使用内置SRAM 启动(BOOT1=1 BOOT0=1),因为SRAM 掉电后数据就丢失。

多数情况下SRAM 只是在调试时使用,也可以做其他一些用途。

如做故障的局部诊断,写一段小程序加载到SRAM 中诊断板上的其他电路,或用此方法读写板上的Flash 或EEPROM 等。

还可以通过这种方法解除内部Flash 的读写保护,当然解除读写保护的同时Flash 的内容也被自动清除,以防止恶意的软件拷贝。

STM32 PB2(BOOT1)使用注意由于STM32 PB2 脚是复用引脚,而且该复用功能是用于启动选择,使用时就要小心了。

-------------------------------------------------------------------------BOOT1 BOOT0 启动模式说明X 0 用户闪存存储器用户闪存存储器被选为启动区域0 1 系统存储器系统存储器被选为启动区域(进入ISP 模式)1 1 内嵌SRAM 内嵌SRAM 被选为启动区域-------------------------------- -----------------------------------------一般来讲我们正常使用是模式1(用户闪存存储。

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

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

1/6/afeibfp/archive/2013/01/08/2850408.html <2013年1月>日一二三四五六303112345678910111213141516171819202122232425262728293031123456789昵称:afeibfp 园龄:2年5个月粉丝:0关注:0+加关注搜索找找看 谷歌搜索常用链接我的随笔我的评论我的参与最新评论我的标签更多链接我的标签51单片机(2)多字节除法(2)汇编(2)随笔分类(2)转发(2)随笔档案(16)2013年1月 (14)2011年9月 (2)最新评论1. Re:014:针对mdk 中STM32程序无法使用printf ,产生停留BEAB BKPT 0xAB 处问题的解决(转)不点那个MiclroLIB 就行了--blakeliu阅读排行榜1. 001:无符号双字节除以单字节(51单片机,汇编源码)(418)2. 004:STM32启动文件详解及SystemInit 函数分析(转)(389)3. 014:针对mdk 中STM32程序无法使用printf ,产生停留BE AB BKPT 0xAB 处问题的解决(转)(312)4. 010:请教STM32用JLINK V8 SWD 输出调试信息到ITM V iewer 的问题(转)(208)5. 009:semihost/ITM 机制浅析以及使用JLINK 通过ITM 调试stm32单片机(转)(190)评论排行榜1. 014:针对mdk 中STM32程序无法使用printf ,产生停留BE AB BKPT 0xAB 处问题的解决(转)(1)2. 013:ADS semihosting 与硬件重定向(转)(0)3. 012:Keil 调试技术(转)(0)4. 011:Nuvoton(新唐) Cort ex M0 使用semihost 输入输出办法(转)(0)5. 010:请教STM32用JLINK V8 SWD 输出调试信息到ITM V iewer 的问题(转)(0)推荐排行榜博客园首页新随笔联系管理订阅 随笔- 16 文章- 0 评论- 1afeibfp004:STM32启动文件详解及SystemInit 函数分析(转)1 ;先在R A M 中分配系统使用的栈,R A M 的起始地址为0x 2000_00002 ;然后在R A M 中分配变量使用的堆3 ;然后在C O D E 区(f l a s h )分配中断向量表,f l a s h 的起始地址为0x 0800_0000,该中断向量表就从这个起始地址开始分配4 ;分配完成后,再定义和实现相应的中断函数,5 ;所有的中断函数全部带有[w e a k ]特性,即弱定义,如果编译器发现在别处文件中定义了同名函数,在链接时用别处的地址进行链接。

stm32单片机工作原理

stm32单片机工作原理

stm32单片机工作原理STM32单片机是一种广泛应用于嵌入式系统中的微控制器,它具有强大的功能和灵活的应用性。

要深入了解STM32单片机的工作原理,首先需要了解其基本结构和工作原理。

STM32单片机的工作原理主要包括以下几个方面:首先,STM32单片机的基本结构。

它由内核、存储器、外设和时钟系统等部分组成。

其中,内核是单片机的核心部分,负责控制整个系统的运行;存储器用于存储程序代码和数据;外设包括各种输入输出接口,用于与外部设备进行通信;时钟系统则提供时钟信号,控制单片机的时序和节拍。

其次,STM32单片机的工作原理。

当单片机上电后,时钟系统开始工作,为单片机提供时钟信号。

内核根据存储器中的程序代码,按照一定的时序和节拍,控制外设的工作,从而实现各种功能。

例如,当需要从外部设备读取数据时,内核会通过外设接口发出读取指令,外设将数据传输到存储器中;当需要向外部设备发送数据时,内核会通过外设接口发出写入指令,外设将存储器中的数据传输到外部设备中。

另外,STM32单片机的应用领域非常广泛,包括工业控制、汽车电子、消费电子、通信设备等。

在这些领域中,STM32单片机可以实现各种复杂的功能,如数据采集、信号处理、通信控制等。

其工作原理在不同的应用场景中有着不同的体现,但基本的工作原理是相通的。

总的来说,STM32单片机的工作原理是基于其内核、存储器、外设和时钟系统等部分的协同工作,通过时序和节拍的控制,实现各种功能。

它在嵌入式系统中有着重要的地位和作用,是现代电子技术中不可或缺的一部分。

深入了解STM32单片机的工作原理,有助于我们更好地应用它,发挥其最大的潜力,为各种应用场景提供更加稳定和可靠的解决方案。

简述stm32单片机开发过程

简述stm32单片机开发过程

简述stm32单片机开发过程摘要:1.STM32单片机简介2.STM32单片机开发过程概述3.开发流程详细步骤4.总结与展望正文:【1.STM32单片机简介】STM32单片机是ST(STMicroelectronics)公司推出的一款基于ARM Cortex-M内核的微控制器。

它具有高性能、低功耗、多功能、易扩展等特点,广泛应用于嵌入式领域。

【2.STM32单片机开发过程概述】STM32单片机的开发过程主要包括以下几个阶段:硬件设计、软件设计、系统集成与调试。

在这几个阶段中,硬件设计和软件设计是核心部分,系统集成与调试则是确保整个项目成功的关键环节。

【3.开发流程详细步骤】1.硬件设计:首先,根据项目需求选择合适的STM32单片机型号。

然后,设计电路原理图,包括单片机、外设(如传感器、显示器等)、接口等。

最后,进行PCB设计,确保电路可靠性。

2.软件设计:在硬件设计的基础上,编写软件代码。

主要包括:初始化模块、数据采集模块、数据处理模块、控制模块、通信模块等。

为了提高代码的可读性和可维护性,建议采用模块化编程。

3.系统集成与调试:将硬件和软件组合在一起,进行系统集成。

在此过程中,需要关注硬件接口的匹配性和软件功能的实现。

调试阶段主要包括:仿真调试、实际测试等。

通过不断优化,确保整个系统的稳定性和可靠性。

【4.总结与展望】STM32单片机开发过程涉及多个方面,需要软硬件工程师密切合作。

随着技术的不断进步,开发工具和技术的不断完善,STM32单片机的应用领域将更加广泛。

对于开发者来说,掌握STM32单片机的开发技巧,将有助于提高工作效率,实现更多创新项目。

stm32f103c8t6启动选择电路工作原理

stm32f103c8t6启动选择电路工作原理

stm32f103c8t6启动选择电路工作原理English:The STM32F103C8T6 microcontroller can be boot selected by using an external circuit that connects BOOT0 and BOOT1 pins to the ground or the supply voltage. When BOOT0 is high and BOOT1 is low, the microcontroller will start from the main Flash memory. If BOOT0 is high and BOOT1 is high, the microcontroller will start from the System memory. And if BOOT0 is low, the microcontroller will start from the embedded bootloader, which allows for updating the firmware via serial communication. This boot selection circuit allows the microcontroller to be programmed or updated through different memory sources based on the configuration of the BOOT0 and BOOT1 pins.中文翻译:STM32F103C8T6微控制器可以通过使用外部电路连接BOOT0和BOOT1引脚至地或供电电压来进行引导选择。

当BOOT0为高电平且BOOT1为低电平时,微控制器将从主Flash存储器启动。

如果BOOT0为高电平且BOOT1为高电平,则微控制器将从系统存储器启动。

STM32启动代码详细分析

STM32启动代码详细分析

STM32启动代码详细分析最近需要学习iap的功能,因此离不开stm32的启动代码的分析,以前看了很多遍,都看不懂,读书百遍,其义⾃见,因此我有看了⼀遍,下⾯的⽂章,挺好的,因此转载:在上电复位后,我们都知道会先运⾏启动代码,但是启动代码到底使⼲什么⽤的呢?下⾯⼩弟给⼤家⼀⼀列出来。

1、初始化堆栈指针2、初始化 PC 指针3、初始化中断向量表4、配置系统时钟5、调⽤ C 库函数_main 初始化⽤户堆栈我们根据这以上的⼏个步骤⼀⼀进⾏详细的解析:1、栈的内存分配这段代码的意思是,开辟了⼀个栈,这个栈的⼤⼩是0x00000400也就是1KB的⼤⼩,名字为STACK,不初始化,可读可写,2^3=8字节对齐。

那么问题来了,那这个栈到底使⼲什么的呢?⼩弟相信⼤家在学习C语⾔的时候应该也是知道了,栈区保存的是局部变量,只是当时并没有深⼊研究它的⼤⼩问题。

那在这⾥⼩弟给⼤家详细讲解⼀下栈的作⽤:1、局部变量2、函数调⽤3、函数形参以上的这三种情况的开销都是使⽤我们的栈区的资源的。

所以啊!这⾥⼩弟给个位提个醒,千万不要把栈区当成⽆⽌境⼤⼩的哦!STM32可不⽐我们的电脑,没有那么多的空间可以给⼤伙挥霍,如果我们定义的局部变量过⼤可是会莫名其妙报错的。

温馨提⽰:请不要在写程序时,过度使⽤局部变量,会造成栈的益处,从⽽导致编译报错,如果在特殊情况下真的需要很⼤的栈区空间,只需来这⾥进⾏栈区⼤⼩的修改即可。

那么⼩弟再来给这个程序段⾥的汇编指令做⼀个详细的介绍Stack_Size EQU 0x00000400EQU:宏定义的伪指令,相当于等于,类似与 C 中的 define。

这句话的意思是,定义⼀个宏名Stack_Size这个宏代表0x00000400的意思,⽤我们C语⾔来表⽰就是#define Stack_Size 0x00000400AREA STACK, NOINIT, READWRITE, ALIGN=3AREA:告诉汇编器汇编⼀个新的代码段或者数据段。

stm32工作原理详解

stm32工作原理详解

stm32工作原理详解STM32是一种基于ARM Cortex-M内核的32位微控制器系列,由意法半导体(STMicroelectronics)公司生产。

它广泛应用于各种嵌入式系统设计,如工业自动化、消费类电子、汽车电子和医疗设备等。

STM32的工作原理主要涉及以下几个方面:1. 内核架构:STM32微控制器使用ARM Cortex-M内核,它是一种精简的32位RISC架构。

内核包含了处理器核心、存储器管理单元(MMU)、中断控制器、系统控制器等。

通过内核,STM32可以执行各种任务,包括处理计算、读写存储器、处理输入输出等。

2. 物理外设:STM32具有丰富的物理外设,包括通用输入输出端口(GPIO)、通用定时器(TIMER)、通用异步收发器(UART)、SPI(串行外设接口)、I2C(串行总线接口控制器)等。

这些外设可以连接到外部器件,以实现各种功能,如数据输入输出、时序控制、通信等。

3. 时钟控制:STM32使用时钟信号来同步所有的操作。

它有多个时钟源可以选择,包括外部晶振、内部高频振荡器等。

时钟信号会被分频或分频,以提供不同的时钟频率给各个外设和内核。

时钟控制是STM32工作的重要基础。

4. 存储器管理:STM32内置了不同类型的存储器,包括闪存用于程序存储、SRAM用于数据存储等。

程序代码被存储在闪存中,数据则存储在SRAM中。

存储器管理单元(MMU)负责管理存储器的分配和访问。

5. 中断处理:STM32支持中断机制,可以及时响应外部事件的发生。

当有外部事件触发时,如定时器计数溢出、外部输入信号变化等,STM32会中断当前任务的执行,转而执行预定的中断处理函数。

中断处理可以快速响应和处理外部事件。

综上所述,STM32的工作原理涉及内核架构、物理外设、时钟控制、存储器管理和中断处理等多个方面。

通过合理配置和编程,STM32可以实现各种功能,满足不同应用需求。

STM32F103程序运行启动过程解析

STM32F103程序运行启动过程解析

STM32启动过程解析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 ;8Heap_Mem SPACE Heap_Size ;9__heap_limit ;10THUMB ;11PRESERVE8 ;12IMPORT NMIException ;13IMPORT HardFaultException ;14IMPORT MemManageException ;15IMPORT BusFaultException ;16IMPORT UsageFaultException ;17IMPORT SVCHandler ;18IMPORT DebugMonitor ;19IMPORT PendSVC ;20IMPORT SysTickHandler ;21IMPORT WWDG_IRQHandler ;22IMPORT PVD_IRQHandler ;23IMPORT TAMPER_IRQHandler ;24IMPORT RTC_IRQHandler ;25IMPORT FLASH_IRQHandler ;26IMPORT EXTI0_IRQHandler ;28IMPORT EXTI1_IRQHandler ;29IMPORT EXTI2_IRQHandler ;30IMPORT EXTI3_IRQHandler ;31IMPORT EXTI4_IRQHandler ;32IMPORT 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 ;40IMPORT 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 ;45IMPORT TIM1_BRK_IRQHandler ;46 IMPORT TIM1_UP_IRQHandler ;47 IMPORT TIM1_TRG_COM_IRQHandler ;48 IMPORT TIM1_CC_IRQHandler ;49 IMPORT TIM2_IRQHandler ;50IMPORT TIM3_IRQHandler ;51IMPORT TIM4_IRQHandler ;52IMPORT I2C1_EV_IRQHandler ;53IMPORT I2C1_ER_IRQHandler ;54IMPORT I2C2_EV_IRQHandler ;55IMPORT I2C2_ER_IRQHandler ;56IMPORT SPI1_IRQHandler ;57IMPORT SPI2_IRQHandler ;58IMPORT USART1_IRQHandler ;59IMPORT USART2_IRQHandler ;60IMPORT USART3_IRQHandler ;61IMPORT 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 ;69IMPORT FSMC_IRQHandler ;70IMPORT TIM5_IRQHandler ;72IMPORT SPI3_IRQHandler ;73IMPORT UART4_IRQHandler ;74IMPORT UART5_IRQHandler ;75IMPORT TIM6_IRQHandler ;76IMPORT TIM7_IRQHandler ;77IMPORT 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 ;84DCD __initial_sp ;85DCD Reset_Handler ;86DCD NMIException ;87DCD HardFaultException ;88DCD MemManageException ;89DCD BusFaultException ;90DCD UsageFaultException ;91DCD 0 ;92DCD 0 ;93DCD 0 ;94DCD 0 ;95DCD SVCHandler ;96DCD DebugMonitor ;97DCD 0 ;98DCD PendSVC ;99DCD SysTickHandler ;100DCD WWDG_IRQHandler ;101DCD PVD_IRQHandler ;102DCD TAMPER_IRQHandler ;103DCD RTC_IRQHandler ;104DCD FLASH_IRQHandler ;105DCD RCC_IRQHandler ;106DCD EXTI0_IRQHandler ;107DCD EXTI1_IRQHandler ;108DCD EXTI2_IRQHandler ;109DCD EXTI3_IRQHandler ;110DCD EXTI4_IRQHandler ;111DCD DMA1_Channel1_IRQHandler ;112 DCD DMA1_Channel2_IRQHandler ;113 DCD DMA1_Channel3_IRQHandler ;114DCD DMA1_Channel5_IRQHandler ;116 DCD DMA1_Channel6_IRQHandler ;117 DCD DMA1_Channel7_IRQHandler ;118 DCD ADC1_2_IRQHandler ;119DCD USB_HP_CAN_TX_IRQHandler ;120 DCD USB_LP_CAN_RX0_IRQHandler ;121 DCD CAN_RX1_IRQHandler ;122DCD CAN_SCE_IRQHandler ;123DCD EXTI9_5_IRQHandler ;124DCD TIM1_BRK_IRQHandler ;125DCD TIM1_UP_IRQHandler ;126DCD TIM1_TRG_COM_IRQHandler ;127 DCD TIM1_CC_IRQHandler ;128DCD TIM2_IRQHandler ;129DCD TIM3_IRQHandler ;130DCD TIM4_IRQHandler ;131DCD I2C1_EV_IRQHandler ;132DCD I2C1_ER_IRQHandler ;133DCD I2C2_EV_IRQHandler ;134DCD I2C2_ER_IRQHandler ;135DCD SPI1_IRQHandler ;136DCD SPI2_IRQHandler ;137DCD USART1_IRQHandler ;138DCD USART2_IRQHandler ;139DCD USART3_IRQHandler ;140DCD EXTI15_10_IRQHandler ;141DCD RTCAlarm_IRQHandler ;142DCD USBWakeUp_IRQHandler ;143DCD TIM8_BRK_IRQHandler ;144DCD TIM8_UP_IRQHandler ;145DCD TIM8_TRG_COM_IRQHandler ;146 DCD TIM8_CC_IRQHandler ;147DCD ADC3_IRQHandler ;148DCD FSMC_IRQHandler ;149DCD SDIO_IRQHandler ;150DCD TIM5_IRQHandler ;151DCD SPI3_IRQHandler ;152DCD UART4_IRQHandler ;153DCD UART5_IRQHandler ;154DCD TIM6_IRQHandler ;155DCD TIM7_IRQHandler ;156DCD DMA2_Channel1_IRQHandler ;157 DCD DMA2_Channel2_IRQHandler ;158DCD DMA2_Channel4_5_IRQHandler ;160 AREA |.text|, CODE, READONLY ;161 Reset_Handler PROC ;162EXPORT Reset_Handler ;163IF DATA_IN_ExtSRAM == 1 ;164LDR R0,= 0x00000114 ;165LDR R1,= 0x40021014 ;166STR R0,[R1] ;167LDR R0,= 0x000001E0 ;168LDR R1,= 0x40021018 ;169STR R0,[R1] ;170LDR R0,= 0x44BB44BB ;171LDR R1,= 0x40011400 ;172STR R0,[R1] ;173LDR R0,= 0xBBBBBBBB ;174LDR R1,= 0x40011404 ;175STR R0,[R1] ;176LDR R0,= 0xB44444BB ;177LDR R1,= 0x40011800 ;178STR R0,[R1] ;179LDR R0,= 0xBBBBBBBB ;180LDR R1,= 0x40011804 ;181STR R0,[R1] ;182LDR 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行,使用了汇编语言编写,这其中的主要原因下文将会给出交代。

STM32:启动过程

STM32:启动过程

STM32:启动过程前⾔ 上电之后,CPU⾸先根据boot引脚选择存储器重映射区域,将该区域的地址重映射为地址偏移量为0; CPU从地址偏移量为0的地址处开始执⾏;该地址烧录的代码必须是xx.s启动⽂件,使⽤汇编语⾔编写; 上电之后,具体步骤截图如下;执⾏完以下步骤之后单⽚机就可以开始使⽤外设,运⾏逻辑代码了; 另外,MDK并没有将启动⽂件的所有配置开源,⽐如⼀部分的配置由__main闭源执⾏; 我们只能配置开源的⼀部分启动⽂件的参数;本⽂我们了解⼀下完整的启动流程及其原理;1 boot的启动⽅式 1.1 对于STM32的F0和F4开发板⽽⾔,⼀共有3种启动⽅式;以下的存储空间⼤⼩和地址是以⼤容量F1芯⽚作为参考的;不同芯⽚有⼀些差别; 注意下⾯存储空间⼤⼩的单位都是byte,这是因为内存的数据线是8bit的;内存的数据线和单⽚机的数据线是不同的总线;boot[0:1]启动地址存储空间启动⽅式事项[0:x]0x0800 0000-0x0807 FFFF512KbytesFlash启动使⽤JTAG或SWD下载较为常⽤;[1:0]0x1FFF F000-0x1FFF F7FF2Kbytes系统存储器启动使⽤串⼝下载,代码是通过bootloader搬运到flash中;该区域内存储了⼚家烧录的bootloader程序(即ISP程序),需要配合st提供的下载软件;[1:1]0x2000 0000-0x2001 000064Kbytes内嵌SRAM启动使⽤JTAG或SWD下载,仅⽀持调试模式;较为少⽤;没有掉电存储程序的功能,需要添加宏定义VECT_TAB_SRAM,配合脚本⽂件使⽤; 1.2 对于 STM32H7x3 ⽽⾔,只有⼀个boot引脚,配合BOOT_ADD0/BOOT_ADD1 的组合配置,可以让系统从两个不同的区域启动;boot引脚启动地址默认值默认值启动⽅式事项0BOOT_ADD0[15:0] 0x0800Flash启动启动地址⾼16位由BOOT_ADD0寄存器决定,低16位为0x0000;BOOT_ADD0寄存器可以修改,修改后掉电不丢失;0x0000 0000 到 0x3FFF 0000 的存储器地址都可以设置;1BOOT_ADD1[15:0] 0x1FF0系统存储器启动2 startup_stm32h743xx.s的堆栈 2.1 堆栈的汇编程序1;********************** ⽬的是分配数据段⽤来做"栈"**********************2; 表⽰即将声明数据段STACK⽤来做"栈",不⽤填⼊初始数据,可读写,⾸地址按照2^3对齐(8字节对齐);3 Stack_Size EQU 0x000010004 AREA STACK, NOINIT, READWRITE, ALIGN=35 Stack_Mem SPACE Stack_Size6 __initial_sp78; **********************⽬的是分配数据段⽤来做"堆"**********************9 Heap_Size EQU 0x000080010 AREA HEAP, NOINIT, READWRITE, ALIGN=311 __heap_base12 Heap_Mem SPACE Heap_Size13 __heap_limit 2.2 那么什么是堆栈呢?总结了⼀下,⼤概概括成了下⾯的表格形式;主要⽤来存储局部变量,变量的内存块;栈空间是从⾼地址开始向低地址⽣长的;STACK 栈对于多级调⽤的函数⼊⼝地址,需要使⽤栈空间配合连接寄存器来存储主调函数的地址;Stack_Mem表⽰栈的⾸地址,应该是给microLIB库使⽤的;__initial_sp栈标号,表⽰栈顶地址;也就是栈的内存最⼤地址;动态分配时使⽤的内存块;堆空间是从低地址向⾼地址⽣长的;HEAP 堆如果程序中没有使⽤到动态内存分配的话,编译器是不会编译出"堆"空间的;__heap_base 堆标号,表⽰"堆"的起始地址Heap_Mem 表⽰堆的⾸地址,应该是给microLIB库使⽤的;__heap_limit 堆标号,表⽰"堆"的结束地址 2.3 ⾄于堆栈标号Stack_Mem和Stack_Size⼤概是标识堆栈地址给microLIB库使⽤的把,应该没什么⽤;如下所⽰;MDK针对嵌⼊式推出了microLIB⼩型库,在功能上是⽤来替代C标准库的;;下⾯代码的功能主要是决定要不要启⽤microLIB库;以下代码⽐较不重要;IF :DEF:__MICROLIBEXPORT __initial_spEXPORT __heap_baseEXPORT __heap_limitELSEIMPORT __use_two_region_memoryEXPORT __user_initial_stackheap__user_initial_stackheapLDR R0, = Heap_MemLDR R1, =(Stack_Mem + Stack_Size)LDR R2, = (Heap_Mem + Heap_Size)LDR R3, = Stack_MemBX LRALIGNENDIF3 startup_stm32h743xx.s的中断向量表;**************中断向量表*****************************************************************AREA RESET, DATA, READONLY ; 即将声明⼀个内存区域RESET,是数据段,只读;EXPORT __Vectors ; 声明"标识__Vectors"可以被外部⽂件调⽤EXPORT __Vectors_End ; 声明"标识__Vectors_End"可以被外部⽂件调⽤EXPORT __Vectors_Size ; 声明"标识__Vectors_Size"可以被外部⽂件调⽤__Vectors DCD __initial_sp ; 分配4字节内存,初始化为栈顶地址,该内存开始的地址标识为"__Vectors"DCD Reset_Handler ; 分配4字节内存,放⼊复位中断服务函数的"地址标识Reset Handler"DCD NMI_Handler ;;.....DCD 0;DCD WAKEUP_PIN_IRQHandler ;__Vectors_End ; 内存结束的地址标识为"__Vectors_End"__Vectors_Size EQU __Vectors_End - __Vectors ; 声明标识"__Vectors_Size"⽤来表⽰中断向量表的⼤⼩;**************汇编代码段:上电复位中断服务程序举例***************************************************************AREA |.text|, CODE, READONLY ; 即将声明⼀个内存区域.text,是代码段,只读;Reset_Handler PROC ;伪指令PROC和ENDP⽤来声明⼀个程序,当前程序段标识为"Reset_Handler"EXPORT Reset_Handler [WEAK] ;声明当前程序可被外部函数调⽤,为弱函数IMPORT SystemInit ;引⼊⽂件外部声明的函数SystemInit()IMPORT __main ;引⼊⽂件外部声明的函数__main()LDR R0, =SystemInit ;将32bit函数⼊⼝地址放⼊R0寄存器中?BLX R0 ;跳转到R0寄存器内的地址去执⾏?LDR R0, =__main ;__main为编译器⾃动⽣成的函数,主要是解析代码段table的数据,然后跳转到main函数执⾏,BX R0 ;给需要初始化的变量和不需要初始化的变量分配堆栈运⾏空间;ENDP ;;**************汇编代码段:NMI中断服务程序举例***************************************************************NMI_Handler PROC ;EXPORT NMI_Handler [WEAK] ;这⾥导⼊了中断服务程序,如果外部⽂件写了,那此处的弱函数就不使⽤了B . ;B. 表⽰在这⾥跳转当前程序? 就是跳转到前⾯导⼊的程序ENDP ; 3.1 伪指令 相当于预处理器指令,编译器在编译时会进⾏替换,并不占⽤内存空间;EQU声明常数,汇编的常数单位不是bit,⽽是byteAREA表⽰即将分配⼀个数据段或代码段;需要跟分配内存的SPACE指令⼀起使⽤;EXPORT声明为可被外部⽂件引⽤,主要提供给链接器⽤于连接库⽂件;IMPORT引⼊外部⽂件声明WEAK弱声明,如果外部⽂件有相同的声明,则编译外部⽂件的声明,不编译弱声明ALIGN声明编译器需要对指令或数据的存放地址进⾏对齐;默认缺省值为32bit对齐PRESERVE8当前⽂件的堆栈需按照8字节对齐,也就是64bit数据线对齐;THUMB表⽰接下来的指令都是thumb指令集,cm3,cm7采⽤的是thumb-2指令集, 3.2 汇编指令SPACE分配⼀段内存空间,并初始化这些内存空间为0;需要跟声明内存属性的AREA伪指令⼀起使⽤;DCD Define Constant Double-words;分配4字节的内存空间⽤来存储⼀个32bit的数据;并初始化这些内存空间;LDR Load word;加载指令,将32bit数据存⼊⽬的寄存器中;B Branch,跳转到⽬标地址执⾏,执⾏指令集为ARM指令集BX Branch with Exchange;跳转到⽬的地址执⾏,并且指令集从ARM指令集切换到thumb指令集;BLX Branch with Link and Exchange;thumb-2兼容许多thumb指令,但是cortex-m3不⽀持当前指令; 3.3 注释零散1[地址]:地址加了[],⽤来表⽰地址内的数据;零散2汇编指令中的常数都是地址,⾃然数的格式为#常数;4 main函数的初始化 在配置外设之前,单⽚机⾸先还需要配置⼀下⼯作环境;主要涉及到以下⼏个c⽂件的函数;具体的话也不要求精确分析,轮廓了解⼀下; 4.1 stm32h7xx_hal.c 主要是IO电压的配置函数,boot引脚的启动配置,以及systick的hal库函数;/* stm32h7xx_hal.h: line528: Peripheral Control functions systick使⽤和配置,电压配置,boot配置等******************/void HAL_IncTick(void); //SysTick_Handler()中断服务函数调⽤的函数,装载systick为1ms(HAL_TICK_FREQ_1KHZ),void HAL_Delay(__IO uint32_t Delay); //systick时钟延时,单位ms;uint32_t HAL_GetTick(void);uint32_t HAL_GetTickPrio(void);HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq);HAL_TickFreqTypeDef HAL_GetTickFreq(void);void HAL_SuspendTick(void); //挂起systickvoid HAL_ResumeTick(void); //恢复systickvoid HAL_SYSCFG_VREFBUF_VoltageScalingConfig(uint32_t VoltageScaling); //line575:配置IO⼝输出的电压范围 4.2 stm32h7xx_hal_rcc.c 主要是rcc相关的晶振使能,以及总线时钟的配置;以及⼀些查看配置参数的函数;/*stm32h7xx_hal_rc.h line2814*/void HAL_RCC_DeInit(void);//复位RCC默认配置;使⽤HSI;关闭HSE,PLL;根据时钟树可知外设及总线为HSI-64MhzHAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct);//配置晶振是否使能,以及PLL1不为sysclk时PLL1的参数配置;HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency);//配置CPU(sysclk),AHB,APB..分频系数; 4.3 stm32h7xx_hal_cortex.c 主要是cortex内核的外设NVIC和MPU的配置函数;以及⼀些systick的使⽤函数;之后再分析内核外设的时候⼀起讲把; 不知道为什么在stm32h7xx_hal.c已经有systick的函数了,这⾥⼜有,没有将他们放⼀个⽂件⾥;先留着疑问;5 ⼩结 1)对于启动配置⽽⾔⼀直以来只使⽤过flash启动;感觉其他的具体也没试过,等需要的时候看看安富莱的视频把; 之前由于代码配置错误导致芯⽚不能flash下载的时候,试过把boot引脚切换到ISP下载模式,然后使⽤SWD下载; 当然下载之后是跑不起来的,然后再重新把boot引脚改为flash启动,此时芯⽚可以重新flash下载; 2)对于堆栈,注意⼀下,我们平常使⽤的局部数组什么的不要超出栈的内存⼤⼩,超出的话程序卡死,然后就跑不动了; 平常说的push和pop应该只针对栈⽽⾔;如果堆也能push和pop,针对⼀整块动态内存,怎么搞呢?从低地址到⾼地址搞; 3)⾄于中断向量表,主要是从偏移量0地址处开始依次分配内存,⽤来存储各种中断服务程序⼊⼝地址; ⼀些内核级别的中断程序的弱声明,这些程序除了Reset_Handler中断的弱函数执⾏了操作外,其他的都是循坏⾃⼰,使⽤时需要在⽤户程序中重新编写; 后⾯还有外设中断服务程序的弱声明,这些外设中断服务程序执⾏都是不断递归循坏⾃⼰;使⽤时需要在⽤户程序中重新编写; 4)启动⽂件本质来说,除了分配中断向量表空间之外,只主动执⾏了⼀个Reset_Handler⼀个函数, Reset_Handler函数跳转到system_init函数执⾏,然后跳转到MDK的__main函数执⾏;其他的函数都是弱声明,不断递归调⽤⾃⼰,使⽤的话需要重新写函数;。

stm32电源模块工作原理流程

stm32电源模块工作原理流程

stm32电源模块工作原理流程下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!STM32电源模块工作原理流程1. 简介在现代电子设备中,如何有效地管理电源是至关重要的。

  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行,使用了汇编语言编写,这其中的主要原因下文将会给出交代。

相关文档
最新文档