硬件采用 STM32F429 + W9825G6KH 32M SDRAM
SDRAM设置参照 【正点原子】阿波罗STM32F429开发板资料 实验13 SDRAM实验

片外RAM地址访问:
方式一:直接地址访问

#define Bank5_SDRAM_ADDR    ((u32)(0XC0000000)) //SDRAM开始地址unsigned int temp=123456789;
*(vu32*)(Bank5_SDRAM_ADDR+n)=temp;    //写入
temp=*(vu32*)(Bank5_SDRAM_ADDR+n);    //读出

因为32位数据会占用4个BYTE内存地址,所以下一个可读写的地址为*(vu32*)(Bank5_SDRAM_ADDR+n+4)

方式二:宏定义函数

#define SDRAM_ADDR32(addr) *((vu32*)(Bank5_SDRAM_ADDR+addr*4))SDRAM_ADDR32(addr)=temp; //写入
temp=SDRAM_ADDR32(addr));  //读出

方式三:定义数组指定片外地址

u16 testsram[n] __attribute__((at(0XC0000000)));
__align(32) u8 mem2base[n] __attribute__((at(0XC0100000)));

align(32)定义数组为 32 字节对齐
首先,attribute,这个是 用来指定变量或结构位域的特殊属性,该关键字后的双括弧中的内容是属性说明。
然后是at关键字,该关键字可以用来设置变量的绝对地址,也就是你可以通过这个关键字,指定某个变量处于内存里面的某个给定的地址.
不能在函数内定义, 局部变量是存放在栈区的, 栈区由编译器自动分配释放, 不能自定义绝对地址 你可以放在函数外,作为全局变量,把大的数组定义在函数内部,栈都溢出了。

方式四:指针访问


volatile unsigned int  *p_test = (vu32*)(Bank5_SDRAM_ADDR+n);p_test[0]=temp;//写入
p_test[1]=temp+1;//写入,此时SDRAM地址自动+4;
.......temp=p_test[n];//读出//----------------------------------------------------------volatile int  *p_test = (volatile int*)(Bank5_SDRAM_ADDR+10);
p_test=(int *) malloc(sizeof(int)*n);
if(p_test== NULL) {statue=FALSE;return statue;}
p_test[0]=-123456789;
p_test[1]=-987654321;
//     p_test[0]=*(volatile int*)(Bank5_SDRAM_ADDR+10);
//     p_test[1]=*(volatile int*)(Bank5_SDRAM_ADDR+14);
printf("p_test[0] = %d\n", p_test[0]);
printf("p_test[1] = %d\n", p_test[1]); free(p_test);
p_test=NULL;
//测试OK

Keil MDK 使用malloc()&free()
1、勾选MicroLIB
2、#include “stdlib.h”
或程序包含头文件:rt_heap.h,stdlib.h。注意不要勾选MicroLIB。???

不能够直接这样读写浮点数

float  *p_test = (float*)(Bank5_SDRAM_ADDR+n);

这样读写*p_test程序会死掉。

方式五:浮点数访问

float  buf_ftest[10] __attribute__((at(0XC0000000)))={0};
float  buf_ftest1[10]={0};
..............for(int i=0;i<10;i++){buf_ftest[i]=-789123.3216+i;}delay_ms(1);for(int i=0;i<10;i++){buf_ftest1[i]=buf_ftest[i];}

大神在此:
STM32_KEIL 变量指定存储区域

   RW_RAM1 0xC0000000 UNINIT 0x2000000  {  ; RW data.ANY (sdram_area)}

测试上面链接的指定区域自动分配地址
1、unsigned char

unsigned char sram_buf[10]SDRAM_AREA_ATTRIBUTES={0}  ;
unsigned char sram_buf1[10]SDRAM_AREA_ATTRIBUTES={0}  ;
uint32_t sram_buf_addr[10];
uint32_t sram_buf1_addr[10];
....................for(int i=0;i<10;i++){sram_buf[i]=i;sram_buf1[i]=i+20;}delay_ms(1);for(int i=0;i<10;i++){sram_buf_addr[i]=(uint32_t)&(sram_buf[i]);sram_buf1_addr[i]=(uint32_t)&(sram_buf1[i]);}

结果:

2、float

float sram_buf[10]SDRAM_AREA_ATTRIBUTES={0}  ;
float sram_buf1[10]SDRAM_AREA_ATTRIBUTES={0}  ;
uint32_t sram_buf_addr[10];
uint32_t sram_buf1_addr[10];
............................for(int i=0;i<10;i++){sram_buf[i]=-789123.3216+i;sram_buf1[i]=-789123.3216+i+20;}delay_ms(1);for(int i=0;i<10;i++){sram_buf_addr[i]=(uint32_t)&(sram_buf[i]);sram_buf1_addr[i]=(uint32_t)&(sram_buf1[i]);}

结果:

STM32F429 SDRAM片外内存读写笔记相关推荐

  1. Android开发笔记(二十八)利用Application实现内存读写

    全局变量 C/C++有所谓的全局变量,因为全局变量保存在内存中,所以操作全局变量就是操作内存,其速度远比操作数据库或者操作文件快得多,而且工程里的任何代码都可以引用全局变量,因此很多时候全局变量是共享 ...

  2. jvm 堆外内存_NIO效率高的原理之零拷贝与直接内存映射

    更多内容,欢迎关注微信公众号:全菜工程师小辉~ 前言 在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,彻底搞懂NIO效率高的原理. 这篇博客将针对第三个原因,进行更详细的讲 ...

  3. Java堆外内存的使用

    堆外内存的回收见HeapByteBuffer和DirectByteBuffer以及回收DirectByteBuffer 基本类型长度 在Java中有很多的基本类型,比如: byte,一个字节是8位bi ...

  4. 一文探讨堆外内存的监控与回收

    引子 记得那是一个风和日丽的周末,太阳红彤彤,花儿五颜六色,96 年的普哥微信找到我,描述了一个诡异的线上问题:线上程序使用了 NIO FileChannel 的 堆内内存作为缓冲区,读写文件,逻辑可 ...

  5. MappedByteBuffer,可以让文件直接在内存(堆外内存)修改,操作系统不需要拷贝一次。而如何同步到文件由NIO来完成

    package com.atguigu.nio;import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import ja ...

  6. haddler处理队列 netty_Netty堆外内存泄漏排查,这一篇全讲清楚了

    上篇文章介绍了Netty内存模型原理,由于Netty在使用不当会导致堆外内存泄漏,网上关于这方面的资料比较少,所以写下这篇文章,专门介绍排查Netty堆外内存相关的知识点,诊断工具,以及排查思路提供参 ...

  7. 【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优...

    一.前述 Spark中调优大致分为以下几种 ,代码调优,数据本地化,内存调优,SparkShuffle调优,调节Executor的堆外内存. 二.具体    1.代码调优 1.避免创建重复的RDD,尽 ...

  8. JVM--Java堆外内存--使用/作用

    原文网址:JVM--Java堆外内存--使用/作用_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java的堆外内存.包括:堆外内存介绍.创建/回收方法.为什么堆外内存能够提升IO效率. 堆外内存简 ...

  9. Java堆外内存:堆外内存回收方法

    一.JVM内存的分配及垃圾回收 对于JVM的内存规则,应该是老生常谈的东西了,这里我就简单的说下: 新生代:一般来说新创建的对象都分配在这里. 年老代:经过几次垃圾回收,新生代的对象就会放在年老代里面 ...

最新文章

  1. java资料——线性表(转)
  2. Redis第一集:Windows下安装Redis和测试
  3. Eclipse和MyEclipse 手动设置 Java代码 注释模板
  4. 掘金小册Jenkins大纲准备
  5. poj3076(16*16数独)
  6. 服务器辐射大还是显示器辐射大,显示器一直被吐槽辐射大_液晶显示器_液晶显示器应用技术-中关村在线...
  7. 初步认识Volatile-什么叫缓存一致性呢?
  8. linux源码文件名,Linux中文件名解析处理源码分析
  9. java cookie安全_cookie的安全性问题
  10. 学labview的都是什么人_为什么学美术的人,从来都不曾后悔?
  11. Maven异常总结002---nexus服务器启动失败wrapper | The nexus service was launched, but failed to start.
  12. 编译Android VNC Server(pc远程控制android)
  13. 吃易消化吸收的东西利于长寿
  14. linux系统u盘安装教程图解教程,使用U盘安装Ubuntu的详细图文教程
  15. android平板评测,最火7吋Android平板 三星P1010全面评测
  16. IMX6Q安卓解开温度墙,设置高性能模式
  17. Vue入门(10)axios
  18. 惊!一文看懂Java NIO读写文件
  19. webrtc streamer前端页面js播放摄像头rtsp流
  20. Ubuntu13.04配置完全指南(四)安装常用软件包

热门文章

  1. JAVA web中的盒子模型
  2. java过滤excel换行符_excel 添加换行符,去除换行符:
  3. 购房攻略—打折与返佣金套路
  4. Docker 被禁,K8S 救火!
  5. python数据清洗之学习总结(五、数据清洗之数据统计)
  6. java中两个list对象取交集、差集
  7. 卷积神经网络算法详解
  8. 3.30黄金原油,沪金沪银早间市场行情分析及价格涨跌预测
  9. js如何获取当前时间 并格式化
  10. MySQL 错误代码提示