历史上的今天

今天是:2024年11月02日(星期六)

2021年11月02日 | stm32专题三十八:在SRAM中调试代码

发布者:陈书记 来源: eefocus关键字:stm32  SRAM  调试代码 手机看文章 扫描二维码
随时随地手机看文章

在 RAM 中调试代码的优点:

在 RAM 中调试代码的缺点:

stm32的启动方式:

(1)从地址 0x00000000 处取出栈指针 MSP 的初始值,该值就是栈顶的地址;


(2)从地址 0x00000004 处取出程序指针 PC 的初始值,该值指向复位后应执行的第一条指令;


上述过程由内核自动设置运行环境并执行主体程序,因此它被称为自举过程。


这个实际上和启动文件是相对应的:

实际应用中,我们会根据BOOT0和BOOT1两个引脚,把这两个地址映射到其他地址空间;

对于内部FLASH和内部SRAM已经很熟悉了,系统存储器是什么?

实际上,当我们按住复位然后松开时,内核就会从映射到的地址,取出SP指针和PC指针开始运行。


启动文件决定0地址和4地址的存储内容,sct 文件决定这些内容的绝对地址。

系统存储器启动方式(ISP)


当芯片上电后采样到 BOOT0 引脚为高电平, BOOT1 为低电平时,内核将从系统存储器的 0x1FFFF000 及 0x1FFFF004


获取 MSP 及 PC 值进行自举。系统存储器是一段特殊的空间,用户不能访问, ST 公司在芯片出厂前就在系统存储器中固化了


一段代码。因而使用系统存储器启动方式时,内核会执行该代码,该代码运行时,会为 ISP 提供支持(In System Program),如检


测 USART1/2、 CAN2 及 USB 通讯接口传输过来的信息,并根据这些信息更新自己内部 FLASH 的内容,达到升级产品应用程


序的目的,因此这种启动方式也称为 ISP 启动方式。


内部Flash启动过程:

来分析一下启动文件:

然后根据 sct 文件:

*.o(RESET, +First)命令,用于把启动文件中定义的 RESET 节区放在当前执行域的开头,即地址为 0X0800 0000。这个设计非常的巧妙,这样的话,__initial_sp 和 Reset_Handler 就分别被存储到0X0800 0000 和 0X0800 0004。


那么加入我们把*.o(RESET, +First)语句放到RW_IRAM1中,__initial_sp 和 Reset_Handler就会被存储到0X2000 0000和


0X2000 0004,如下所示:

接下来,使用 fromelf 生成反汇编代码:

fromelf --text -c .流水灯.axf > test.txt

从反汇编代码可了解到,这个工程的 0x08000000 地址存储的值为 0x20000428,0x08000004 地址存储的值为


0x08000145,查看 map 文件,这两个值正好是栈顶地址__initial_sp 以及首条指令 Reset_Handler 的地址。下载器会根据 axf 文


件(bin、 hex 类似)存储相应的内容到内部 FLASH 中。

SRAM 中调试代码


首先是注意事项:


RAM 调试,由于原 FLASH 中可能有程序,因此在 BOOT0 和 BOOT1 没改变时,不能用硬件复位(硬件复位会跳转执行FLASH中的代码),只能用调试按钮,然后点击全速运行。硬件开发板上的复位和调试界面的复位均不能使用,不然就会跳转去执行FLASH程序,导致代码出错。要想复位程序,必须先退出调试,再重新进入调试。

(1)创建 RAM 调试版本

(2)配置 sct 分散加载文件:

接下来,我们使用 fromelf 工具分别生成了普通版本和RAM调试版本的工程,对比如下:

可以看到,RAM版本中的程序,完全是保存在内部SRAM的,而且和FLASH版本完全对应。


(3)设置中断向量表偏移:


由于 startup_stm32f10x.s 文件中的启动代码不是指定到绝对地址的,经过它由链接器决定应存储到内部 FLASH 还是 SRAM,所以 SRAM 版本工程中的启动文件不需要作任何修改。


重点在于启动文件定义的中断向量表被存储到内部 FLASH 和内部 SRAM 时,这两种情况对内核的影响是不同的,内核会根据它的“向量表偏移寄存器 VTOR”配置来获取向量表,即中断服务函数的入口。我们来看一下关于VTOR寄存器的描述:

VTOR 寄存器是由启动文件中 Reset_Handle 中调用的库函数 SystemInit 配置的,标准库函数如下:


void SystemInit (void)

{

  /* Reset the RCC clock configuration to the default reset state(for debug purpose) */

  /* Set HSION bit */

  RCC->CR |= (uint32_t)0x00000001;

 

  /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */

#ifndef STM32F10X_CL

  RCC->CFGR &= (uint32_t)0xF8FF0000;

#else

  RCC->CFGR &= (uint32_t)0xF0FF0000;

#endif /* STM32F10X_CL */   

  

  /* Reset HSEON, CSSON and PLLON bits */

  RCC->CR &= (uint32_t)0xFEF6FFFF;

 

  /* Reset HSEBYP bit */

  RCC->CR &= (uint32_t)0xFFFBFFFF;

 

  /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */

  RCC->CFGR &= (uint32_t)0xFF80FFFF;

 

#ifdef STM32F10X_CL

  /* Reset PLL2ON and PLL3ON bits */

  RCC->CR &= (uint32_t)0xEBFFFFFF;

 

  /* Disable all interrupts and clear pending bits  */

  RCC->CIR = 0x00FF0000;

 

  /* Reset CFGR2 register */

  RCC->CFGR2 = 0x00000000;

#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)

  /* Disable all interrupts and clear pending bits  */

  RCC->CIR = 0x009F0000;

 

  /* Reset CFGR2 register */

  RCC->CFGR2 = 0x00000000;      

#else

  /* Disable all interrupts and clear pending bits  */

  RCC->CIR = 0x009F0000;

#endif /* STM32F10X_CL */

    

#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)

  #ifdef DATA_IN_ExtSRAM

    SystemInit_ExtMemCtl(); 

  #endif /* DATA_IN_ExtSRAM */

#endif 

 

  /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */

  /* Configure the Flash Latency cycles and enable prefetch buffer */

  SetSysClock();

 

#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 

}


其中,值得注意的是这一块,根据是否定义宏VECT_TAB_SRAM,来设置VTOR的偏移地址是基于SRAM还是FLASH。

两个基地址定义如下,其实也就是SRAM和FLASH的起始地址:

那么,我们可以在SRAM调试的工程配置中加入VECT_TAB_SRAM宏(正常版本中没有),来进行向量表偏移:

(4)修改 FLASH 下载配置:


得到 SRAM 版本的代码指令后,为了把它下载到芯片的 SRAM 中,还需要修改下载器的配置,如图所示:


但是,以上配置都完成后,并不能下载使用!!!

一个解决方案是,利用调试按钮运行程序。后面还有一堆脚本配置,参考零死角玩转STM32。

关键字:stm32  SRAM  调试代码 引用地址:stm32专题三十八:在SRAM中调试代码

上一篇:stm32专题三十七:自动分配变量到指定 SRAM 空间
下一篇:stm32专题三十九:SDIO

推荐阅读

Zhwj069是网络上小有名气的大V,专注对数码产品的研究和评测。对于各类智能教育产品在孩子生活学习中的作用,他的心中是有疑惑的。趁着小萌教育机器人发布的机会,我们邀请他进行体验,以下是数码达人Zhwj069的评测报告。身为两个孩子的父亲,我一方面希望给孩子高质量的陪伴,一起学习一起游戏,但工作的原因,白天无暇分身,晚上到家一身疲惫又懒得动弹...
(文章来源:工人日报) 距把芯片植入大脑连接手机之后,美国科学家近日又宣布了一项重大技术突破:借助光声断层成像技术,实时控制纳米机器人,让它们准确抵达人体某个部位,进而让纳米机器人实现药物递送,或进行智能微手术。 一般人只知道纳米技术很神奇,但却难以想象这次突破到底有多厉害。在科学家眼里,这次突破蕴含着纳米机器人的一次巨大进步...
电池和电源管理、Wi-Fi、低功耗蓝牙(BLE)、工业IoT解决方案供应商Dialog半导体公司(德国证券交易所交易代码:DLG)日前宣布,其DA7280高清触觉控制驱动IC已获汽车级认证,并且该IC被领先的汽车电子零部件和车载信息设备制造商阿尔卑斯阿尔派(Alps Alpine)公司选中,将结合该公司的HAPTIC™ Reactor线性谐振传动器(LRA)系列中的最新产品Alps Alpin...
  山东石大胜华化工集团股份有限公司于2021年10月29日在武汉市青山区与武汉化学工业区管委会签署了《山东石大胜华化工集团锂电材料生产研发一体化项目投资框架协议》。公司计划项目总投资不少于人民币10亿元,建设锂电材料生产研发一体化项目。   该项目占地约176亩,规划碳酸酯产能22万吨/年,具体为12万吨/年碳酸乙烯酯、5万吨/年碳酸二甲酯、4.5...

史海拾趣

问答坊 | AI 解惑

基于ARM的条码精密测量系统

摘要: 本文介绍了一种基于32位高性能处理器的视觉精密测量系统的软硬件设计。图像传感器采集的条码图像通过精密定位算法得到绝对位移值,由以太网接口实现高速图像采集。该系统适用于高精度定位的各种位移测量。 关键词: ARM;嵌入式系统;视觉 ...…

查看全部问答∨

基于单片机的酒瓶自动计数系统的设计

大家好啊,在这转悠了好几天,发现大家都是高手!我是一名专升本的学生,专科没有学过单片机本科学校因为大部分人都学过所以也就没开这门课,现在要做有关单片机的毕业设计,想请大家帮帮忙,谢谢了!     昨天问了一下老师那个设计一共 ...…

查看全部问答∨

Altera的用IP核设计的信号发生程序

本帖最后由 paulhyde 于 2014-9-15 09:24 编辑 Altera的用IP核设计的信号发生程序  …

查看全部问答∨

LPC1300中文手册(完整版)--无广告

我整理了一下,方便大家阅读,呵呵   …

查看全部问答∨

关于手机开发和JavaEE开发哪个好?

毕业在即,是选择JAVAEE的培训还是接受老师推荐,去做手机开发呢,前提是我是一个没有任何嵌入式基础的专科生。…

查看全部问答∨

如何将SMDK2440变成多个版本?例如我的产品210,对应的BSP是smdk2440210,产品220对应的是smdk2440220

本人菜鸟,现在碰到一个问题,希望向大家求助一下. 现在我的wince目录中的PLATFORM只有smdk2440一个bsp,这样产生了很多不方便的地方. 第一,目前有3个系列的产品,虽然都是基于2440的,但是在BSP上,还是有些地方是不同的,要维护这三个系列的产品.虽然 ...…

查看全部问答∨

急!ARM D/A转换程序实现多种波形输出

ARM D/A转换程序设计 1.编程实现多种波形(正弦波信号、三角波信号、方波信号)的输出,在 DA接口利用示波器观测实验输出。 2.在 LCD上显示信号…

查看全部问答∨

AVR与液晶的直接访问和间接访问

请假,利用AVR实现与液晶屏的访问,如果采用直接访问(给液晶屏分配一个地址空间),直接接到对应的地址和数据线上,对应的RD和WR信号分别接到AVR的RD和WR上。但是如果采用间接访问的话,液晶屏幕的RD和WR信号是不是一般不能接在对应AVR的RD和WR信 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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