源:外部SRAM实验,让STM32的外部SRAM操作跟内部SRAM一样

  前几天看到开源电子论坛(openedv.com)有人在问这个问题,我特意去做了这个实验,这样用外部SRAM就跟用内部SRAM一样,不用自己去申请内存,也不用考虑什么内存地址,一切让编译器自己去解决。

  废话不多说,我直接拿原子哥的战舰开发板库函数版的外部SRAM实验来修改。在库函数的system_stm32f10x.c这个初始化文件当中其实就已经有外部SRAM的初始化,我们只要增加“#define DATA_IN_ExtSRAM 1”这句宏定义

#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL) /* #define DATA_IN_ExtSRAM */ #define DATA_IN_ExtSRAM 1 #endif 

  再编译的时候就会把外部SRAM的初始化编译进去,初始化的代码大家可以去看文件中的void SystemInit_ExtMemCtl(void) 这个函数。然后我们在工程设置那里把外部SRAM地址增加进去,如下图

修改启动文件中的中的第39行,把__initial_sp 修改成 __initial_sp  EQU 0x20000000 + Stack_Size

然后我们把Main中的testsram中的地址去掉,让编译器自己去指定地址

再把原子哥的外部SRAM的初始化注释掉,因为前面已经在System_init已经初始化了。其实这里我们可以把原子的SRAM.c文件去掉不用它了,我这里没去掉,其实只是为了能正常调用fsmc_sram_test()来测试实验结果

到这里我们可以编译了,下载到开发板,我们就可以看到实验结果

我们继续深入点,看看testsram[]这个大数组到处编译在到哪里去了,用IDA64来反汇编下编译出来的AXF文件

可以看到testsram这个大数组自动编译到外部sram的0x68000000这个地址上。我们再试试再定义几个大数组看看

再来看看编译后的结果

可以看到每个大数组都由编译器自己分配了内存的地址,压根不用我们自己去定义。

到这里相信大家会有一个疑问,那编译是怎么来决定把哪些变量定义在内部SRAM,那些定义在外部SRAM。这一点我也研究清楚,我只知道编译会优先把变量都定义外部SRAM,当外部SRAM不够用情况才会定义在内部SRAM上,至于怎么让编译优先使用内部SRAM,我也没有搞明白。目前我能做到的是把已经初始化的全局变量都放在SRAM,做法是修改散列文件,让RW只在内存SRAM上编译。

去掉小红框的勾,然后点击Edit我们来修改SRAM.sct文件,也就是编译散列文件

把RW_RAM1中(也就是外部SRAM)的+RW去掉,这样已经初始化的全局变量就只会编译在内部SRAM中

重新编译下工程,再来反汇编下看看编译结果

可以看到usmart_nametab[]这个已经初始化的数组编译在内部SRAM上,adc2[]这个未初始化的数组,数组的大小比较而且能在内部Sram编译得下的,却还是编译在外部SRAM上。

最后散列相关的知识,大家可以看看这里http://blog.csdn.net/lindabell/article/details/8957968#0-qzone-1-11984-d020d2d2a4e8d1a374a433f596ad1440

前面没有修改启动文件,其它变量全部在内部SRAM的时候,程序运行是没有问题,减小数组的时候程序运行不起来,修改前面的红字部分后,程序就可以运行起来,但是LCD偶尔正常,偶尔不正常,调试下感觉是延时的问题,没有再继续调试了

转载于:https://www.cnblogs.com/LittleTiger/p/4596013.html

外部SRAM实验,让STM32的外部SRAM操作跟内部SRAM一样(转)相关推荐

  1. stm32 内部sram大小_让STM32的外部SRAM操作跟内部SRAM一样

    让 STM32 的外部 SRAM 操作跟内部 SRAM 一样 前几天看到开源电子论坛 (openedv) 有人在问这个问题,我特意去做了这个 实验,这样用外部 SRAM 就跟用内部 SRAM 一样,不 ...

  2. 外部中断实验 编写程序学习外部中断的电平触发方式。无中断时发光让发光二极管从左到右依次点亮,有外部中断请求时,4位数码管从0000开始加1显示(加到9999后复位为0000),同时蜂鸣器报警。

    编写程序学习外部中断的电平触发方式.无中断时发光让发光二极管从左到右依次点亮,有外部中断请求时,4位数码管从0000开始加1显示(加到9999后复位为0000),同时蜂鸣器报警. 程序: #inclu ...

  3. [Keil][Verilog][微机原理] 流水灯、存储器、外部中断实验_北京邮电大学计算机原理与应用课程实验报告

    计算机原理与应用实验-流水灯.存储器.外部中断实验 1 实验一 流水灯实验 1.1 实验目的 掌握ARM开发工具的使用. 掌握基本IO的使用. 1.2 实验原理及内容 电路结构图 实现流水灯的电路结构 ...

  4. 外部 SRAM 实验

    IS62WV51216是ISSI(Integrated Silicon Solution, Inc)公司生产的一颗16位宽512K(512*16,即1M字节)容量的CMOS静态内存(SRAM)芯片. ...

  5. hal库开启中断关中断_「正点原子NANO STM32开发板资料连载」第十章 外部中断实验...

    1)实验平台:ALIENTEK NANO STM32F411 V1开发板 2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第十章 外 ...

  6. gd32f303 设计中断优先级_ALIENTEK 阿波罗 STM32F767 开发板资料连载第九章 外部中断实验...

    1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第九章 外部中断实验 这 ...

  7. EXIT外部中断实验——EXTI

    外部中断概述: STM32的每个IO都可以作为外部中断输入. STM32的中断控制器支持19个外部中断/事件请求: 线0~15:对应外部IO口的输入中断. 线16:连接到PVD输出. 线17:连接到R ...

  8. STM32 EXTI外部中断的使用

    简介: 1.中断系统 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行 中断优先级:当有多个 ...

  9. 基于STM32F103ZET6库函数外部中断实验

    基于STM32F103ZET6库函数外部中断实验 外部中断简介 IO 口外部中断的一般步骤 软件设计 外部中断简介 通过板载的 3 个按键,控制板载的两个 LED 的亮灭以及蜂鸣器的发声. 代码主要分 ...

最新文章

  1. ORA-06502 when awr report produce
  2. 系统间通信1:阻塞与非阻塞式通信A
  3. python 单例模式内存泄露_彻底搞懂Java内存泄露
  4. java 枚举类型enum
  5. Gradle: 警告:编码 GBK 的不可映射字符
  6. find 命令_Linux下查找文件:find 命令
  7. IPhone开发 用子类搞定不同的设备(iphone和ipad)
  8. 双非高校硕士一作发学校首篇Nature后,选择离开科研当公务员,本人及导师回应...
  9. python——rang函数、for、braek循环
  10. 10个重要的机器学习术语
  11. 项目代码matlab
  12. 高校应该使用 Drupal 的10大理由
  13. java检查页面ajax请求,Java AJAX电子邮件检验示例
  14. matlab 倒位序fft程序,FFT算法设计与实现
  15. flog和flag_立flag是什么梗 立个flag是什么意思
  16. 【地球科学】常用的地理投影坐标系介绍(笔记)
  17. python练手经典100例项目-Python 的练手项目有哪些值得推荐?
  18. android studio 实例代码,android studio学习之一(示例代码)
  19. vue 验证公民身份证号 并 自动 获取 性别、年龄、生日
  20. 自编码器(autoencoder)了解一下

热门文章

  1. 4.C++深入理解 面向对象部分3
  2. php扩展可以通过pecl 或者phpize 安装
  3. anguar4 共享服务在多个组件中数据通信
  4. Linux不同发型版本(Debian REHL)与软件包管理器(RPM dpkg)的概念
  5. Swift基础语法学习-4.Bool类型
  6. Node进阶:核心模块http简介
  7. 缓存框架——Redis(一)
  8. oracle asm 错误集
  9. IDC 网络数据存储
  10. 春Phone计划 51cto沙龙郑州站活动