[014] [STM32] 启动模式&在SRAM中调试代码

STM32
Contents
BOOT模式`
ISP一键下载电路分析`
在SRAM中调试代码`

1 BOOT模式

image-20220317145803247

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

  • 从待机模式退出时,BOOT引脚的值将被被重新锁存;因此,在待机模式下BOOT引脚应保持为需要的启动配置。

STM32F103RC芯片内存映射如下:

image-20220317151202971

  • 内部Flash启动(boot0 = 0 & boot1 = x):内核从0x08000000)0x08000004)分别获取SP初值、复位向量地址。Flash编程一次可以写入16位(半字)。

  • 内部SRAM启动(boot0 = 1 & boot1 = 1):只能在0x20000000开始的地址区访问SRAM,内核从0x20000000)0x20000004)分别获取SP初值、复位向量地址。支持字节、半字(16位)或全字(32位)访问

  • 系统存储器启动(boot0 = 1 & boot1 = 0):内核从0x1FFF00000x1FFF0004分别获取SP初值、复位向量地址。该存储区ST公司内嵌了一段BootLoader程序,为ISP(In System Program)提供支持:

    • 对于小容量、中容量和大容量的产品:通过USART1接口启用自举程序。(串口烧录hex文件
    • 对于互联型产品:通过USART1/2、CAN2或USB OTG全速接口的设备模式

2 ISP一键下载电路分析

BOOT1必须处于低电平,同时需要上位机(如FlyMCU,它是mcuisp最新版本)辅助控制RTS和DTR电平状态。

S8550-PNP箭头向里:当Ve - Vb > 0.7v (0.5),e和c导通。

S8050-NPN箭头向外:当Vb - Ve > 0.7v (0.5),e和c导通。

即用be控制ce,be导通看箭头方向

  • DTR->1,RTS->0,Q2&3导通,RESET->0,BOOT0->1(IN4148二极管防止电路倒灌IO口),切换到系统存储器启动模式,进入BootLoader引导下载程序。
  • DTR->0,RTS->1,Q2&3截止,RESET->1,BOOT0->0,切换到内部Flash启动模式,复位后启动运行程序。

3 在SRAM中调试代码

STM32内部Flash最大可擦除10000次,一般程序都会烧录到其中进行调试,但若超过最大擦除次数,flash会损坏。因此对于体积较小的代码可以烧录到内部SRAM中调试,但是需要一直带电调试,因为RAM断电即丢失数据。

  • BOOT0->1 BOOT1->1

  • 设置一个RAM调试工程

image-20220318210357093

  • 修改sct文件,把程序分配到片内SRAM
LR_IROM1 0x20000000  0x00010000  {    ; load region size_region
  RO_IRAM 0x20000000  0x00008000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM 0x20008000 0x00008000  {  ; RW data
   .ANY (+RW +ZI)
  }
}
  • 修改下载配置,把程序下载到SRAM

image-20220318210841174

修改下载器烧录算法程序的存储地址和空间,下载器烧录算法起始地址必须大于代码段结束地址(可通过MAP文件查看)。

image-20220318211720080

每次点击debug都会重新下载axf到RAM

  • 修改中断向量表基地址

使能SystemInit()VECT_TAB_SRAM宏,可在C/C++配置全局定义

#define FLASH_BASE            ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */
#define SRAM_BASE             ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */

#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 
  • 修改调试器配置,初始化SP和PC指针(仅STM32F1需要配置,F4不需要,按上面步骤配置点击下载即可

image-20220318215143859

Debug_RAM.ini配置文件参考keil_v5/ARM/Pack/Keil/STM32F1xx_DFP/

FUNC void Setup (void) {
  SP = _RDWORD(0x20000000);             // 设置栈指针SP,把0x20000000地址中的内容赋值到SP。
  PC = _RDWORD(0x20000004);             // 设置程序指针PC,把0x20000004地址中的内容赋值到PC。
  // _WDWORD(0xE000ED08, 0x20000000);      // 设置向量表偏移寄存器 (这里可以不设置, SystemInit中配置了该寄存器)
}
LOAD %L INCREMENTAL                    // 下载axf文件到RAM
Setup();																 //调用上面定义的setup函数设置运行环境		
//g, main																 //跳转到main函数


因为Cortex-M3/4复位时会从0x000000000x00000004的相对位置取出MSP初值以及将复位向量地址赋给PC,在SRAM中的绝对位置就是0x200000000x20000004。STM32F1系列貌似从SRAM启动复位时,不会自动取出这两个值,因此无法正常运行。

因此,需要点击debug引导.ini中的文件来初始化pc和sp指针,同时调试时不能点RST,必须退出重新进入debug以复位,同时也不能硬件复位。

此外,如果还有问题可以试试keilkill.bat清除工程再重新编译试试。

END

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柯西的彷徨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值