外部SRAM实验,让STM32的外部SRAM操作跟内部SRAM一样(转)
源:外部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一样(转)相关推荐
- stm32 内部sram大小_让STM32的外部SRAM操作跟内部SRAM一样
让 STM32 的外部 SRAM 操作跟内部 SRAM 一样 前几天看到开源电子论坛 (openedv) 有人在问这个问题,我特意去做了这个 实验,这样用外部 SRAM 就跟用内部 SRAM 一样,不 ...
- 外部中断实验 编写程序学习外部中断的电平触发方式。无中断时发光让发光二极管从左到右依次点亮,有外部中断请求时,4位数码管从0000开始加1显示(加到9999后复位为0000),同时蜂鸣器报警。
编写程序学习外部中断的电平触发方式.无中断时发光让发光二极管从左到右依次点亮,有外部中断请求时,4位数码管从0000开始加1显示(加到9999后复位为0000),同时蜂鸣器报警. 程序: #inclu ...
- [Keil][Verilog][微机原理] 流水灯、存储器、外部中断实验_北京邮电大学计算机原理与应用课程实验报告
计算机原理与应用实验-流水灯.存储器.外部中断实验 1 实验一 流水灯实验 1.1 实验目的 掌握ARM开发工具的使用. 掌握基本IO的使用. 1.2 实验原理及内容 电路结构图 实现流水灯的电路结构 ...
- 外部 SRAM 实验
IS62WV51216是ISSI(Integrated Silicon Solution, Inc)公司生产的一颗16位宽512K(512*16,即1M字节)容量的CMOS静态内存(SRAM)芯片. ...
- hal库开启中断关中断_「正点原子NANO STM32开发板资料连载」第十章 外部中断实验...
1)实验平台:ALIENTEK NANO STM32F411 V1开发板 2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第十章 外 ...
- gd32f303 设计中断优先级_ALIENTEK 阿波罗 STM32F767 开发板资料连载第九章 外部中断实验...
1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第九章 外部中断实验 这 ...
- EXIT外部中断实验——EXTI
外部中断概述: STM32的每个IO都可以作为外部中断输入. STM32的中断控制器支持19个外部中断/事件请求: 线0~15:对应外部IO口的输入中断. 线16:连接到PVD输出. 线17:连接到R ...
- STM32 EXTI外部中断的使用
简介: 1.中断系统 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行 中断优先级:当有多个 ...
- 基于STM32F103ZET6库函数外部中断实验
基于STM32F103ZET6库函数外部中断实验 外部中断简介 IO 口外部中断的一般步骤 软件设计 外部中断简介 通过板载的 3 个按键,控制板载的两个 LED 的亮灭以及蜂鸣器的发声. 代码主要分 ...
最新文章
- ORA-06502 when awr report produce
- 系统间通信1:阻塞与非阻塞式通信A
- python 单例模式内存泄露_彻底搞懂Java内存泄露
- java 枚举类型enum
- Gradle: 警告:编码 GBK 的不可映射字符
- find 命令_Linux下查找文件:find 命令
- IPhone开发 用子类搞定不同的设备(iphone和ipad)
- 双非高校硕士一作发学校首篇Nature后,选择离开科研当公务员,本人及导师回应...
- python——rang函数、for、braek循环
- 10个重要的机器学习术语
- 项目代码matlab
- 高校应该使用 Drupal 的10大理由
- java检查页面ajax请求,Java AJAX电子邮件检验示例
- matlab 倒位序fft程序,FFT算法设计与实现
- flog和flag_立flag是什么梗 立个flag是什么意思
- 【地球科学】常用的地理投影坐标系介绍(笔记)
- python练手经典100例项目-Python 的练手项目有哪些值得推荐?
- android studio 实例代码,android studio学习之一(示例代码)
- vue 验证公民身份证号 并 自动 获取 性别、年龄、生日
- 自编码器(autoencoder)了解一下