stm32专题三十八:在SRAM中调试代码

发布者:陈书记最新更新时间:2021-11-02 来源: 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

推荐阅读最新更新时间:2024-11-18 04:56

单片机学习之STM32中断
简介:STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。 1.中断优先级管理 嵌套向量中断控制器:Nested Vectored Interrupt Controller (NVIC) CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。 STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。 STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。 STM32F103系列上面,又只有60个可屏蔽中断(在
[单片机]
MAVLink学习之路04_MAVLink移植到STM32具体步骤
1写在前面 《MAVLink学习之路》前面三篇文章,可以说是一些基础知识,也是为本文做的准备工作(建议初学者先了解前面三篇文章)。 本文主要内容: MAVLink移植主要步骤 MAVLink移植过程要点 提示:为方便广大初学者朋友尽快掌握MAVLink,我在文末提供MAVLink发送接收例程(基于STM32硬件、MDK-ARM和EWARM开发环境)。 为了方便大家平时公交、地铁、外出办事也能用手机随时随地查看该教程,本文章收录于【MAVLink学习之路】,在微信公众号回复【MAVLink学习之路】即可查看。 2 MAVLink移植主要步骤 2.1 移植说明 本文主要针对MAVLink C源代码移植进行讲述。其中,MAVLink的C
[单片机]
MAVLink学习之路04_MAVLink移植到<font color='red'>STM32</font>具体步骤
STM32低功耗总结
本文主要解读STM32低功耗模式的机制,并不侧重STM32低功耗的程序实现,而且借助STM32固件库实现STM32低功耗会变的非常简单。 一、STM32芯片性能 使用芯片型号:stm32,CORTEX -M0.封装TSSOP20. 运行模式:内部时钟(HSI),系统时钟频率采用48MHZ。 工作电压:3.3V 芯片具体参数如下: 二、芯片功耗 功耗: 芯片工作模式: 工作模式:外设正常运行,内核CPU及SRAM供电,未使用外设的时钟默认关闭。 睡眠模式:只有CPU停止工作,各个外设正常工作,依靠任何中断/事件唤醒。 停机模式:1.8V供电区域时钟被停止,内部HSI,PLL,外部时钟HSE均关闭,同时电压检测
[单片机]
<font color='red'>STM32</font>低功耗总结
管理STM32 MCU中的内存保护单元
1前言 本应用笔记介绍如何管理 STM32 产品中的内存保护单元(MPU)。MPU 是用于存储器保护的可选组件。STM32 微控制器(MCU)中嵌入 MPU 之后变得更稳健可靠。在使用 MPU 之前,必须对其进行编程并加以启用。如果 MPU 没有启用,则存储系统的行为不会变化。 2概述 MPU 可以使嵌入式系统更加稳健和安全:• 禁止用户应用程序破坏关键任务(例如操作系统核心)使用的数据• 将 SRAM 存储区域定义为非可执行(禁止执行 XN),以防止代码注入攻击• 修改存储访问属性MPU可最多保护16个内存区域。在 Armv6、Armv7 架构(Cortex-M0+、M3、M4、M7)下,这些区域可以依次拥有 8 个子区域(
[单片机]
管理<font color='red'>STM32</font> MCU中的内存保护单元
STM32与LPC17XX中的位带(bit-band)操作理解
支持了位带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写。在 CM3 中,有两个区中实现了位带。其中一个是 SRAM 区的最低 1MB范围,第二个则是片内外设区的最低 1MB范围。这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个 32 位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的。 位带操作的概念其实 30 年前就有了,那还是8051 单片机开创的先河,如今,CM3 将此能力进化,这里的位带操作是 8051 位寻址区的威力大幅加强版。 CM3 使用如下术语来表示位带存储的相关地址: 位带区:支持位带操作的地址区
[单片机]
52. STM32的DAC实验
一。数模转换DAC的原理 STM32的DAC的局限性: 只有大容量的STM32F103x(Flash在256K以上)的型号才有DAC功能。 1. 数模转换原理 DAC模块有2个转换器,每个转换有一个通道。 2. STM32DAC模块的主要特点 3. DAC模块框图 (1)DAC1对应PA4 DAC2对应PA5 (2)数字写在DHRx中,经过一定的时间才转到DORx寄存器中,DORx寄存器我们不能直接写。 (3)可以通过外部触发转换。 (4)可以产生DMA请求。 使用DAC来输出到PA4或PA5,要把PA4或PA5设置成模拟输入。 4. DAC转换 (1)对于DAC_DHRx寄存器根据对齐
[单片机]
52. <font color='red'>STM32</font>的DAC实验
关于ST-Link下载STM32程序的使用
ST-Link非常好用,既可以像JLINK那样在软件中直接下载,,也可以下载Hex文件, 自己买的这种,,,, 其实就是SWD下载模式 安装驱动 所有用到的 链接: http://pan.baidu.com/s/1c10Twsg 密码:m4dx 先安装好驱动现在用软件下载 现在用这个软件下载Hex文件,,,安装步骤可以百度下 ST-Link可以软件下载,也可以下载Hex文件,,关键是比串口下载快,,省时
[单片机]
关于ST-Link下载<font color='red'>STM32</font>程序的使用
STM32学习笔记之ADC
一、基础知识 1. 18个通道,可测16个外部和2个内部信号源,可设置成单侧、连续、扫描、间断模式执行 2. 12位精度 3. 扫描模式,通道0到通道n的自动转化 4. 自校准 5. 按通道配置采样时间 6. 间断模式? 7. 双ADC模式? 8. 供电要求2.4~3.6V 9. 输入范围0~3.6V 二、功能描述 1. 通道选择: STM32的每个ADC模块通过内部的模拟多路开关,可以切换到不同的输入通道并进行转换。在任意多个通道上以任意顺序进行的一系列转换构成成组转换。例如,可以如下顺序完成转换:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。 有2种
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

更多精选电路图
换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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