让Keil MDK将STM32F103的程序编译到RAM中运行

正常情况下STM32的代码经过MDK编译之后是放在FLASH中的,有的时候需要编译到RAM中去运行。在网上找了很多MDK怎么把STM32的代码编译到RAM中运行,发现很多朋友都提到要修改项目的 .sct文件,就是下面这个

让Keil MDK将STM32F103的程序编译到RAM中运行_第1张图片

我折腾了之后发现如果只在这个窗口将IROM的地址改到RAM中也是可以的。这里我用的是正点原子的Mini板子,将RAM一分为二,一半做RAM一半存代码

让Keil MDK将STM32F103的程序编译到RAM中运行_第2张图片

需要注意的是,如果不使用中断的话直接这么配置完就可以跑,但是如果工程中有使用中断就必须将STM32的中断向量表重映射到RAM中,否则中断可能会不正常

在system_stm32f10x.c文件中打开第127行的宏(这个宏默认是关闭的),将向量表映射到RAM里。128行是向量表偏移,如果没有移动中断向量表的话偏移就是0,忽略它就行

让Keil MDK将STM32F103的程序编译到RAM中运行_第3张图片

最后一个问题,MDK将代码编译到RAM后是“不能直接点下载按钮下载代码”的。咳,其实我也不知道怎么说这个T T

手上的是STM32F103RCT6 Corten-M3内核芯片,将jlink的下载地址改成和上面编译的一样之后是点击下载按钮和debug按钮都是可以把代码下载到芯片里面的,唯一让人郁闷的是,明明勾选了下载后复位运行,,,,结果死活没反应

让Keil MDK将STM32F103的程序编译到RAM中运行_第4张图片

进debug、点全速运行是正常的,串口也有输出。但是如果直接点下载,代码是进去了,但是就是没有去运行。。。。boot引脚切换到RAM启动也白搭~~~~~~无奈 

让Keil MDK将STM32F103的程序编译到RAM中运行_第5张图片

不知道是ST公司的原因还是M3核的问题。隐约记得以前似乎在哪本书还是哪个地方上看到过,M4貌似没这毛病

为了不每次都点debug运行程序,其实也是懒得每次改完前面的地址还得把jlink的下载地址改了。。。于是乎使用一个jlink脚本,编译完成之后让MDK自己去调一下就行 (:

一共弄了两个文件,第一个是下面这个.txt

usb
si swd
Speed 2000
Device STM32F103RC (ALLOW OPT. BYTES)
r
loadfile ./Objects/shell.hex
wreg MSP,20006548
SetPC 20000145
regs
go
qc

这个文件其实也没什么,就干两个事情:把hex下载到芯片里面同时设置好PC和MSP,然后跳过去执行

MSP和PC的值在编译完成之后去.map文件中查看就行,一般来说如果之后不再修改工程的编译地址,这两个值是不会变的,所以设置一次就行了(反正我都没改过。。。。CPU上电之后都是从中断开始执行的,所以把PC设置为Reset_Handler的地址直接抄就行。设置MSP的时候要注意,因为MSP是指向栈顶的所以要记得加上栈的大小

让Keil MDK将STM32F103的程序编译到RAM中运行_第6张图片

另一个文件是为了方便MDK调用的.bat文件

@echo off
jlink jlink_cmd.txt
@echo on

设置一下User Command ,让MDK编译完成后去调用上面的.bat文件

让Keil MDK将STM32F103的程序编译到RAM中运行_第7张图片

你可能感兴趣的:(嵌入式)