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闪烁节奏将大大提速。

相关文章
|
Java 算法 程序员
带你读《新一代垃圾回收器ZGC设计与实现》之一:垃圾回收器概述
JDK 11于2018年9月25日正式发布,这个版本引入了许多新的特性,其中最为引人注目的就是实现了一款新的垃圾回收器ZGC。
|
8月前
|
数据采集 Web App开发 安全
爬虫专栏:破解网站检测selenium反爬——“当前环境正在被调试“”
本文记录了一次Selenium爬虫被Gitee安全验证拦截的排查经历。爬虫运行一周后突然失效,频繁触发“安全验证”弹窗,尝试隐藏webdriver特征、更换IP、模拟人工操作等均无效。最终发现:手动访问Gitee完成验证后,环境风险标记解除,爬虫自动恢复正常。表明反爬机制针对的是“访问环境”而非工具本身,人工验证可快速解锁,为同类问题提供简洁高效的解决思路。
748 4
|
1月前
|
弹性计算 JSON BI
阿里云 CLI 询价能力技术手册
阿里云CLI提供OpenAPI调用前精准询价功能(`--estimate-cost`),支持实时预估费用,与事后账单互补。报价与实际订单金额完全一致,覆盖新购、变配等场景。
270 2
|
2月前
|
Web App开发 缓存 安全
Quick BI使用案例25:重启电脑打开Chrome浏览器登录后,不到30分钟提示“未登录,当前请求被禁止”
本文详解Chrome浏览器因本地数据保存策略导致Quick BI登录30分钟内自动退出的成因,并提供两种可选的浏览器设置方案,助您稳定登录、释放产品价值。
|
8月前
|
弹性计算 人工智能 负载均衡
阿里云服务器爆款直降活动简介:轻量应用服务器抢购、99套餐和u2a与AMD云服务器优惠讲解
为了助力更多用户优惠上云,阿里云推出了众多活动,例如云工开物、云资源产品活动、组合购等,其中云服务器爆款直降活动是阿里云推出的云服务器专属活动,活动内的云产品以云服务器产品为主,包括当下轻量应用服务器抢购,云服务器99元套餐,和全新推出的通用算力型u2a实例及第九代计算型c9a、通用型g9a、内存型r9a等实例规格的云服务器均可通过此活动选购。本文为大家讲解具体的活动内容及注意事项,以供参考和选择。
|
2月前
|
人工智能 安全 算法
GEO 行业大清洗:倒闭的不是公司,是整个行业的投机小聪明
本文深度剖析GEO行业2026年集体暴雷的根源:AI技术迭代彻底颠覆旧有商业逻辑。指出虚假繁荣源于信息差红利,而今算法升级、监管加码与品牌认知觉醒共同终结“铺量套利”模式。文章穿透表象,从商业本质、技术底层、人性痛点、产业终局四维拆解,宣告低端中介退场,真GEO已升级为以AI认知基建、品牌信用沉淀为核心的高价值赛道。(239字)
|
9月前
|
人工智能 编解码 数据可视化
构建AI智能体:三十、精雕细琢:驾驭关键词的细微差别,解锁高质量提示词编排与视觉表征
《AI图像生成中的提示词工程艺术》摘要:文章系统阐述了人工智能图像生成中的提示词工程(Prompt Engineering)技术。通过具体案例对比,展示了细微的提示词差异如何导致图像质量的巨大分野,详细解析了提示词的核心要素、语法结构及编排方法。文章提出专业级提示词的多维描述矩阵和权重控制语法,强调精准描述与AI沟通的重要性。同时指出,提示词工程是艺术与科学的结合,需要不断练习和实验才能掌握这项数字时代的关键创造力技能。
1050 11
|
6月前
|
人工智能 自然语言处理 前端开发
写了10万行代码,却毁在配色上?这套指令让后端直男秒变设计总监
这是一篇专为后端及全栈开发者定制的实用指南,旨在解决开发者“代码强但审美弱”的痛点。文章提供了一套核心AI指令,能将DeepSeek等AI变成专业UI设计顾问,快速生成符合大厂规范(Design Token)的配色体系。通过一个后台管理系统的实战案例,演示了如何用AI将“土味”界面瞬间升级为专业级UI,让开发者无需学习设计理论也能搞定高颜值配色。
734 4
|
网络安全
window系统下安装elk
本文介绍了Elasticsearch、Logstash和Kibana(统称ELK栈)8.17.3版本的安装与配置流程。主要内容包括: - **Elasticsearch**:详细描述了从下载到启动服务的步骤,以及`elasticsearch.yml`的关键配置项,并提供了Postman操作示例及常见问题解决方案。 - **Logstash**:涵盖了插件安装、配置文件`logstash.conf`编写及其启动命令。 - **Kibana**:讲解了下载、配置`kibana.yml`和启动过程,确保与Elasticsearch正确连接。
|
设计模式 网络协议 Java
02.单一职责原则详解
单一职责原则(SRP)是面向对象设计的重要原则,强调一个类或模块应仅负责完成一个特定的职责或功能。通过将复杂的功能分解为多个粒度小、功能单一的类,可以提高系统的灵活性、可维护性和可扩展性。本文详细介绍了如何理解单一职责原则,包括方法、接口和类层面的应用,并通过具体例子解释了其优势和判断标准。此外,还探讨了在实际开发中如何平衡类的设计,避免过度拆分导致的复杂性增加。
652 5