仲恺农业工程学院实验报告纸
实验五 NAND Flash 控制器
一、实验目的
1.了解NAND Flash芯片的接口
2.掌握通过NAND Flash控制器访问NAND Flash的方法 二、实验内容
1. 掌握读NAND Flash的操作;
2. 把一部分代码存放在NAND Flash地址4096之后,当程序启动后通过NAND Flash控制器将代码从NAND Flash复制到SDRAM并执行。 三、实验设备
1. EL-ARM-830教学实验箱,PentiumII以上的PC机,仿真调试电缆,串口电缆。
2. PC操作系统WIN98或WIN2000或WINXP,MDK集成开发环境,仿真调试驱动程序 四、实验步骤
1.本实验仅使用实验教学系统的CPU板,串口。在进行本实验时,LCD电源开关、音频的左右声道开关、AD通道选择开关、触摸屏中断选择开关等均应处在关闭状态。
2.在PC机并口和实验箱的CPU板上的JTAG接口之间,连接仿真调试电缆,以及串口间连接公/母接头串口线。
3.检查连接是否可靠,可靠后,接入电源线,系统上电。 4.打开MDK开发环境,修改源文件的head.s程序。 5. 修改init.c程序。
6 .修改main.c程序,nand.c。
7. 编译,生成可执行程序,观察试验现象。 四、实验程序 res.s:
PRESERVE8 IMPORT Main
AREA RESET, CODE, READONLY EXPORT _start _start
ENTRY
ldr sp, =4096
第 1 页 共 5 页
b1 disable_watch_dog b1 memsetup
b1 copy_2th_to_sdram b1 create_page_table b1 mmu_init
ldr sp, =0x40000000 ldr pc, =0x00040000 halt_loop: b halt_loop 2、Text2.c: #define WTCON
#define MEN_CTL_BASE 0x48000000 #define r0 0
void disable_watch_dog(void) { }
void memstup(void) {
WTCON=0;
unsingned long const mem_cfg_val[]={ 0x22011110, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00000700, 0x00018005, 0x00018005, 0x008C07A3, 0x000000B1, 0X00000030, 0X00000030, } int i=0;
第 2 页 共 5 页
}
volatile unsingned long *p=(volatile unsingned long*)MEN_CTL_BASE; for(;i<13;i++) p[i]=men_cfg_val[i]
void copy_2th_to_sdram(void) { }
create_page_table(void) {
#define MMU_FULL_ACCESS (3<<10) #define MMU_DOMAIN (0<<5) #define MMU_SPECIAL (1<<4) #define MMU_CACHEABLE(1<<3) #define MMU_BUFFERABLE (1<<2) #define MMU_SECTTON (2) #define
MMU_SECDESC
unsingned int *pdwSrc = (unsingned int *)2048; unsingned int *pdwDest = (unsingned int *)0x30004000; while (pdwSrc<(unsingned int *)4096) { }
*pdwDest=*pdwSrc; pdwDest++; pdwSrc++;
(MMU_FULL_ACCESS|MMU_DOMAIN|MMU_SPECIAL|MMU_SECTTON)
#define
MMU_SECDESC_WB
(MMU_FULL_ACCESS|MMU_DOMAIN|MMU_SPECIAL|MMU_CACHEABLE|MMU_BUFFERABLE|MMU_SECTTON)
#define MMU_SECTION_SIZE 0X00100000 unsingned long virtuladdr,physicaladdr;
unsingned long *mmu_tld_base=(unsingned long *)0x30000000;
第 3 页 共 5 页
}
virtuladdr=0; physicaladdr=0;
*(mmu_tld_base+(virtuladdr>>20))=(physicaladdr&0xFFF00000)|MMU_SECDESC_WB; virtuladdr=0xA0000000; physicaladdr=0x56000000;
*(mmu_tld_base+(virtuladdr>>20))=(physicaladdr&0xFFF00000)|MMU_SECDESC; virtuladdr=0xB0000000; physicaladdr=0x30000000; while(virtuladdr<0xB4000000) { }
*(mmu_tld_base+(virtuladdr>>20))=(physicaladdr&0xFFF00000)|MMU_SECDESC_WB; virtuladdr+=0x100000; physicaladdr+=0x100000;
*(mmu_tld_base+(virtuladdr>>20))=(physicaladdr&0xFFF00000)|MMU_SECDESC_WB; *(mmu_tld_base+(virtuladdr>>20))=(physicaladdr&0xFFF00000)|MMU_SECDESC; *(mmu_tld_base+(virtuladdr>>20))=(physicaladdr&0xFFF00000)|MMU_SECDESC_WB;
void mmuu_init(void) {
unsigned long ttb = 0x30000000;
__asm__(
\
\\\\\\
\\
\
第 4 页 共 5 页