SRAM初始化&设置NVIC中断表偏移

简介: 上篇《修改启动代码&重写向量表》文章中我们介绍了中断向量表的编写,这次我们编写SRAM初始化代码,在《调试初步:点亮LED灯》文章中,我们提到了MDK脚本代码,其实这部分代码和MDK脚本代码实现类似的功能

上篇《修改启动代码&重写向量表》文章中我们介绍了中断向量表的编写,这次我们编写SRAM初始化代码,在《调试初步:点亮LED灯》文章中,我们提到了MDK脚本代码,其实这部分代码和MDK脚本代码实现类似的功能。

   1、编写PreStackInit代码

   我们从./DeviceCode/Drivers/Stubs/Processor/stubs_PreStackInit目录到./DeviceCode/Targets/Native/CortexM3/DeviceCode,并修改目录的名字为PreStackInit,下一步我们在子目录RVD_S下的PreStackInit.s中添加如下汇编代码:

             EXPORT  PreStackInit

         IMPORT  PreStackInit_Exit_Pointer

 

         PRESERVE8

 

         AREA SectionForBootstrapOperations, CODE, READONLY

 

         ENTRY

 

PreStackInit

 

; 初始化SRAM

; 使能FSMC时钟

; Enable FSMC clock

         LDR R0,= 0x00000114

         LDR R1,= 0x40021014

         STR R0,[R1]                    

; 使能FSMC相关的GPIO的时钟               

; Enable GPIOD, GPIOE, GPIOF and GPIOG clocks

         LDR R0,= 0x000001E0

         LDR R1,= 0x40021018

         STR R0,[R1]      

 

; SRAM Data lines, NOE and NWE configuration

; SRAM Address lines configuration

; NOE and NWE configuration  

; NE3 configuration

; NBL0, NBL1 configuration

 

         LDR R0,= 0x44BB44BB

         LDR R1,= 0x40011400

         STR R0,[R1]            

 

         LDR R0,= 0xBBBBBBBB

         LDR R1,= 0x40011404

         STR R0,[R1]            

 

         LDR R0,= 0xB44444BB

         LDR R1,= 0x40011800

         STR R0,[R1]            

 

         LDR R0,= 0xBBBBBBBB

         LDR R1,= 0x40011804

         STR R0,[R1]            

 

         LDR R0,= 0x44BBBBBB

         LDR R1,= 0x40011C00

         STR R0,[R1]       

 

         LDR R0,= 0xBBBB4444

         LDR R1,= 0x40011C04

         STR R0,[R1]       

 

         LDR R0,= 0x44BBBBBB

         LDR R1,= 0x40012000

         STR R0,[R1]            

 

         LDR R0,= 0x44444B44

         LDR R1,= 0x40012004

         STR R0,[R1]     

                                             

; FSMC Configuration  

; Enable FSMC Bank1_SRAM Bank

                  

         LDR R0,= 0x00001000

         LDR R1,= 0xA0000010

         STR R0,[R1]     

 

         LDR R0,= 0x00000200

         LDR R1,= 0xA0000014

         STR R0,[R1]     

                  

         LDR R0,= 0x0FFFFFFF

         LDR R1,= 0xA0000114

         STR R0,[R1]     

                  

         LDR R0,= 0x00001001

         LDR R1,= 0xA0000010

         STR R0,[R1]     

 

; 重设向量表的地址 (定位到SRAM起始地址 0x20000000)

         IF TargetLocation="RAM"

             LDR R0,= 0x20000000

             LDR R1,= 0xE000ED08

             STR R0,[R1]     

         ENDIF

 

PreStackEnd

         B     PreStackInit_Exit_Pointer

 

         END

 

其中下面的代码很重要,如果你通过RAM进行调试,并且该中断表位于RAM其实位置,则需要执行该命令。

        IF TargetLocation="RAM"

             LDR R0,= 0x20000000

             LDR R1,= 0xE000ED08

             STR R0,[R1]     

         ENDIF

2、修改./Solutions/STM3210E/NativeSample/NativeSample.proj文件

   在NativeSample.proj文件中作如下修改:

   <ItemGroup>

    <RequiredProjects Include="$(SPOCLIENT)/DeviceCode/Drivers/Stubs/Processor/stubs_PreStackInit/dotNetMF.proj" />

    <DriverLibs Include="cpu_prestackinit_stubs.$(LIB_EXT)" />

   </ItemGroup>

   修改为:

   <ItemGroup>

    <RequiredProjects Include="$(SPOCLIENT)/DeviceCode/Targets/Native/CortexM3/DeviceCode/PreStackInit/dotNetMF.proj" />

    <DriverLibs Include="PreStackInit.$(LIB_EXT)" />

   </ItemGroup>

 

3、修改./Solutions/STM3210E/NativeSample/Scatterfile_tools_mdk.xml文件

   <ExecRegion Name="ER_RAM_RO" Base="0x00000000" Options="ABSOLUTE" Size="0x0005ffe0">

   修改为:

   <ExecRegion Name="ER_RAM_RO" Base="0x20000000" Options="ABSOLUTE" Size="">

 

4、编译测试

上一篇文章和本篇文章所完成的操作其实只是铺垫,外在并没有什么效果表现。不过我们下一步将要做的设置芯片时钟将是重要一步,经过初始化时钟后,我们的开发板将会运行在72M的最高频率上,这时我们原先做LED闪烁节奏将大大提速。

相关文章
|
机器学习/深度学习 人工智能 监控
机器视觉:技术原理、应用与未来发展
机器视觉:技术原理、应用与未来发展
|
Web App开发 缓存 安全
Microsoft Edge 五个神级插件
Microsoft Edge 五个神级插件
2966 0
Microsoft Edge 五个神级插件
|
数据采集 前端开发 JavaScript
捕捉页面的关键元素:用CSS选择器与Puppeteer自动抓取
本文介绍了如何使用 Puppeteer 结合 CSS 选择器抓取动态网页中的关键元素,以亚航网站的特价机票信息为例,通过设置代理 IP、User-Agent 和 Cookie 等技术手段,有效提升爬虫策略,实现高效、稳定的爬取。
343 5
捕捉页面的关键元素:用CSS选择器与Puppeteer自动抓取
|
11月前
|
搜索推荐 数据挖掘 API
淘宝天猫商品评论数据接口丨淘宝 API 实时接口指南
淘宝天猫商品评论数据接口(Taobao.item_review)提供全面的评论信息,包括文字、图片、视频评论、评分、追评等,支持实时更新和高效筛选。用户可基于此接口进行数据分析,支持情感分析、用户画像构建等,同时确保数据使用的合规性和安全性。使用步骤包括注册开发者账号、创建应用获取 API 密钥、发送 API 请求并解析返回数据。适用于电商商家、市场分析人员和消费者。
1068 3
|
12月前
|
存储 前端开发 搜索推荐
ClkLog基于ClickHouse 的百万日活实测报告
自 ClkLog 上线以来,我们不断吸纳用户需求,提升产品的支持能力。今年下半年,我们遇到了日活跃用户数达到百万级别的客户。为了给 ClkLog 用户提供可靠的技术建议和解决方案,同时也为了节省成本,在Clickhouse官方支持下,我们在阿里云上对 ClickHouse 社区版、企业版进行了详细测试和成本分析。
|
人工智能 自然语言处理 搜索推荐
选型攻略 | 智能客服系统该怎么选?(好用的智能客服系统推荐)
智能客服系统的选型需要综合考虑渠道功能、系统性能、客服工作管理、客户管理以及成本效益等因素。目前合力亿捷推出的智能知识库,梳理海量知识,根据不同主题对知识进行分类,使其结构更清晰。
359 0
|
监控 供应链 数据挖掘
ERP系统中的成本控制与降低成本策略解析
【7月更文挑战第25天】 ERP系统中的成本控制与降低成本策略解析
1200 3
|
图形学 开发者
【实战优化】U3D物理引擎碰撞检测精调秘籍:告别穿透与粘滞,重塑真实游戏体验
【7月更文第12天】在Unity3D游戏开发中,精准的碰撞检测是营造沉浸式游戏体验的关键。然而,开发者常面临游戏角色或物体间的碰撞反应不自然,如穿透、粘滞现象,这些问题不仅破坏了游戏的真实感,还严重影响了玩家的体验。本文将深入探讨U3D物理引擎中碰撞检测不准确的根源,并提出一系列行之有效的调优策略,辅以代码实例,帮助开发者打造流畅自然的物理互动。
1106 1
|
机器学习/深度学习 人工智能 网络协议
人工智能平台PAI 操作报错合集之在本地运行Alink Server时没有遇到问题。但是,当您尝试在PAI上运行时出现了错误。如何解决
阿里云人工智能平台PAI (Platform for Artificial Intelligence) 是阿里云推出的一套全面、易用的机器学习和深度学习平台,旨在帮助企业、开发者和数据科学家快速构建、训练、部署和管理人工智能模型。在使用阿里云人工智能平台PAI进行操作时,可能会遇到各种类型的错误。以下列举了一些常见的报错情况及其可能的原因和解决方法。
|
存储 网络协议 网络安全
IP路由详解:网络互联的心脏
【4月更文挑战第22天】
935 7
IP路由详解:网络互联的心脏