修正STM32F103ZE的散列文件
//=====================================================================
//TITLE:
// 修正STM32F103ZE的散列文件
//AUTHOR:
// norains
//DATE:
// Tuesday 20-October-2010
//Environment:
// KEIL MDK 4.0
// .NET Micro Framework Porting 4.1
// RedCow Board
//=====================================================================
如果你需要编译NativeSample工程,那么不可避免地就需要接触到散列文件。对于MDK来说,所用到的则是scatterfile_tools_mdk.xml文件。只不过,如果你是采用默认生成的数值,那么结果会让你很郁闷。那么,为了能有一个快乐的移植之旅,我们现在就来看看这些数值应该如何更改。
在开始之前,我们先来了解一下向量表。对于CORTEX-M3来说,向量表应该位于0x00000000位置。为什么是这个位置呢?因为复位之后,PC指针指向0x00000000。所以,我们先有这么个概念,在开始调试之后,PC应该指向向量表的地址。
对于原来的散列文件内容,有一点不太喜欢的是,居然将向量表和代码分开了,如:
两者分开之后,如果数值设置不好的话,会有很严重的后果,比如向量表会被一些印射的代码所覆盖,或是向量表没有圆整到2的次幂,等等。所以,这里我是将这两者合而为一,如:
当我们以FLASH方式编译时,内存印射如下:
如果以RAM方式编译,内存印射如下:
完整的散列文件scatterfile_tools_mdk.xml内容如下:
<?xml version="1.0"?>
<ScatterFile xmlns="http://schemas.microsoft.com/netmf/ScatterfileSchema.xsd">
<Set Name="Valid" Value="false"/>
<!-- ################################################################################ -->
<If Name="TARGETLOCATION" Value="RAM">
<Set Name="Heap_Begin" Value="0x20002BFC"/>
<Set Name="Heap_End" Value="0x20002DFC"/>
<Set Name="Stack_Bottom" Value="+0"/>
<Set Name="Stack_Top" Value="0x20002FFC"/>
<Set Name="ER_RAM_BaseAddress" Value="0x20003000"/>
</If>
<If Name="TARGETLOCATION" Value="RAM">
<Set Name="Code_BaseAddress" Value="0x20004000"/>
<Set Name="Code_Size" Value="0x0000C000"/>
<Set Name="Valid" Value="true"/>
</If>
<If Name="TARGETLOCATION" Value="FLASH">
<Set Name="Heap_Begin" Value="0x2000EBFC"/>
<Set Name="Heap_End" Value="0x2000EDFC"/>
<Set Name="Stack_Bottom" Value="+0"/>
<Set Name="Stack_Top" Value="0x2000EFFC"/>
<Set Name="ER_RAM_BaseAddress" Value="0x2000F000"/>
</If>
<If Name="TARGETLOCATION" Value="FLASH">
<Set Name="Config_BaseAddress" Value="0x08070000"/>
<Set Name="Config_Size" Value="0x00010000"/>
<Set Name="Code_BaseAddress" Value="0x08000000"/>
<Set Name="Code_Size" Value="0x00060000"/>
<Set Name="Valid" Value="true"/>
<IfDefined Name="ALTERNATEFLASHLOCATION">
<!-- Set Name="Code_BaseAddress" Value="%Code_BaseAddress + Code_Size%"/ -->
</IfDefined>
</If>
<!-- ################################################################################ -->
<If Name="Valid" Value="false">
<Error Message="Configuration not recognized"/>
</If>
<LoadRegion Name="LR_%TARGETLOCATION%" Base="%Code_BaseAddress%" Options="ABSOLUTE" Size="%Code_Size%">
<ExecRegion Name="ER_%TARGETLOCATION%" Base="%Code_BaseAddress%" Options="FIXED" Size="">
<FileMapping Name="VectorsTrampolines.obj" Options="(+RO, +FIRST)" /> <!-- for vector handlers to be far from the vectors -->
<FileMapping Name="FirstEntry.obj" Options="(+RO)" /> <!-- the entry pointer section goes into this region -->
<FileMapping Name="ramtest.obj" Options="(+RO)" /> <!-- this must live somewhere other than RAM, for all but RAM builds -->
<FileMapping Name="*" Options="(SectionForBootstrapOperations)" />
<FileMapping Name="*" Options="(+RO-CODE)" />
<FileMapping Name="*" Options="(+RO-DATA)" />
</ExecRegion>
<ExecRegion Name="ER_RAM_RO" Base="%ER_RAM_BaseAddress%" Options="ABSOLUTE" Size="">
<FileMapping Name="*" Options="(SectionForFlashOperations)" />
</ExecRegion>
<ExecRegion Name="ER_RAM_RW" Base="+0" Options="ABSOLUTE" Size="">
<FileMapping Name="*" Options="(+RW-DATA, +ZI)" />
</ExecRegion>
<ExecRegion Name="ER_HEAP_BEGIN" Base="%Heap_Begin%" Options="ABSOLUTE" Size="UNINIT">
<FileMapping Name="*" Options="(SectionForHeapBegin)" />
</ExecRegion>
<!-- everything between heapbegin and heapend will be allocated for a heap -->
<ExecRegion Name="ER_HEAP_END" Base="%Heap_End%" Options="ABSOLUTE" Size="UNINIT">
<FileMapping Name="*" Options="(SectionForHeapEnd)" />
</ExecRegion>
<!-- this must go last here to provide a low water mark on the stack -->
<ExecRegion Name="ER_STACK_BOTTOM" Base="%Stack_Bottom%" Options="ABSOLUTE" Size="UNINIT">
<FileMapping Name="*" Options="(SectionForStackBottom)" />
</ExecRegion>
<ExecRegion Name="ER_STACK_TOP" Base="%Stack_Top%" Options="ABSOLUTE" Size="UNINIT">
<FileMapping Name="*" Options="(SectionForStackTop)" />
</ExecRegion>
</LoadRegion>
<IfDefined Name="Config_BaseAddress">
<LoadRegion Name="LR_CONFIG" Base="%Config_BaseAddress%" Options="ABSOLUTE" Size="%Config_Size%">
<ExecRegion Name="ER_CONFIG" Base="%Config_BaseAddress%" Options="FIXED" Size="%Config_Size%">
<FileMapping Name="*" Options="(SectionForConfig)" />
</ExecRegion>
</LoadRegion>
</IfDefined>
</ScatterFile>
看得比较仔细的朋友,可能会发现这句已经被注释掉了:
<!-- Set Name="Code_BaseAddress" Value="%Code_BaseAddress + Code_Size%"/ -->
如果不注释掉的话,那么代码是从高位向低位生长,而这却和STM32F103ZE的实际情况相反。所以这里就必须将其注释掉,以让代码从低位往高位生长。
如果编译的是FLASH方式,可以直接通过MDK下载NativeSample.axf文件到开发板中,就能够正常运行。但如果是RAM方式,还需要配合脚本文件。因为编译的是RAM方式的话,如果PC指针默认指向ARM_Vectors,则执行会出现异常,但原因我还暂时还不清楚。不过,这个有个变通的方式,开始调试时,通过脚本文件将PC指针指向EntryPoint函数即可。和RAM配合的完整的脚本文件内容如下:
FUNC void InitNVIC(void)
{
_WDWORD(0xE000ED08,0x20004000);
}
InitNVIC();
PC = EntryPoint;
需要注意的是,这个脚本文件只能配合RAM方式,如果是FLASH,因为ARM_Vectors的位置和向量表寄存器的数值不符,则会导致程序异常。
转载于:https://www.cnblogs.com/wodeyitian/archive/2010/10/20/2460287.html
修正STM32F103ZE的散列文件相关推荐
- 服务器散列值与文件,服务器计算的散列值和客户端安全
服务器计算的散列值和客户端安全 内容精选 换一换 执行adc命令,系统内部通过ADC与运行环境上的ADA的交互,实现文件传输.设置日志级别.心跳检测等功能,在ADC与ADA交互时,涉及使用密钥证书实现 ...
- PHP 文件校验 文件的 MD5 散列值
PHP MD5 散列值 应用场景: 1.校验文件的完整性 可用于服务器文件的备份处理. 2.检验文件的重复性 去除服务器上传文件的重复,占用额外空间的问题. 3.校验文件是否 ...
- Python学习之路29-序列的修改、散列和切片
<流畅的Python>笔记. 本篇是"面向对象惯用方法"的第三篇.本篇将以上一篇中的Vector2d为基础,定义多维向量Vector. 1. 前言 自定义Vector类 ...
- 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)...
2019独角兽企业重金招聘Python工程师标准>>> 数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊-- ...
- 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)
数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们--帕蒂.道格.苏珊--每人一把. 3. 苏珊给鲍勃写信,写完后用鲍勃的公钥加密,达到保密的效果. 4 ...
- 散列算法 SHA-1,SHA-2和SHA-256之间的区别
随着SSL证书的普及,以"SHA"开头的算法的知名度也越多越高,但并不是很多人能够完全能分清"SHA"所有的算法,本文将会围绕"SHA"展开 ...
- 2.8加密工具与散列
1.crypt是一个简单的加密工具,它从stdin接受一个文件以及口令作为输入,然后将加密数据输出到stdout(因此要对输入.输出文件使用重定向). eg:$ crypt < input_f ...
- mysql 散列存储_什么是数据库散列存储? - 蚂蚁吞大象的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
什么是数据库散列存储? 上一篇 / 下一篇 2012-11-30 17:25:03 / 个人分类:数据库 (转载自百度空间http://hi.baidu.com/pplboy/item/2d7a26 ...
- shiro进行散列算法操作
shiro最闪亮的四大特征:认证,权限,加密,会话管理 为了提高应用系统的安全性,这里主要关注shiro提供的密码服务模块: 1.加密工具类的熟悉 首先来个结构图,看看shiro提供了哪些加密工具类: ...
最新文章
- 9月推荐 | 精选机器学习文章Top10
- 管理维护MySQL的SQL语句有哪些_MySQL常用管理SQL语句
- 在Tomcat配置JNDI数据源的三种方式
- ajax时间控件,带有ajax的JQuery中的插件datetimepicker出错
- postgreSQL源码分析——索引的建立与使用——Hash索引(1)
- java8 朗姆表达式,java同步数据库时间问题[问题点数:20分,结帖人vtison]
- 阿里小二平时和商家交流的时候,明确告知流量喜欢什么样的产品?
- 《『若水新闻』客户端开发教程》——06.设计新闻内容UI
- 国人项目上了Github全球热榜,之后都发生了什么?
- 现在手机屏幕为什么都这么大?
- 1500页,40万字,阿里淘系技术2020技术年货来了!
- 计算机包括桌面计算机和便携式计算机,【填空题】( )计算机包括桌面计算机和便携式计算机这两种形式。...
- python网络爬虫网易云音乐guihub_Github获8300星!用Python开发的一个命令行的网易云音乐...
- catia刨面命令_CATIA建模技巧之分割、剖切、右键属性
- python计算机视觉_Python计算机视觉编程
- x390拆机教程_努比亚拆机换电池教程_pro6拆机换电池教程
- auto semicolon insertion 自动分号补齐的坑
- better-scroll滚动的同时样式透明度发生变化
- ThreadFactory 详解
- win xp故障恢复控制台应用实例