玩转STM32(12)代码存储空间的选择

发布者:神秘行者最新更新时间:2022-05-17 来源: eefocus关键字:STM32  代码  存储空间 手机看文章 扫描二维码
随时随地手机看文章

前面了解了CPU怎么样拥有跳动的心脏,那么它拥有了开启自动化执行的生命之路。如果学习过CPU原理之类的硬件,就知道CPU在每一个脉冲信号之下,就向前运行一步,像168MHz频率的CPU,运行一步是很短的时间。不过CPU运行的原理是很简单的,可以设想纸带上有一些图案,比如圆、三角形、四边形,当这张纸带经过一个机器时,碰到圆就加一,碰到三角形就减一,碰到四边形就输出当前计数,这样简单的机器就是一个计算机所做的事情了。同理,前面CPU运行频率,就是让纸带经过机器的速度,如果频率越高,纸带的速度就快,CPU处理的事情就越多。从这里可以看到,CPU要工作起来,刚刚有运行部件还不行,还得有纸带,纸带上面还得有符号。那么在STM32里,什么是纸带,什么是符号呢?可以看到纸带作用就是记录符号,在电子计算机发展史,也确实有采用打孔纸带来记录的,后来慢慢发展,发现纸带记录太麻烦了。后来研究发展,采用半导体组成储存器,就是目前采用的主流方案。既然明白了储存器,就知道储存器就是用来记录程序和数据的,那么程序和数据就相当纸带上面的符号了。


有了储存器,那么CPU怎么样知道从哪个储存器里读取数据呢?STM32拥有两种储存器,一种是内置的,一种是外置的。默认的情况下是从内置的储存器读取数据,并开始执行的。不过STM32也提供两个配置管脚来选择使用内置的,还是外置的,还是采用特殊的方式。可以从下面的原理图看到两个管脚的连接情况:

可以看到BOOT1引脚固定地接地线,就是相当于低电平,也是这一位置的值为0;而BOOT0引脚是接到外面一个跳线上,可以让用户来选择不同储存器使用的。这两个引脚的置位情况就说明CPU要从那里读取程序运行了。具体详细说明如下:

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启动,这种模式可以用于调试。


Main Flash memory


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


System memory


从系统存储器启动,这种模式启动的程序功能是由厂家设置的。一般来说,这种启动方式用的比较少。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader,也就是我们常说的ISP程序,这是一块ROM,出厂后无法修改。一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。但是这个下载方式需要以下步骤:


Step1:将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader


Step2:最后在BootLoader的帮助下,通过串口下载程序到Flash中


Step3:程序下载完成后,又有需要将BOOT0设置为GND,手动复位,这样,STM32才可以从Flash中启动


Embedded Memory


内置SRAM,既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。假如我只修改了代码中一个小小的地方,然后就需要重新擦除整个Flash,比较的费时,可以考虑从这个模式启动代码(也就是STM32的内存中),用于快速的程序调试,等程序调试完成后,再将程序下载到Flash中。


要注意的是,一般不使用内置SRAM启动(BOOT1=1 BOOT0=1),因为SRAM掉电后数据就丢失。多数情况下SRAM只是在调试时使用,也可以做其他一些用途。如做故障的局部诊断,写一段小程序加载到SRAM中诊断板上的其他电路,或用此方法读写板上的Flash或EEPROM等。还可以通过这种方法解除内部Flash的读写保护,当然解除读写保护的同时Flash的内容也被自动清除,以防止恶意的软件拷贝。


一般BOOT0和BOOT1跳线都跳到0(地)。


通过上面的学习,就理解了STM32是怎么样决定从那个存储空间进行读取代码,并运行的。


https://blog.csdn.net/caimouse/article/details/51749579

关键字:STM32  代码  存储空间 引用地址:玩转STM32(12)代码存储空间的选择

上一篇:玩转STM32(10)CPU的脉搏
下一篇:玩转STM32(11)CPU的心跳历程

推荐阅读最新更新时间:2024-11-12 11:33

U-boot 在 mini2440-S3C2440 上的移植(3)-第一阶段:探索启动代码
1.本文以mini2440开发板为例: u-boot属于两阶段的Bootloader,第一阶段文件为CPU/arm920t/start.S和board/mini2440/lowlevel_init.S,前者是平台相关的,后者是开发板相关的; U-boot第一阶段代码: 1.硬件设备初始化 该部分完成:将CPU的工作模式设置为管理模式;关闭WATCHDOG; 设置FCLK;HCLK;PCLK的比例,关闭MMU;CACHE 参考代码:cpu/arm920t/start.S 2.为加载Bootloader的第二阶段代码准备RAM空间;所谓准备RAM空间,就是初始化内存芯片,参考代码start.S中调用的lowlevel_init.S函数
[单片机]
STM32的IO口灌入电流和输出驱动电流最大是多少?
最大可以输出8mA,灌入20mA,但要保证所有进入芯片VDD的电流不能超过150mA,同样所有从VSS流出的电流也不能超过150mA。 详细请看STM32的数据手册中的相关内容。 例如,STM32F103中容量产品,需要看5.2节和5.3.12节,里面有更详细的数据: http://www.st.com/stonline/products/literature/ds/13587.pdf STM32F103X8B
[单片机]
<font color='red'>STM32</font>的IO口灌入电流和输出驱动电流最大是多少?
STM32f4输入捕获实验代码
我们来看看 timer.c文件中,我们添加的两个函数的内容: TIM_ICInitTypeDef TIM5_ICInitStructure; //定时器 5通道1 输入捕获配置 //arr:自动重装值(TIM2,TIM5 是 32位的!!) psc:时钟预分频数 void TIM5_CH1_Cap_Init(u32 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphCl
[单片机]
STM32学习手记⑤-SysTick精确延时
/*********************************************************** 例程名称:SysTick实验 硬件连接:指示灯连接 PE0 功能描述:每秒PEO翻转一次 */ #include stm32f10x_lib.h extern vu32 TimingDelay; //在本文件引用stm32f10x_it.c定义的精确计时变量 /************************************************************ * 函数名称 :void RCC_Configuration() * 功能描述 : 复位和时钟控制 配置 * 参数
[单片机]
Stm32平台UCOSII的简单使用及注意事项
1.与UCOSII有关的几个概念:任务优先级,任务堆栈,任务控制块,任务就绪表和任务调度器 任务优先级,这个概念比较好理解, ucos 中,每个任务都有唯一的一个优先级。优先级是 任务的唯一标识。在 UCOSII 中,使用 CPU 的时候,优先级高(数值小)的任务比优先级低的 任务具有优先使用权,即任务就绪表中总是优先级最高的任务获得 CPU 使用权,只有高优先级 的任务让出 CPU 使用权(比如延时)时,低优先级的任务才能获得 CPU 使用权。 UCOSII 不支 持多个任务优先级相同,也就是每个任务的优先级必须不一样。 任务堆栈,就是存储器中的连续存储空间。为了满足任务切换和响应中断时保存 CPU 寄存 器中
[单片机]
<font color='red'>Stm32</font>平台UCOSII的简单使用及注意事项
STM32-触摸屏实验
void Touch_Init(void);//初始化 u8 Read_ADS(u16 *x,u16 *y); //带舍弃的双方向读取 u8 Read_ADS2(u16 *x,u16 *y); //带加强滤波的双方向坐标读取 u16 ADS_Read_XY(u8 xy); //带滤波的坐标读取(单方向) u16 ADS_Read_AD(u8 CMD); //读取AD转换值 void ADS_Write_Byte(u8 num); //向控制芯片写入一个数据 void Drow_Touch_Point(u8 x,u16 y);//画一个坐标叫准点 void Draw_Big_Point(u8 x,u16 y); //画一个大点 voi
[单片机]
STM32 使用DMA+DAC+TIMER输出正弦波
之前已经简单论述过,根据我个人菜鸟的了解与认识,对之前的知识进行整理回顾: DMA:我的理解就是一个通道,或者是一座桥梁。在静态内存到静态内存,或者外设到静态内存间的一个通讯的通道。建立这个通道的好处是:可以抛开CPU,不占用CPU的资源,直接使用这块内存的内容,速度也会加快。 DAC:STM32F103中有两个DAC,可以同时使用。DAC的作用就是将数字量转化为模拟量(电压),在这就不作太多的讲解。 TIMER:定时器。不作讲解。 那么对于使用DMA+DAC+TIMER产生正弦波的原理或过程,我有这样一个简单的理解:先将一个可以生成正弦波的数据表保存在静态内存中,然后在DAC以及这块内存中间使用DMA建立一个通道
[单片机]
意法半导体推出STM32微处理器专用高集成度电源管理芯片
优化的集成化电源管理芯片,内置保护功能,驱动MPU及外设 2024 年 10 月 18 日, 中国——意法半导体 STM32MP2 微处理器配套电源管理芯片STPMIC25 现已上市。 新产品在一个便捷封装内配备 16 个输出通道,可为MPU的所有电源轨以及系统外设供电,完成硬件设计仅需要少量的外部滤波和稳定功能组件。评估板STEVAL-PMIC25V1现已上市,开发者可立即开始开发应用。 新电源管理芯片包含七个 DC/DC 降压转换器和八个低压差 (LDO) 稳压器,还有一个额外的 LDO稳压器为系统 DDR3 和 DDR4 DRAM 提供参考电压 (Vref) 。在八个 LDO稳压器中有一个3.3V 通道专用稳压
[嵌入式]
意法半导体推出<font color='red'>STM32</font>微处理器专用高集成度电源管理芯片
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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