STM32F429 SDRAM片外内存读写笔记
硬件采用 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片外内存读写笔记相关推荐
- Android开发笔记(二十八)利用Application实现内存读写
全局变量 C/C++有所谓的全局变量,因为全局变量保存在内存中,所以操作全局变量就是操作内存,其速度远比操作数据库或者操作文件快得多,而且工程里的任何代码都可以引用全局变量,因此很多时候全局变量是共享 ...
- jvm 堆外内存_NIO效率高的原理之零拷贝与直接内存映射
更多内容,欢迎关注微信公众号:全菜工程师小辉~ 前言 在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,彻底搞懂NIO效率高的原理. 这篇博客将针对第三个原因,进行更详细的讲 ...
- Java堆外内存的使用
堆外内存的回收见HeapByteBuffer和DirectByteBuffer以及回收DirectByteBuffer 基本类型长度 在Java中有很多的基本类型,比如: byte,一个字节是8位bi ...
- 一文探讨堆外内存的监控与回收
引子 记得那是一个风和日丽的周末,太阳红彤彤,花儿五颜六色,96 年的普哥微信找到我,描述了一个诡异的线上问题:线上程序使用了 NIO FileChannel 的 堆内内存作为缓冲区,读写文件,逻辑可 ...
- MappedByteBuffer,可以让文件直接在内存(堆外内存)修改,操作系统不需要拷贝一次。而如何同步到文件由NIO来完成
package com.atguigu.nio;import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import ja ...
- haddler处理队列 netty_Netty堆外内存泄漏排查,这一篇全讲清楚了
上篇文章介绍了Netty内存模型原理,由于Netty在使用不当会导致堆外内存泄漏,网上关于这方面的资料比较少,所以写下这篇文章,专门介绍排查Netty堆外内存相关的知识点,诊断工具,以及排查思路提供参 ...
- 【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优...
一.前述 Spark中调优大致分为以下几种 ,代码调优,数据本地化,内存调优,SparkShuffle调优,调节Executor的堆外内存. 二.具体 1.代码调优 1.避免创建重复的RDD,尽 ...
- JVM--Java堆外内存--使用/作用
原文网址:JVM--Java堆外内存--使用/作用_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java的堆外内存.包括:堆外内存介绍.创建/回收方法.为什么堆外内存能够提升IO效率. 堆外内存简 ...
- Java堆外内存:堆外内存回收方法
一.JVM内存的分配及垃圾回收 对于JVM的内存规则,应该是老生常谈的东西了,这里我就简单的说下: 新生代:一般来说新创建的对象都分配在这里. 年老代:经过几次垃圾回收,新生代的对象就会放在年老代里面 ...
最新文章
- java资料——线性表(转)
- Redis第一集:Windows下安装Redis和测试
- Eclipse和MyEclipse 手动设置 Java代码 注释模板
- 掘金小册Jenkins大纲准备
- poj3076(16*16数独)
- 服务器辐射大还是显示器辐射大,显示器一直被吐槽辐射大_液晶显示器_液晶显示器应用技术-中关村在线...
- 初步认识Volatile-什么叫缓存一致性呢?
- linux源码文件名,Linux中文件名解析处理源码分析
- java cookie安全_cookie的安全性问题
- 学labview的都是什么人_为什么学美术的人,从来都不曾后悔?
- Maven异常总结002---nexus服务器启动失败wrapper | The nexus service was launched, but failed to start.
- 编译Android VNC Server(pc远程控制android)
- 吃易消化吸收的东西利于长寿
- linux系统u盘安装教程图解教程,使用U盘安装Ubuntu的详细图文教程
- android平板评测,最火7吋Android平板 三星P1010全面评测
- IMX6Q安卓解开温度墙,设置高性能模式
- Vue入门(10)axios
- 惊!一文看懂Java NIO读写文件
- webrtc streamer前端页面js播放摄像头rtsp流
- Ubuntu13.04配置完全指南(四)安装常用软件包