//=====================================================================
//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的散列文件相关推荐

  1. 服务器散列值与文件,服务器计算的散列值和客户端安全

    服务器计算的散列值和客户端安全 内容精选 换一换 执行adc命令,系统内部通过ADC与运行环境上的ADA的交互,实现文件传输.设置日志级别.心跳检测等功能,在ADC与ADA交互时,涉及使用密钥证书实现 ...

  2. PHP 文件校验 文件的 MD5 散列值

    PHP   MD5 散列值 应用场景: 1.校验文件的完整性       可用于服务器文件的备份处理. 2.检验文件的重复性      去除服务器上传文件的重复,占用额外空间的问题. 3.校验文件是否 ...

  3. Python学习之路29-序列的修改、散列和切片

    <流畅的Python>笔记. 本篇是"面向对象惯用方法"的第三篇.本篇将以上一篇中的Vector2d为基础,定义多维向量Vector. 1. 前言 自定义Vector类 ...

  4. 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)...

    2019独角兽企业重金招聘Python工程师标准>>> 数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊-- ...

  5. 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)

    数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们--帕蒂.道格.苏珊--每人一把. 3. 苏珊给鲍勃写信,写完后用鲍勃的公钥加密,达到保密的效果. 4 ...

  6. 散列算法 SHA-1,SHA-2和SHA-256之间的区别

    随着SSL证书的普及,以"SHA"开头的算法的知名度也越多越高,但并不是很多人能够完全能分清"SHA"所有的算法,本文将会围绕"SHA"展开 ...

  7. 2.8加密工具与散列

    1.crypt是一个简单的加密工具,它从stdin接受一个文件以及口令作为输入,然后将加密数据输出到stdout(因此要对输入.输出文件使用重定向). eg:$ crypt  < input_f ...

  8. mysql 散列存储_什么是数据库散列存储? - 蚂蚁吞大象的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    什么是数据库散列存储? 上一篇 / 下一篇  2012-11-30 17:25:03 / 个人分类:数据库 (转载自百度空间http://hi.baidu.com/pplboy/item/2d7a26 ...

  9. shiro进行散列算法操作

    shiro最闪亮的四大特征:认证,权限,加密,会话管理 为了提高应用系统的安全性,这里主要关注shiro提供的密码服务模块: 1.加密工具类的熟悉 首先来个结构图,看看shiro提供了哪些加密工具类: ...

最新文章

  1. 9月推荐 | 精选机器学习文章Top10
  2. 管理维护MySQL的SQL语句有哪些_MySQL常用管理SQL语句
  3. 在Tomcat配置JNDI数据源的三种方式
  4. ajax时间控件,带有ajax的JQuery中的插件datetimepicker出错
  5. postgreSQL源码分析——索引的建立与使用——Hash索引(1)
  6. java8 朗姆表达式,java同步数据库时间问题[问题点数:20分,结帖人vtison]
  7. 阿里小二平时和商家交流的时候,明确告知流量喜欢什么样的产品?
  8. 《『若水新闻』客户端开发教程》——06.设计新闻内容UI
  9. 国人项目上了Github全球热榜,之后都发生了什么?
  10. 现在手机屏幕为什么都这么大?
  11. 1500页,40万字,阿里淘系技术2020技术年货来了!
  12. 计算机包括桌面计算机和便携式计算机,【填空题】( )计算机包括桌面计算机和便携式计算机这两种形式。...
  13. python网络爬虫网易云音乐guihub_Github获8300星!用Python开发的一个命令行的网易云音乐...
  14. catia刨面命令_CATIA建模技巧之分割、剖切、右键属性
  15. python计算机视觉_Python计算机视觉编程
  16. x390拆机教程_努比亚拆机换电池教程_pro6拆机换电池教程
  17. auto semicolon insertion 自动分号补齐的坑
  18. better-scroll滚动的同时样式透明度发生变化
  19. ThreadFactory 详解
  20. win xp故障恢复控制台应用实例

热门文章

  1. 标记三维点_细胞器相互作用过程的高速三维全景成像
  2. 中修改环境变量_嵌入式 Linux下永久生效环境变量bashrc
  3. 搭建php帮助中心,帮助中心
  4. MATLAB表白利器
  5. Win7和Win10安装VC6.0注意事项
  6. 学生计算机教室管理规章制度,学校规章制度之小学信息技术教室管理制度
  7. 图像处理 区域删除_FotoWorks XL( 图像处理软件 )中文版分享
  8. 使用Android Studio搭建Android集成开发环境
  9. C# 获取QQ群数据的实现
  10. ConnectivityManager详解