基于MDK创建纯汇编语言的STM32工程

一、 STM32启动配置

在STM32F10xxx里,可以通过BOOT[1:0]引脚选择三种不同启动模式。
在这里插入图片描述
在系统复位后,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 中调试

3.1 硬件设置

将跳线设置为BOOT[1:1]
在这里插入图片描述

3.2 创建工程调试版本

在这里插入图片描述

3.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)
  }
}

3.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 
}

3.5 修改FLASH 下载配置

在这里插入图片描述

3.6 实验结果

在这里插入图片描述
四、 总结和参考资料
《零死角玩转STM32——F103指南者》44.4实验:在内部SRAM 中调试
STM32 BOOT模式配置以及作用
STM32烧录程序方式
stm32怎么烧录程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值