您好,欢迎访问三七文档
nand启动时bank0失效,即用不了NOPFLASHnandflash前4K被强制复制到片内SRAM4K内存中,然后CPU会从零地址(SRAM)开始执行。nor启动时norflash零地址在norflashcpu从零地址执行。norflash特征是可以像内存一样读数据,但是不能像内存一样直接写数据,要通过命令先擦除后才能写数据。GPIO实验:main没什么特别的,一样要被别人调用,执行往也要返回。启动文件:调用main,调用完之后要返回,所以要设置返回地址。最后要进行一些清理工作。软件初始化:设置栈/*设置栈就是把栈指针SP指向某个内存,假如指向SDRAM则要先初始化SDRAM才能设置栈*/设置返回地址/*bl指令会跳转到main函数,并且把返回地址保存在LR寄存器里面。*/调用main清理工作硬件初始化:关看门狗/*上电时候看门狗启动,会倒数计时三秒内没有关闭就会重启系统。所以要关掉*/初始化时钟/*想要跑的更快要初始化时钟*/初始化SDRAM/**/设置返回地址:blmain/*bl指令会跳转到main函数,并且把返回地址保存在LR寄存器里面。*//*bl指令会把返回地址存在lr寄存器里面。*/#defineGPFCON(*(volatileunsignedlong*)0x56000050)/*volatile让编译器不要优化变量*/#defineGPF4_out(1(4*2))#defineGPF5_out(1(5*2))#defineGPF6_out(1(6*2))#defineGPF7_out(1(7*2))GPFCON|=GPF4_out|GPF5_out|GPF6_out;//将LED1-3对应的GPF4/5/6三个引脚设为输出按位操作:想要清零:按位与/*例如清bit3则a&=~(13)*/想要置“1”:按位或/*例如置bit3则a|=(13)*/SRAM在芯片手册里面称为steppingstoneCPU通过存储管理器才知道怎么访问外部的设备例如SDRAMDM9000网卡等想访问一个芯片,需要哪些条件1:地址线(例如SDRAM行地址13位,列地址9位)看芯片手册2:数据线/*8/16/32位数据宽度例如SDRAM位宽32位SDRAM32位,所以ADDR0,ADDR1就不需要使用。*/看原理图3:时钟/频率(刷新周期8192/64ms即刷新8192次需要64ms)看芯片手册4:芯片相关:例如SDRAM(行地址,列地址,Bank)看芯片手册SDRAM32位,所以ADDR0,ADDR1就不需要使用。因为2440的地址的单位是byte(8位),所以CPU发出的0,1,2,3这四个地址都是访问到SDRAM地址中的同一个单元。返回都是返回同一个四字节(32位)的数据。假如访问的芯片去16位的,则ADDR0就不需要使用。想要访问某个芯片(如SDRAM)先要配置存储管理器(位宽,行列地址,刷新周期)。所谓配置也就是设置寄存器。2440可以接8个外设(SDRAM,DM9000网卡,NORFLASH等等),因为有8个Bank,有8条片选信号(CS信号)。Bank0~5都是一样的结构。Bank6~7比较特别,它们可以接SDRAM。内存可以分为SRAM,SDRAM,DDR等等。SRAM很快但是比较贵,使用方法简单,直接发地址信号就可以了。SDRAM比较便宜且访问比较复杂,它的地址还分为Bank地址,行地址,列地址。还要不断的刷新SDRAM(REFRESH寄存器就是用来设置刷新周期的),不刷新数据就会丢失。网卡,NORFLASH它们的接口跟根SRAM的接口是一样的,术语上称为RAMlike。每个Bank可以外接128M的东西,寻址空间是128M。bank7/bank6可以组(128M/128M,64M/64M,32M/32M等)大程序启动过程:1:一上电nandflash前4K被拷贝到SRAM中。2:程序会先关看门狗,初始化存储管理寄存器,SDRAM。3:拷贝到SRAM中的4K代码再把nandflash中的代码拷贝到SDRAM中去,然后继续执行(在SDRAM中运行)。arm-linux-ld-Ttext0x3000000-gled_on.o-oled_on_elf(Ttext0x3000000是链接地址)所谓链接地址就是说,运行时程序“应该”位于哪里。所以head.s就应该从片内SRAM拷到SDRAM中去。当前PC值=当前指令的地址+8//pc=当前指令地址+8MMU:权限管理,地址映射。使用MMU时,使用CPU发出的地址是虚拟地址。或者是真实的物理地址。CPU发出的是物理地址还是虚拟地址CPU是不在乎的,CPU没有虚拟地址和物理地址概念。写程序的时候,我们说的地址例如链接地址,也没有虚拟地址,物理地址概念。就是一个单纯的地址。地址只是从CPU角度看到的。虚拟地址(VA)怎么转换为物理地址(PA)。对于mips架构来说VA=0xA000,0000+PA/*VA=fun(PA)*/对于ARM结构来说:表格:一级页表,二级页表。对于ARM来说有两种映射:段和页段映射:表格里面每一个表项对应一段,表示大小是1M。假如CPU的地址数是4G,则需要的表格数位4G/1M=4*1024=4096个。创建页表:启动前和启动瞬间,地址要连续。A:所以0~4096的虚拟地址要对应0~4096的物理地址使用MMU会加快程序的运行速度,因为有DCACH,ZCACH。这些会加快程序运行速度。1,MMU首先知道你创建的这些页表项都放在哪里;2,MMU通过虚拟地址的高12位可以找到对应的页表项,并且这个页表项的高12位就是物理地址的高12位;3,虚拟地址的低20位就是物理地址的低20位;4,页表项的高12位+虚拟地址的低20位==物理地址。SDRAM程序中mem_cfg_val结构体中的的数字为寄存器BWSCON,BANKCON0,BANKCON1,BANKCON2,BANKCON3,BANKCON4,BANKCON5,BANKCON6,BANKCON7,REFRESH,BANKSIZE,MRSRB6,MRSRB7寄存器赋值。目的是初始化SDRAM。unsignedlong*p=(unsignedlong*)MEM_CTL_BASE;此语句是将指针P指向寄存器0x48000000MMU代码:/*复制第二段代码到SDRAM中*/voidcopy_2th_to_sdram(void){unsignedint*pdwSrc=(unsignedint*)2048;unsignedint*pdwDest=(unsignedint*)0x30004000;/*地址为0x30004000是因为前16K用来存放页表*/while(pdwSrc(unsignedint*)4096){*pdwDest=*pdwSrc;pdwDest++;pdwSrc++;}}寄存器:NFCMMDNFADDRNFDATANandflash没有地址总线跟CPU相连,不同于SDRAM,DM9000网卡,SRAM,寄存器等都有地址总线与CPU相连,所以SDRAM,DM9000网卡,SRAM,寄存器与Nandflash的寻址方式不一样。SDRAM,DM9000网卡,SRAM,寄存器的地址是CPU发出来的,或称为CPU统一编址。而Nandflash的地址是Nandflash自己编址的,CPU“看不到”的。所以CPU说的“0”地址与Nandflash说的“0”地址不是一个概念。那Nandflash是怎么编址的呢?从原理图上,Nandflash与CPU相连的只有数据总线,控制总线。所以CPU发出的地址,命令都是由数据总线进行传输。但是如何分辨是地址还是命令呢?显然是通过控制总线进行区分。CLE(高电平)信号是命令,ALE(高电平)信号是地址,两个信号都无效的话传输的就是数据。是读数据还是写数据又由nFWE(读)引脚nFRE(写)引脚控制。Nandflash的典型结构是大页,一个大页有2K也就是2048字节。有64页。注意:每一个大页中都有一个叫OOB的空间(64字节)。一般来说用不到OOB这个空间,例如我们要访问第2049这个字节空间,不会访问到OOB这个空间而是访问第二页开始的第二个字节。所以真实的一页是2K+64字节。只是64字节基本上不用。那怎么访问Nandflash?1:发出命令CLENFCMMD寄存器2:发出地址ALENFADDR寄存器3:发出数据R/WNFDATA寄存器4:状态NFSTAT寄存器//发出擦除命令不可能马上就擦除成功,用状态寄存器确定NANDFLASH的状态判断是否擦除成功代码:ldrr0,=0x30000000@1.目标地址=0x30000000,这是SDRAM的起始地址movr1,#4096@2.源地址=4096,连接的时候,main.c中的代码都存在NANDFlash地址4096开始处movr2,#2048@3.复制长度=2048(bytes),对于本实验的main.c,这是足够了blnand_read汇编和C语言传递参数:如上例子,r0为传递给C函数(nand_read)的第一个参数,r1为第二个,r2为第三个。voidnand_read(unsignedchar*buf,unsignedlongstart_addr,intsize);中断:ARM体系CPU的7种工作模式:用户模式(usr):ARM处理器正常的程序执行状态该模式下的寄存器:r0r1r2r3r4r5r6r7r8r9r10r11r12r13r14r15(pc)系统模式(sys):运行具有特权的操作系统任务该模式下的寄存器:r0r1r2r3r4r5r6r7r8r9r10r11r12r13r14r15(pc)快速中断模式(fiq):用于高速数据传输或通道处理该模式下的寄存器:r0r1r2r3r4r5r6r7“r8_fiq”“r9_fiq”“r10_fiq”“r11_fiq”“r12_fiq”“r13_fiq”“r14_fiq”r15(pc)中断模式(irq):用于通用的中断处理该模式下的寄存器:r0r1r2r3r4r5r6r7r8r9r10r11r12“r13_irq”“r14_irq”r15(pc)管理模式(svc):操作系统使用的保护模式该模式下的寄存器:r0r1r2r3r4r5r6r7r8r9r10r11r12“r13_svc”“r14_svc”r15(pc)数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护该模式下的寄存器:r0r1r2r3r4r5r6r7r8r9r10r11r12“r13_abt”“r14_abt”r15(pc)未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真该模式下的寄存器:r0r1r2r3r4r5r6r7r8r9r10r11r12“r13_und”“r14_und”r15(pc)由上可知除了系统模式和用户模式的寄存器相同,其余的5个模式下的寄存器不相同。其中快中断模式拥有7个独立寄存器,其余模式都是r13r14两个寄存器独立。中断也是一种异常发生了异常之后:1:CPU强制进入异常模式,就是切换寄存器(如上)/*这里就是说发生异常之后CPU进入异常模式2:PC(r15)=异常入口然后程序自动跳到异常入口*/设置栈,栈sp就是r13。异常入口是什么:就是CPU固定的地址。如下:@******************************************************************************@异常向量,本程序中,除Reset和HandleIRQ外,其它异常都没有使用@******************************************************************************.externmain.text.global_start_start:@_start表示0地址入口@复位异常的入
本文标题:嵌入式学习笔记
链接地址:https://www.777doc.com/doc-6279270 .html