在 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专题三十九:SDIO
推荐阅读
史海拾趣
广东爱晟电子自成立以来,一直致力于NTC热敏电阻技术的研发和创新。在2010年代初,公司面临技术瓶颈,市场竞争激烈。然而,爱晟电子团队不畏艰难,通过深入研究,成功研发出具有更高精度和稳定性的NTC热敏电阻。这一技术突破迅速获得了市场的认可,公司销售额逐年攀升,奠定了在电子行业的领先地位。
FRIWO公司自成立以来,始终在技术领域保持领先地位。从便携式收录机问世之初,FRIWO就凭借其先进的技术在该领域崭露头角。随后,随着技术的不断进步,FRIWO迅速将业务扩展到Atari计算机、摄影机等新兴领域,并成功成为这些领域的电源解决方案提供商。近年来,FRIWO更是专注于移动电话充电器市场,凭借其卓越的技术实力和创新能力,成为了世界上移动电话充电器的最主要供应商。这一系列的成功,彰显了FRIWO在电子行业中的技术领先地位和多元化发展战略。
为了进一步扩大市场份额,Frequency Devices公司积极实施国际化战略。公司通过参加国际电子展会、建立海外销售网络、与国际知名企业建立合作关系等方式,不断提升品牌国际影响力。同时,公司还根据不同国家和地区的市场特点,定制化开发符合当地需求的高频电子产品。这些努力使得Frequency Devices公司的产品成功打入多个国际市场,实现了全球化布局。
2010年,山东汇科电气技术有限公司在山东淄博成立,标志着汇科公司在电子行业迈出了坚实的第一步。创立之初,公司就确定了以节能环保为发展核心的战略方向。2011年,汇科与日本富士等国内外一线品牌建立了战略合作关系,成为富士一级代理及指定维修中心,这一举措为公司的技术积累和市场拓展奠定了坚实基础。
作为一家有社会责任感的企业,汇科公司始终关注环境保护和可持续发展。公司积极推广绿色生产技术和资源循环利用方案,减少生产过程中的能源消耗和废弃物排放。同时,汇科公司还积极参与社会公益活动,为社区和环境贡献自己的力量。这些举措不仅体现了公司的社会责任担当,也为其赢得了更多客户和合作伙伴的信任和支持。
在LED产业蓬勃发展的背景下,统明亮(DOMINANT)公司在2000年应运而生。它的诞生源于欧司朗(OSRAM)在马六甲工厂的分拆,加上马来西亚财团的加持,这家新公司迅速崭露头角。统明亮公司从成立之初就专注于LED技术的研发和生产,凭借其卓越的技术实力和创新能力,逐渐在电子行业中树立了良好的口碑。经过数年的不懈努力,统明亮在全球贴片式LED领域取得了领先地位,特别是在车用LED封装领域,其产品质量和技术水平均处于行业前列。
摘要: 本文介绍了一种基于32位高性能处理器的视觉精密测量系统的软硬件设计。图像传感器采集的条码图像通过精密定位算法得到绝对位移值,由以太网接口实现高速图像采集。该系统适用于高精度定位的各种位移测量。 关键词: ARM;嵌入式系统;视觉 ...… 查看全部问答∨ |
大家好啊,在这转悠了好几天,发现大家都是高手!我是一名专升本的学生,专科没有学过单片机本科学校因为大部分人都学过所以也就没开这门课,现在要做有关单片机的毕业设计,想请大家帮帮忙,谢谢了! 昨天问了一下老师那个设计一共 ...… 查看全部问答∨ |
如何将SMDK2440变成多个版本?例如我的产品210,对应的BSP是smdk2440210,产品220对应的是smdk2440220 本人菜鸟,现在碰到一个问题,希望向大家求助一下. 现在我的wince目录中的PLATFORM只有smdk2440一个bsp,这样产生了很多不方便的地方. 第一,目前有3个系列的产品,虽然都是基于2440的,但是在BSP上,还是有些地方是不同的,要维护这三个系列的产品.虽然 ...… 查看全部问答∨ |
|
ARM D/A转换程序设计 1.编程实现多种波形(正弦波信号、三角波信号、方波信号)的输出,在 DA接口利用示波器观测实验输出。 2.在 LCD上显示信号… 查看全部问答∨ |
|
请假,利用AVR实现与液晶屏的访问,如果采用直接访问(给液晶屏分配一个地址空间),直接接到对应的地址和数据线上,对应的RD和WR信号分别接到AVR的RD和WR上。但是如果采用间接访问的话,液晶屏幕的RD和WR信号是不是一般不能接在对应AVR的RD和WR信 ...… 查看全部问答∨ |