eXecute In Place
,即芯片内执行,指应用程序可以直接在 flash 闪存内运行,不必再把代码读到系统 RAM中。在我们的印象里,应用程序必须要从硬盘中加载到内存当中才可以被运行,但实际上应用程序是可以直接在flash 闪存运行的,也就是说,cpu 可以直接从 flash 中取出指令。对于 STM32 而言,它是有 XIP 设备的。XIP
设备都属于内存图中的 BLOCK0
区域内。XIP
设备在 0x0000 0000 ~ 0x1FFF FFFF
内。STM32F10xxx
里,可以通过 BOOT[1:0]
引脚选择三种不同启动模式。SYSCLK
的第 4 个上升沿, BOOT 引脚的值将被锁存。用户可以通过设置 BOOT1
和 BOOT0
引脚的状态,来选择在复位后的启动模式。CPU
从地址 0x0000 0000
获取堆栈顶的地址,并从启动存储器的 0x0000 0004
指示的地址开始执行代码。(这里先不验证,在之后的博客中会进行验证,但你需要记住,后面用的上)0x0000 0000
开始(通过 ICode
和 DCode
总线访问),而数据区(SRAM
)始终从地址 0x2000 0000
开始(通过系统总线访问)。Cortex-M3
的 CPU 始终从 ICode
总线获取复位向量,即启动仅适合于从代码区开始(典型地从 Flash 启动)。STM32F10xxx
微控制器实现了一个特殊的机制,系统可以不仅仅从 Flash 存储器或系统存储器启动,还可以从内置 SRAM 启动。0x00000000
),但仍然能够在它原有的地址(0x08000000
)访问它,即闪存存储器的内容可以在两个地址区域访问, 0x00000000
或 0x08000000
。0x00000000
),但仍然能够在它原有的地址(互联型产品原有地址为 0x1FFFB000
,其它产品原有地址为 0x1FFFF000
)访问它。0x20000000
开始的地址区访问 SRAM
(当从内置 SRAM
启动,在应用程序的初始化代码中,必须使用 NVIC
的异常表和偏移寄存器,重新映射向量表到 SRAM
中)。0x08000000
地址处。STM32
内部的 XIP
设备,那不就是代码存储的地方吗?并且也在 STM32
启动方式中详细地描述了代码存储位置。SYSTEM MEMORY
启动,里面存储的是 Bootloader
,是芯片出厂的时候就已经固化好了的,可以从中读数据,但是不可以向其中写数据,它的作用就是:将用户程序通过可用的外设烧写到指定的地址处,然后启动 STM32
。0X2000 0000
STM32
中的可执行文件的形成过程,现在我们需要验证的就是如何将可执行文件烧写到指定的存储设备中去(假设是 FLASH
,其实也可以是 SRAM
)Flymcu
(串口下载软件的时候),我脑海里就有一个疑问,就是这个软件到底是怎样使得 STM32
将生成的代码烧写到内部 FLASH
上的。这真的是很不可思议!因为 STM32
上电复位后肯定是要执行代码的,可是我还没有给它代码呢,它怎么会运作呢?当时我真的很迷惑。STM32
出厂的时候 Bootloader
(用于将用户程序下载到 STM32
内部指定地址处的固件(程序))就已经固化在了 System Memory
上了,可读写无效。STM32
启动配置一节中我们知道,可以通过对 BOOT1
和 BOOT0
引脚上高低电平的改变从而实现 STM32
启动方式的不同。Bootloader
存储在 Sytem Memory
上,如果想要让 Bootloader
运行(将用户程序下载到指定内存地址处),那启动模式肯定是要选择以系统存储器的方式启动。BOOT1 = 0 BOOT0 = 1 -> 系统存储器模式
BOOT1
和 BOOT0
引脚上高低电平改变的能力。STM32
外部的电路到底是如何设计的,以及Flymcu
到底是怎样控制 BOOT1
和 BOOT0
引脚上高低电平改变从而达到具有使得 STM32
从系统存储器启动的的神奇能力。CH340G
内(CH340 D
+ CH340 D-
)然后CH340G
根据来自 usb 的指令进行相应的工作。BOOT1
和 BOOT0
引脚上高低电平改变是 CH340G
的作用,而 CH340G
是严格按照来自Flymcu 的指令进行的,所以,控制 BOOT1
和 BOOT0
引脚上高低电平改变的幕后黑手就是 Flymcu
。DTR
电平置低:复位RTS
电平置高:进入 Bootloader100ms
:有谁能够告诉我为什么DTR
电平置高:释放复位RTS
维持高 :此时开始运行 Bootloader
Flymcu
要与 STM32
连接肯定是要发送特定的指令,并且当 STM32
接收到预先约定好的指令时,也会发送特定的回复。(和接头的性质差不多)STM32
从 Bootloader
启动到能够与外部设备进行数据交互需要一定的时间,因此连接需要一定的时间Bootloader
(有大佬能告诉我为什么)0x0800 0000
处开始运行Flymcu
发送给 STM32
的指令到底是什么,这个指令肯定是事先就确定好的,在这个文档中提及到了。DFU
与外部设备进行数据交互时 STM32
外部电路设计Bootloader
与外部设备进行数据交互的方式有很多种,不仅仅只有串口,只是由于硬件平台有限(正点原子只有通过串口下载的接口(调试接口除外))而根据不同的交互方式,STM32
外部的电路设计又大不相同。Bootloader
接收到相应的命令之后,就会连续发送两个 response
。我们这个时候再看下 Flymcu 中的输出信息,Flymcu
接收到两个来自 Bootloader
的信息。STM32
不仅可以从 FLASH
上启动,还可以从 SRAM
上启动。并且在STM32启动配置中有一个小提示:从 SRAM
中启动,需要重新设置中断向量表。SRAM
中启动,但是不设置中断向量表,看一下会出现什么情况。SRAM
启动,只能通过调试接口下载程序。注意:SRAM是掉电数据就会丢失的存储器介质,因此使用时(前提是已经掉电)要重新下载程序从 SRAM
中启动的最主要的目的是用来调试程序,产品中的用户程序肯定都是存储在 FLASH 上的,不然每次掉电后用户程序都没了!!!
SRAM
处,可以参考一下下面两篇博文:SRAM
处,那么接下来,我们来验证一下。如果没有重新设置中断向量表会出现什么结果。reserved
有些是不使用,有些是不能用(有其他重要的作用:可读写忽略),不可以修改其值Flymcu
(因为 Bootloader
与外部设备进行数据交互不仅仅只是通过USART)))与单片机内部的 Bootloader
进行数据交互(目的是将可执行文件下载到指定的存储地址处)command
,可以通过复位或上位机发送跳转到用户代码入口地址的命令执行用户程序。cpu
执行第一条用户代码之后的流程后面的博客会详细说明,但毋庸置疑的是,这是一个重要转折点,在这个点之后执行的是你自己编写的代码,你比较熟悉这个过程,但是在这个点之前,对大部分人来说都是都是比较陌生的,但是但你对这个过程了解之后,会对你的知识体系有非常大的提升。原文:https://blog.csdn.net/qq_46359697/article/details/114759405
联系客服