这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » STM

共3条 1/1 1 跳转至

STM

高工
2022-02-19 10:17:33     打赏

一、 STM32启动配置

在STM32F10xxx里,可以通过BOOT[1:0]引脚选择三种不同启动模式。

image.png


在系统复位后,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。


用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。


在从待机模式退出时,BOOT引脚的值将被被重新锁存;因此,在待机模式下BOOT引脚应保持为需要的启动配置。在启动延迟之后,CPU从地址0x0000 0000获取堆栈顶的地址,并从启动存储器的0x0000 0004指示的地址开始执行代码。


因为固定的存储器映像,代码区始终从地址0x0000 0000开始(通过ICode和DCode总线访问),而数据区 (SRAM) 始终从地址0x2000 0000开始(通过系统总线访问)。Cortex-M3的CPU始终从ICode总线获取复位向量,即启动仅适合于从代码区开始(典型地从Flash启动)。STM32F10xxx微控制器实现了一个特殊的机制,系统可以不仅仅从Flash存储器或系统存储器启动,还可以从内置SRAM启动。


二、 内置SRAM简介

一般情况下,我们在MDK 中编写工程应用后,调试时都是把程序下载到芯片的内部FLASH 运行测试的,代码的CODE 及RW-data 的内容被写入到内部FLASH中存储。但在某些应用场合下却不希望或不能修改内部FLASH 的内容,这时就可以使用RAM 调试功能了,它的本质是把原来存储在内部FLASH 的代码(CODE 及RW-data 的内容)改为存储到SRAM中(内部SRAM或外部SDRAM均可),芯片复位后从SRAM中加载代码并运行。


STM32F10xxx内置64K字节的静态SRAM。它可以以字节、半字(16位)或全字(32位)访问。SRAM的起始地址是0x2000 0000。


把代码下载到RAM中调试有如下优点:

下载程序非常快。RAM 存储器的写入速度比在内部FLASH 中要快得多,且没有擦除过程,因此在RAM上调试程序时程序几乎是秒下的,对于需要频繁改动代码的调试过程,能节约很多时间,省去了烦人的擦除与写入FLASH 过程。另外,STM32 的内部FLASH 可擦除次数为1 万次,虽然一般的调试过程都不会擦除这么多次导致FLASH 失效,但这确实也是一个考虑使用RAM的因素。

不改写内部FLASH 的原有程序。

对于内部FLASH 被锁定的芯片,可以把解锁程序下载到RAM上,进行解锁。


相对地,把代码下载到RAM中调试有如下缺点:

存储在RAM上的程序掉电后会丢失,不能像FLASH 那样保存。

若使用STM32 的内部SRAM 存储程序,程序的执行速度与在FLASH 上执行速度无异,但SRAM空间较小。

若使用外部扩展的SRAM 存储程序,程序空间非常大,但STM32读取外部SRAM 的速度比读取内部FLASH 慢,这会导致程序总执行时间增加,因此在外部SRAM中调试的程序无法完美仿真在内部FLASH 运行时的环境。另外,由于STM32 无法直接从外部SRAM中启动且应用程序复制到外部SRAM的过程比较复杂(下载程序前需要使STM32 能正常控制外部SRAM),所以在很少会在STM32 的外部SRAM中调试程序。


三、 例程验证

具体实验步骤参考《零死角玩转STM32——F103指南者》44.4实验:在内部SRAM 中调试


1、硬件设置

将跳线设置为BOOT[1:1]

image.png


2、创建工程调试版本


image.png

3、配置分散加载文件


; *************************************************************

; *** Scatter-Loading Description File generated by uVision ***

; *************************************************************


LR_IROM1 0x08000000 0x00080000  {    ; load region size_region

  ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address

   *.o (RESET, +First)

   *(InRoot$$Sections)

   .ANY (+RO)

   .ANY (+XO)

  }

  RW_IRAM1 0x20000000 0x00010000  {  ; RW data

   .ANY (+RW +ZI)

  }

}

4、配置中断向量表


void SystemInit (void)

{

 /* ..其它代码部分省略 */

 

/* 配置向量表添加的偏移地址 ----*/


#ifdef VECT_TAB_SRAM

  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */

#else

  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */

#endif 

}


5、修改FLASH 下载配置


image.png

6、实验结果

image.png





关键词: STM     启动     调试    

高工
2022-02-19 11:46:23     打赏
2楼

谢谢分享


工程师
2022-02-19 12:40:28     打赏
3楼

感谢楼主分享


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]