[STM32U3] 在ram中调试stm32程序的方式

[复制链接]
351|8
xia00 发表于 2025-11-12 22:29 | 显示全部楼层 |阅读模式
在ram中调试stm32程序,方式有3个:
第一:在mdk开发环境中进入调试模式,通过载入一个初始化文件,内容如下:


/*----------------------------------------------------------------------------
  Setup()  configure PC & SP for RAM Debug
*----------------------------------------------------------------------------*/
FUNC void Setup (void) {
  SP = _RDWORD(0x20000000);          // Setup Stack Pointer
  PC = _RDWORD(0x20000004);          // Setup Program Counter
  _WDWORD(0xE000ED08, 0x20000000);   // Setup Vector Table Offset Register
}

LOAD %L INCREMENTAL                  // load the application

Setup();                             // Setup for Running

第二:通过芯片内置的bootloader程序和相关烧写工具(mcuisp),烧写完成后bootloader程序自动跳转dao相关内存地址开始执行新程序。但是bootloader烧写算法本身会消耗一定数量deram,需要根据不同芯片做出处理,主要是code烧写和中断向量表必须加上固定大小的偏移。
第三:自己编写一个引导程序烧写到flash中,每次重启芯片后固定从0x8000000地址处开始执行,然后再跳转到ram中的程序代码处执行。


sourceInsight 发表于 2025-11-12 22:58 | 显示全部楼层
印象中主要有两个步骤,设置堆栈顶指针sp,然后再跳转到ResetHandler处执行。
feiqi1 发表于 2025-11-12 22:59 | 显示全部楼层
__Vectors       DCD     __initial_sp                      ; Top of Stack

                DCD     Reset_Handler                     ; Reset Handler
这两个需要注意下
androidbus 发表于 2025-11-12 23:05 | 显示全部楼层
每次芯片复位后,就从中断向量表的第一个位置处取出栈顶指针,然后设置到SP。
litengg 发表于 2025-11-12 23:05 | 显示全部楼层
第二个位置也就是Reset Handler中断向量里取出复位后PC的值
qiangweii 发表于 2025-11-12 23:11 | 显示全部楼层
检查下是否下一步就跳转到Reset Handler所指示的地址处执行。
shashaa 发表于 2025-11-12 23:11 | 显示全部楼层
是不是感觉跟前面mdk调试模式中的初始化文件机制很相似啊?
bbapple 发表于 2025-11-12 23:14 | 显示全部楼层
他们是一样的就是由cortexM3的存储模型和启动机制决定的。
handleMessage 发表于 2025-11-12 23:15 | 显示全部楼层
M3芯片的中断向量表示放在执行程序的最前面的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

1871

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部