Keil STM32配置SRAM启动并解决SRAM模式代码跑向中断向量表导致程序跑飞的问题

这篇具有很好参考价值的文章主要介绍了Keil STM32配置SRAM启动并解决SRAM模式代码跑向中断向量表导致程序跑飞的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32的Flash的可擦写次数在10000次,在学习或调试过程中为了延长Flash的寿命,将程序写入SRAM是一个很好的办法。在百度上找到的SRAM启动方法总有各种各样的问题,接下来我将会提供一个完整的思路给大家学会如何配置SRAM启动的环境。

这里用来演示的开发板是STM32F103C8T6

1. 在STM32上调整BOOT引脚

    将STM32的BOOT0和BOOT1上拉,下次RESET(重置)将会进入SRAM启动模式。
    keil sram启动设置,stm32,单片机,嵌入式硬件

2. 打开Keil,新建/打开一个工程

    这个就不要我放截图了吧 = =

3. 创建一个新的Target用于保存SRAM启动配置

    在Explorer(文件浏览器)中,右击Project下面的项(这个项就是一个Target)。

    进入Manage Project Items...

keil sram启动设置,stm32,单片机,嵌入式硬件

在Project targets中,点击添加按钮添加一个新的Target,如“RAMBOOT” (图3),添加完毕后点击OK即可。 

keil sram启动设置,stm32,单片机,嵌入式硬件

在Target选择器中选择“RAMBOOT”。

keil sram启动设置,stm32,单片机,嵌入式硬件

3. 修改内存配置

    打开“魔法棒” -- Options for Target...

keil sram启动设置,stm32,单片机,嵌入式硬件

    在Targets选项卡中,修改下面的内存地址。

    IROM1是内置Flash的地址,IRAM就是SRAM的地址。通过修改这里的地址可以将代码和数据区都放在SRAM上。

    将IROM修改为0x20000000,大小要根据你的开发板的SRAM大小进行修改,比如我这一块是STM32F103C8T6,SRAM大小为20KB(20*1024=20480=0x5000h,16进制可以通过Windows自带计算器的“程序员”功能转化),所以我给ROM分配0x3000内存,RAM则修改成0x20003000,分配剩下的0x2000内存(如图)。

keil sram启动设置,stm32,单片机,嵌入式硬件

    接下来转到Linker选项卡。取消选中Use Memory Layout from Target Dialog,修改R/O(只读数据,也就是ROM)和R/W(读写,也就是RAM)的地址。和刚才的Target一样就行。

keil sram启动设置,stm32,单片机,嵌入式硬件

    接下来修改链接脚本。点击Scatter File右边的三个点,在项目的根目录上创建一个新文件,我这就叫“RAMBOOT.SCT”,然后双击它。

keil sram启动设置,stm32,单片机,嵌入式硬件

    然后点击Edit,Keil就会打开文本编辑器编辑这个文件。然后点OK(一定要点OK,不然白设置了!!!)。

    填入以下内容(之后还需要对这个文件做出一些修改,不用关闭此文件):

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x20000000 0x00003000  {    ; 你在设置里设置的ROM地址
  ER_IROM1 0x20000000 0x00003000  {  ; 这里也一样
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20003000 0x00002000  {  ; 你在设置里设置的RAM地址
   .ANY (+RW +ZI)
  }
}

    保存。然后再打开“魔法棒” -- Option for Target...

    打开Utilities选项卡。单击Settings。

keil sram启动设置,stm32,单片机,嵌入式硬件

    这里也有RAM和FLASH的地址和大小设置。修改成和之前一样的。

keil sram启动设置,stm32,单片机,嵌入式硬件

然后确定,保存设置。

4. 修改链接器脚本

    首先,需要知道开发板在SRAM模式下的启动地址和重置地址在哪里。知道这些地址后,只要往这两个地址放两个正常的启动指令就可以完成引导。

    若你的代码可以正常编译,编译后,点击“调试”按钮。

keil sram启动设置,stm32,单片机,嵌入式硬件

    查看当前程序所在的地址,这就是启动地址,记下来(黄色小箭头或在左边的PC寄存器)

keil sram启动设置,stm32,单片机,嵌入式硬件

    然后点击左上角的RST按钮,再看看一遍地址,也记下来:

keil sram启动设置,stm32,单片机,嵌入式硬件

    知道这些就可以了。然后再看看中断向量表的大小。

    打开项目目录,进入Listing文件夹,看看里面是否有一个map文件。如果没有就打开魔法棒,进入Listing,选中Linker Listing下面的全部,然后再编译。

keil sram启动设置,stm32,单片机,嵌入式硬件

    打开map文件,搜索__Vectors_Size,就能看到向量表的大小。如果看不到就自己算(Vectors_end - Vectors)。记下向量表的大小。

keil sram启动设置,stm32,单片机,嵌入式硬件

   

    还是打开“魔法棒” -- Options for Target...

    进入Linker选项卡,点击Scatter File右边的Edit按钮,然后关闭窗口。之前设置没问题的话这时候Keil就打开了链接器脚本的编辑器(现在应该什么内容都没有)。

    修改链接器的脚本内容如下:

; 本例子针对STM32F103C8T6,其他开发板可能需要做一些修改
; 如果你定义的内存地址不一样,或者你的开发板SRAM启动模式的
; 启动地址和重置地址不一样,则需要对这里的地址进行一些修改
; 需要自己理解一些内容,如什么是段(section/segment),根据
; 刚才记录的启动地址、RST地址和中断向量表大小进行修改

LR_IROM1 0x20000000 0x00003000  {    ; 将ROM的地址定位到0x20000000,大小0x3000
  RO_IRAM1 0x20000000 0x00000100  {  ; 给在0x20000000分配了0x100内存
	*.o (RAMSTART, +First)           ; 将RAMSTART代码段定位到0x20000000
  }
  RO_IRAM2 0x20000100 0x00000100  {  ; 格式同上
	*.o (RAMRESET, +First)           ; 将RAMRESET代码段定位到0x20000100
  }
  RO_IRAM3 0x20000200 FIXED 0x00000100  { ; 向量表占用了0xEC,所以给中断向量表分配了0x100空间
                                          ; fixed避免重叠
    *.o (RESET, +First)              ; 将中断向量表定位到0x20000200
  }
  RO_IRAM4 0x20000300 FIXED 0x20002D00  { ; 其他的ROM数据就放在这里了
    *(InRoot$$Sections)              ; 根链接器定义的所有段
	.ANY (+RO)                       ; 任何只读数据段
    .ANY (+XO)                       ; 任何可执行数据段
  }
  RW_IRAM1 0x20003000 0x00002000  {  ; 将RAM的地址定位读写区
   .ANY (+RW +ZI)                    ; 任何可读写数据
  }
}

     

5. 使用汇编进行引导

    创建一个汇编源码文件并导入(.s文件)。这里我创建了一个叫ramboot.s的文件

keil sram启动设置,stm32,单片机,嵌入式硬件

    将以下内容复制到此文件中:


		AREA RAMSTART, CODE, READONLY ;RAM模式启动用代码段。
									  ;此代码段被链接脚本固定在了0x20000000
		IMPORT Reset_Handler		  ;Reset_Handler是STM32用于初始化的一段代码
			
STARTPROG	PROC					  ;启动函数
		SPACE 4						  ;留空四个字节,也就是说下一段代码的地址是0x20000004
		B		Reset_Handler		  ;跳转到Reset_Handler
		ENDP                          ;函数结束

		AREA RAMRESET, CODE, READONLY ;RAM重置后跳转的代码段
									  ;此代码段被链接脚本固定在了0x20000100
		IMPORT Reset_Handler		  ;和上面一样

RESETPROG   PROC					  ;重置函数
		SPACE 8						  ;留空八个字节,也就是说下一段代码的地址是0x20000108
		B		Reset_Handler		  ;跳转到Reset_Handler
		ENDP						  ;函数结束
		END                           ;汇编结束

6. 重定位中断向量表

    打开system_stm32f10x.c,找到此预定义

#define VECT_TAB_OFFSET 0x0

    把它修改为

#ifdef VECT_TAB_SRAM
#define VECT_TAB_OFFSET  0x200 //根据在链接脚本配置的中断向量表的位置修改
                               //跟我的一样的话就不用改了
#else
#define VECT_TAB_OFFSET  0x0
#endif

    保存,再打开魔法棒,打开C/C++选项卡,添加预定义:VECT_TAB_SRAM

    记得与其他预定义用逗号分开。

最后,编译程序,然后打开keil的调试功能,就成功启动SRAM模式了。中断也正常运行。

不停的开发板可能有不同的情况,可能需要根据不同的开发板修改一些地方。文章来源地址https://www.toymoban.com/news/detail-767999.html

到了这里,关于Keil STM32配置SRAM启动并解决SRAM模式代码跑向中断向量表导致程序跑飞的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32的SRAM

    SRAM的介绍 STM32F407ZGT6自带了 192K字节的 SRAM。内存要求高的场合, STM32F4自带的这些内存就不够用了。 XM8A51216 是深圳星忆存储科技有限公司生产的一颗(512*16,即 1M 字节)容量的 CMOS 静态内存芯片。 啥是CMOS? 特点 该芯片具有如下几个特点: ⚫ 高速。具有最高访问速度 10

    2023年04月15日
    浏览(36)
  • STM32+ESP8266(AT固件)连接阿里云物联网 保姆级教学(附代码) --3. STM32硬件连接+keil代码修改

    提示:这里是从实际应用如何使用教学配置,未从原理讲解,适合小白从零开始到成功,比较有成就感 STM32+ESP8266(AT固件)连接阿里云物联网系列保姆级教学 1. 创建产品和设备 2. 设置产品Topic数据和功能定义设备物模型数据显示 3. 硬件连接+代码修改 4. Web数据可视化 5.功能

    2024年02月05日
    浏览(50)
  • 【STM32】FSMC——扩展外部SRAM

    🐱作者:一只大喵咪1201 🐱专栏:《STM32学习》 🔥格言: 你只管努力,剩下的交给时间! STM32控制器芯片内部有一定大小的SRAM及FLASH作为内存和程序存储空间,但当程序较大,内存和程序空间不足时,就需要在STM32芯片的外部扩展存储器了。STM32F103ZE系列芯片可以扩展外部

    2023年04月08日
    浏览(83)
  • Keil STM32F103系统时钟配置过程(标准库)

    平时我在做STM32项目的时候,一般是用别人的工程包,有时用别人的工程包的系统时钟不对,需要检查,下面是系统时钟配置过程。 1:在工程找到文件startup_stm32f10x_hd.s并打开,然后找到SystemInit,如下图 2:选择SystemInit,跳转到SystemInit函数,如下图: 3:SystemInit函数如下图:

    2024年02月16日
    浏览(64)
  • STM32启动模式详解

    一个单片机最小系统由电源、晶振、下载电路、BOOT电路、和复位电路组成。少一个单片机都启动不了。 BOOT电路本质上是单片机的引脚,在ESP32中BOOT电路被称为称为GPIO_Strapping管脚,引脚图如下: 作用: BOOT电路的作用是用于确定单片机的启动模式(启动模式后面会有说明)

    2024年02月10日
    浏览(38)
  • 还在老一套?STM32使用新KEIL5的IDE,全新开发模式RTE介绍及使用

    Keil新版本出来了,推出了一种全新开发模式RTE框架( Run-Time Environment),更好用了。然而网上的教程资料竟还都是把Keil5当成Keil4来用,直接不使用这个功能。当前正点原子或野火的教程提供的例程虽有提到Keil5,但也是基本上当Keil4来用,还是传统的模式或标准库或HAL库。当然

    2024年02月05日
    浏览(82)
  • 解决keil5.38编译stm32报四个错误问题

     以上为错误截图,一下为错误信息 Start/core_cm3.c(445): error: non-ASM statement in naked function is not supported   uint32_t result=0;   ^ Start/core_cm3.c(442): note: attribute is here uint32_t __get_PSP(void) __attribute__( ( naked ) );                                           ^ Start/core_cm3.c(465): error: paramet

    2024年02月08日
    浏览(60)
  • 【STM32】FSMC—扩展外部 SRAM 初步使用 1

    基于野火指南者《零死角玩转 STM32F103—指南者》的学习 STM32F103系列 1.详细功能参看《STM32F10x参考手册》,这边是概述 是一个外设,挂载在AHB总线下。 可以用于驱动包括 SRAM 、 NOR FLASH 以及 NAND FLSAH 类型的存储器,不能驱动如 SDRAM 这种动态的存储器 STM32F429 系列的控制器中,

    2024年02月20日
    浏览(40)
  • STM32复习笔记(五):FSMC连接外部SRAM

    目录 Preface: (一)原理相关 (二)CUBEMX配置 (三)轮询方式读写 (四)DMA方式读写 STM32F4有一个FSMC(Flexible Static Memory Controller,可变静态存储控制器),可以用来驱动8080接口的TFT LCD,我之前就写过一篇blog,是用FSMC来驱动4.3寸液晶屏;此外,还可以用FSMC来连接外部的各

    2024年02月03日
    浏览(45)
  • STM32深入系列01——内存简述(Flash和SRAM)

    ==== 文章汇总(有代码汇总) ==== 最近学到了 内存池、IAP 相关的知识,虽然明白大致的过程,但是对于具体的很多数字还是有些似懂非懂,因此又回来稍微细致的总结一下,方便理解。 STM32是一个 32位 的单片机,因此,它有 32根地址线 ,每个地址线有两种状态:导通 或 不

    2024年02月09日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包