对mini2440存储器的理解和使用

2020-05-20来源: eefocus关键字:mini2440  存储器  S3C2440

S3C2440是32位的处理器理论寻址范围为2^32即4G,S3C2440使用[26:0]作为地址线,寻址范围128M,使用[29:27]作为bank选择信号,所以S3C2440可以连接8个外设,如果全部连接存储器就可以达到1GB的内存。在S3C2440中内存为64MB,它使用了第6和第7个bank连接两片32MB的SDAM。由于外设多种多样其位宽也不尽相同,所以每个bank的数据宽度是可以软件编程控制的。


为什么下载程时要下载到0x30000000地址单元执行,或下载文件到0x30000000地址单元再通过写操作写到NAND FLASH?


因为两片SDARM在bank6和bank7上面连接,通过[29:27]的信号决定选择那块bank,所以bank6的起始地址为0x30000000。


对应关系如下表:

注:bank7的起始地址由bank6的结束地址所决定。


对64MB的SDARM理解:


较大的存储体是由小的存储体进行字扩展和位扩展构成。S3C2440中的64MB(16Mb×32)SDARM实际是由16块4Mb×8的SDARM组成。拥有4个片面内Bank,通过地址线A25,A24进行选择某一个Bank。

http://blog.csdn.net/c1194758555

存储管理器对内存访问是必须知道其位宽、行地址、列地址、存储周期,对于SDARM还要知道其刷新周期等信息,这都可以通过相应的寄存器设置。


存储管理器的使用:


初始化存储管理器,把ARM的4K代码拷贝到SDARM上执行。


Makefile文件:


led_mempory: start.S led.c

arm-linux-gcc -c start.S -o start.o

arm-linux-gcc -c led.c   -o led_mempory.o

arm-linux-ld  -Ttext=0x30000000 start.o  led_mempory.o -o led_mempory

arm-linux-objcopy -O binary led_mempory led_mempory.bin

arm-linux-objdump -D -m arm led_mempory > led_mempory.dis

clean:

rm -f start.o led_mempory.o led_mempory led_mempory.bin led_mempory.dis *.o



初始化存储管理器、堆栈、关闭看门狗:


@##########################################################

@         初始化存储器管理器,设置堆栈,调用main函数            #

@##########################################################


.equ   sdarm_abs,  0x30000000  @SDAM其实地址

.equ   mempory,    0x48000000  @存储管理器寄存器的起始地址


.text

.global _start

_start:


         bl    WDOG               @关闭看门狗       

         bl    setmempory         @初始化存储器管理器

         bl    cp_to_dsarm        @拷贝前4K代码到SDARM中

         ldr   sp,   =0x34000000  @初始化堆栈

         ldr   pc,  =main         @到SDARM中执行

WDOG:                           

         ldr  r0,    =0x53000000  

         mov  r1,    #0x0

         str  r1,    [r0]

         mov  pc,    lr


setmempory:                

         ldr  r0,    =mempory

         adrl r2,    table

         add  r1,    r0,       #52

m_loop:                            

         ldr  r4,    [r2],     #4

         str  r4,    [r0],     #4

         cmp  r1,    r0

         bne  m_loop

         mov  pc,    lr



cp_to_dsarm:

         ldr  r0,    =sdarm_abs

         mov  r1,    #0x0

         add  r2,    r1,      #4*1024

loopcopy:                           @循环拷贝

         ldmia r1!,   {r3-r10}

         stmia r0!,   {r3-r10}

         cmp   r1,    r2

         bne   loopcopy

         mov   pc,    lr

         


.align 4

table:

    .long   0x22011110      @ BWSCON

    .long   0x00000700      @ BANKCON0

    .long   0x00000700      @ BANKCON1

    .long   0x00000700      @ BANKCON2

    .long   0x00000700      @ BANKCON3  

    .long   0x00000700      @ BANKCON4

    .long   0x00000700      @ BANKCON5

    .long   0x00018005      @ BANKCON6

    .long   0x00018005      @ BANKCON7

    .long   0x008C07A3      @ REFRESH

    .long   0x000000B1      @ BANKSIZE

    .long   0x00000030      @ MRSRB6

    .long   0x00000030      @ MRSRB7


         



点亮LED:


#include "led.h"

 

void time(unsigned int t)

{

   while(t--);

}

 

int main()

{  

   GPBCON &=  (~(0x3 << 12 | 0x3 << 14 | 0x3 << 16 | 0x3 << 10));

   GPBCON |=    (0x1 << 12 | 0x1 << 14 | 0x1 << 16 | 0x1 << 10);

 

   while(1)

   {

      GPBDAT &=  (~(0x1 << 5  | 0x1 << 6  | 0x1 << 7  | 0x1 << 8));

      time(50000);

      GPBDAT |=   (0x1 << 5  | 0x1 << 6  | 0x1 << 7  | 0x1 << 8);

      time(50000);

   }

   return 0;

}



led.h


#ifndef _LEDD_H_

#define _LEDD_H_

 

#define GPIO  0x56000000 /*GPIO的基地址*/

#define GPBCON (*(volatile unsigned long *)(GPIO + 0x10)) 

#define GPBDAT (*(volatile unsigned long *)(GPIO + 0x14))

 

#endif


链接地址是CPU能够看到的地址,也是程序员编写程序用到的虚拟地址,一般要经过MMU的转换映射到实际的物理地址。CPU对内存的访问一般是CPU发送一个它看到的地址,经过MMU的转化,在通过存储管理器,最终访问到实际的物理地址。本实验的链接地址为0x30000000,并且没有初始化MMU,CPU发出的地址实际就直接对应到实际的物理地址,通过存储管理器访问内存。这也是本实验能够成功的原因。

关键字:mini2440  存储器  S3C2440 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic497708.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:Mini2440烧写Linux系统
下一篇:移植较新(Linux3.19)内核至mini2440开发板(一)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

一起学mini2440裸机开发(三)--S3C2440时钟学习
前言首先,我们应该知道一点,mini2440开发板在没有开启时钟前,整个开发板全靠一个12MHz的外部晶振提供频率来工作运行的,也就是说CPU、内存、UART、ADC等所有需要用到时钟频率的硬件都工作在12MHz下,而S3C2440A可以正常工作在400MHz下,可想而知两者速度相差会有多大了。如果CPU工作在12MHz频率下,开发板的使用效率非常低,所有依赖系统时钟工作的硬件,其工作效率也很低,比如,我们电脑里面经常提到的超频,超频就是让CPU工作在更高的频率下,让电脑运算速度更快,虽然频率是越高越好,但是由于硬件特性决定了任何一个设备都不可能无止境的超频,电脑超频时要考虑到CPU或主板发热过大,烧坏的危险,同样开发板的主板
发表于 2020-05-14
一起学mini2440裸机开发(三)--S3C2440时钟学习
成功在mini2440上移植ffmpeg
在mini2440上,整个移植过程分三个步骤:(1)编译x264;(2)编译ffmpeg;(3)移植成功后,进行测试,即使用ffmpeg录像。(1)编译x264官网上下了个最新的x264,地址http://www.videolan.org/developers/x264.html。我下载的文件是last_x264.tar.bz2。解压命令为#tar -jxv -f last_x264.tar.bz2,解压后的目录为x264-snapshot-20130313-2245。进入解压后的目录,执行命令./configure --disable-asm,则会生成config.mak。之后就需要修改这个config.mak文件了,改写
发表于 2020-05-14
成功在mini2440上移植ffmpeg
arm mini2440 基于v4l2 ffmpeg x264的视频远程监控
网络上盛传的基于mini2440的摄像头监控一般是基于 MJPEG-Streamer。这种方法利用的是V4L2的底层驱动,然后配合mjpeg这种格式的流传输,然后通过浏览器浏览视频和控制。下面用一个更接近真实的IP-camera的方案来实现。首先先看一下网友sunkwei写的《基于v4l2的webcam应用,本地预监》http://blog.csdn.net/sunkwei/article/details/6530343文本照搬他的代码,只是将他的webcam_server交叉编译到arm上,webcam_shower编译到pc上。这种方案是用的V4L2的视频驱动,然后配合ffmpeg、x264的软件编解码,通过udp上传至pc
发表于 2020-05-14
arm mini2440 基于v4l2 ffmpeg x264的视频远程监控
MINI2440裸机流水灯
概述流水灯是每个嵌入式开发者接触到一款新的控制器时最先实现的程序,本文记录了在友善之臂MINI2440平台上实现流水灯的过程。实现原理通过查看友善之臂提供的MINI2440原理图我们可以知道,MINI2440开发板上四个LED为共阳极接法,四个LED的N极与S3C2440的连接关系如下:LED1 >> GPB5LED2 >> GPB6LED3 >> GPB7LED4 >> GPB8当上述4个IO端口输出低电平时即可点亮对应的LED灯。编写程序及Makefile我们知道,S3C2440内部具有4KB的SRAM,当从NOR Flash启动时,这部分区域的起始地址为0x40000000
发表于 2020-05-14
MINI2440裸机流水灯
二、mini2440裸机程序之按键检测实验
开发板:mini2440, NandFlash:K9F2G08U0B 256M大小,CPU:S3C2440A  。开发环境:MDK4.11仿真器:Jlink v8这是我用csdn发表的第一个文章,之前使用过arm-linux-gcc裸机开发mini2440,但是很多函数什么的不能直接调用(我的技术问题),准备重新整理一下ARM裸机,整理好之后准备下一阶段学习。关于软件MDK4.11和它的注册机,我传不上去,说是由于文件太大,又想要的直接留言邮箱要就行了。下面开始我们的第一个LED灯的点亮程序吧!1、新建一个项目工程双击MDK图标进入开发环境,如下图,  单击Project/New uVision
发表于 2020-05-14
二、mini2440裸机程序之按键检测实验
mini2440第一个裸机程序——点亮LED
手头的Mini2440搁置了两年半之后,我再次决定拿出它,重新尝试嵌入式Linux的学习。我使用的是友善之臂的Mini2440开发板、韦东山的《嵌入式Linux应用开发完成手册》及其视频教程。所以,本篇文章中所涉及到的各种软件均可在以下两处找到:0. Mini2440开发板的配套光盘韦东山JZ2440开发板的光盘JZ2440是韦东山出品的开发板,作为《嵌入式Linux应用开发完全手册》的配套硬件,它和Mini2440相差无几,所以我这里用的是Mini2440。一、目标动手之前先确定好一个小目标——这一次,我们的目标是在Mini2440上点亮LED,怎么样,听起来很简单吧。但是做起来,可并不是很简单喏,主要是因为会涉及到比较多的软件
发表于 2020-05-14
mini2440第一个裸机程序——点亮LED
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved