一。环境和编译器
开发板:jz2440
系统:ubuntu12.04
编译器:gcc
二。验证代码
1.head.S
1 @******************************************************************************
2 @ File:head.s
3 @ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行
4 @auther:
5 @******************************************************************************
6
7 .text
8 .global _start
9 _start:
10 @函数disable_watch_dog, memsetup, init_nand, nand_read_ll在init.c中定义
11 ldr sp, =4096 @设置堆栈
12 bl disable_watch_dog @关WATCH DOG
13 bl memsetup @初始化SDRAM
14 bl nand_init @初始化NAND Flash
15
16 @将NAND Flash中地址4096开始的1024字节代码(main.c编译得到)复制到SDRAM中
17 @nand_read_ll函数需要3个参数:
18 ldr r0, =0x30000000 @1. 目标地址=0x30000000,这是SDRAM的起始地址
19 mov r1, #4096 @2. 源地址 = 4096处
20 mov r2, #2048 @3. 复制长度= 2048(bytes)
21 bl nand_read @调用C函数nand_read
22
23 ldr sp, =0x34000000 @设置栈
24 ldr lr, =halt_loop @设置返回地址
25 ldr pc, =main @b指令和bl指令只跳转32M的范围,所以这里使用向pc赋值的方法进行跳转
26 halt_loop:
27 b halt_loop
2.init.c
1 #define WTCON (*(volatile unsigned long *)0x53000000)
2 #define MEM_CTL_BASE 0x48000000
3
4 void disable_watch_dog();
5 void memsetup();
6
7 /*关掉看门狗 */
8 void disable_watch_dog()
9 {
10 WTCON = 0;
11 }
12
13 /* 设置SDRAM */
14 void memsetup()
15 {
16 int i = 0;
17 unsigned long *p = (unsigned long *)MEM_CTL_BASE;
18
19 /* SDRAM 13个寄存器的值 */
20 unsigned long const mem_cfg_val[]={ 0x22011110, //BWSCON
21 0x00000700, //BANKCON0
22 0x00000700, //BANKCON1
23 0x00000700, //BANKCON2
24 0x00000700, //BANKCON3
25 0x00000700, //BANKCON4
26 0x00000700, //BANKCON5
27 0x00018005, //BANKCON6
28 0x00018005, //BANKCON7
29 0x008C07A3, //REFRESH
30 0x000000B1, //BANKSIZE
31 0x00000030, //MRSRB6
32 0x00000030, //MRSRB7
33 };
34
35 for(; i < 13; i++)
36 p[i] = mem_cfg_val[i];
37 }
3.nand.c 以下代码不支持2410 也不支持小页读写,是裁剪源码的结果。
1 #define GSTATUS1 (*(volatile unsigned int *)0x560000B0)
2 #define BUSY 1
3
4 #define NAND_SECTOR_SIZE_LP 2048
5 #define NAND_BLOCK_MASK_LP (NAND_SECTOR_SIZE_LP - 1)
6
7 typedef unsigned int S3C24X0_REG32;
8
9
10 typedef struct {
11 S3C24X0_REG32 NFCONF;
12 S3C24X0_REG32 NFCONT;
13 S3C24X0_REG32 NFCMD;
14 S3C24X0_REG32 NFADDR;
15 S3C24X0_REG32 NFDATA;
16 S3C24X0_REG32 NFMECCD0;
17 S3C24X0_REG32 NFMECCD1;
18 S3C24X0_REG32 NFSECCD;
19 S3C24X0_REG32 NFSTAT;
20 S3C24X0_REG32 NFESTAT0;
21 S3C24X0_REG32 NFESTAT1;
22 S3C24X0_REG32 NFMECC0;
23 S3C24X0_REG32 NFMECC1;
24 S3C24X0_REG32 NFSECC;
25 S3C24X0_REG32 NFSBLK;
26 S3C24X0_REG32 NFEBLK;
27 } S3C2440_NAND;
28
29 static S3C2440_NAND * s3c2440nand = (S3C2440_NAND *)0x4e000000;
30
31
32
33 /* 供外部调用的函数 */
34 void nand_init(void);
35 void nand_read(unsigned char *buf, unsigned long start_addr, int size);
36
37
38 /* S3C2440的NAND Flash处理函数 */
39 static void s3c2440_nand_reset(void);
40 static void s3c2440_wait_idle(void);
41 static void s3c2440_nand_select_chip(void);
42 static void s3c2440_nand_deselect_chip(void);
43 static void s3c2440_write_cmd(int cmd);
44 static void s3c2440_write_addr_lp(unsigned int addr);
45 static unsigned char s3c2440_read_data(void);
46
47
48
49 /* 复位 */
50 static void s3c2440_nand_reset(void)
51 {
52 s3c2440_nand_select_chip();
53 s3c2440_write_cmd(0xff); // 复位命令
54 s3c2440_wait_idle();
55 s3c2440_nand_deselect_chip();
56 }
57
58 /* 等待NAND Flash就绪 */
59 static void s3c2440_wait_idle(void)
60 {
61 int i;
62 volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFSTAT;
63 while(!(*p & BUSY))
64 for(i=0; i<10; i++);
65 }
66
67 /* 发出片选信号 */
68 static void s3c2440_nand_select_chip(void)
69 {
70 int i;
71 s3c2440nand->NFCONT &= ~(1<<1);
72 for(i=0; i<10; i++);
73 }
74
75 /* 取消片选信号 */
76 static void s3c2440_nand_deselect_chip(void)
77 {
78 s3c2440nand->NFCONT |= (1<<1);
79 }
80
81 /* 发出命令 */
82 static void s3c2440_write_cmd(int cmd)
83 {
84 volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFCMD;
85 *p = cmd;
86 }
87
88
89
90
91 static void s3c2440_write_addr_lp(unsigned int addr)
92 {
93 int i;
94 volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFADDR;
95 int col, page;
96
97 col = addr & NAND_BLOCK_MASK_LP;
上一篇:实验五--中断系统
下一篇:实验三——SDRAM
推荐阅读最新更新时间:2024-11-08 11:48
推荐帖子
- allegro怎么画整齐的孔
- 求助,在allegro中怎么画整齐的孔,除了利用坐标还有没有其他方便点的办法啊allegro怎么画整齐的孔难道用坐标不是最简单的么??:time:坐标就是最好的方法,非常精确 {:1_134:}坐标就是要算数据啊。。感觉要算好烦。。数学不好 工程师们啊,这点计算算什么。就是定位一下圆心坐标,,以前我们我们国家哪些前辈搞原子弹的时候,都是手工计算,那样计算机啊
- ohahaha PCB设计
- PCB完整加工过程
- 大多数工程师把PCB文件,或者gerber文件发给厂家之后,就可以等着回板了。但是往往硬件研发岗位工作很多年都没有机会去PCB生产厂去看看整个生产的过程。今天带你走一遭。看一看完整的过程。第一步,开料PCB板厂的原材料一般都是1020mm×1020mm和1020mm×1220mm规格的多,如果单板或拼板的尺寸不合适,PCB生产过程中,就会产生很多的原料废边,PCB板厂会把之些废边的价格都加到你的板子上,这样你的PCB板单位价格就贵一些;如果板子大小设计得好,单板或拼板的尺寸是
- ohahaha PCB设计
- DIY扫描电子显微镜
- 转自果壳网。原标题《厉害炸了!一个自制扫描电子显微镜的人》。有删节,有修改。一个名叫BenKrasnow的工程师自己做了一个扫描电子显微镜!这可是电子显微镜啊,绝对不是摆弄几个玻璃镜片就能搞定的事情,简直是有史以来最难的DIY项目了……下面这位就是作者,以及他自己做的电镜:玻璃罩子里面的是核心部件,其他那些大坨的东西是真空泵和电源,另外因为泵在工作时会过热,所以他还加了冷却。主体部分特写:这东西花了他大约100小时时间,制作期间所有的周末全都一心扑在做电镜上。至于花费嘛,大约是150
- maychang 综合技术交流
- lm3s811和jlink连不上,求高人指路
- lm3s811和jlink连不上,求高人指路连不上的原因很多,软件,硬件jlink!如果可以的话,我可以通过远程帮你看一下.FredQQ:1246696660回答提示什么错误啊,传个图也行啊把连不上的问题帖出来,好大家帮你!楼上说的不错,把连不上的错误截个图发上来。回复楼主zsxchina的帖子论坛的兄弟姐妹们,我的问题解决了,因为键盘引脚焊错了,导致复位端持续低电平,无法与jtag口连接,感谢亲们的关注,我太喜欢这个论坛了,特别感谢二楼的大哥,他在第一时间给予我了
- zsxchina 微控制器 MCU
- ARM异常中断返回的几种情况
- ARM异常中断返回的几种情况异常中断返回的几种情况:重要基础知识:R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令为4字节长,所以PC始终指向该指令地址加8字节的地址,即:PC值=当前程序执行位置+8;而ADS中的pc,是为了调试看着方便而修改过的,它指向的是正在执行的指
- 单片机的应用 ARM技术
- 【2024 DigiKey创意大赛】- 基于毫米波雷达的生命体征检测及健康监护系统-环境监测
- ##【2024DigiKey创意大赛】-基于毫米波雷达的生命体征检测及健康监护系统-环境监测模块开发##一、模块概述本环境监测模块旨在通过温湿度传感器,实时监测室内温度和湿度,并将数据展示在LCD触摸屏和手机APP上。当温湿度参数超出正常范围时,系统会自动报警,提醒用户采取措施改善环境。##二、功能需求1.**温湿度监测**-利用空气温湿度传感器监测室内温度和湿度。2.**环境信息展示**-在LCD触摸屏和手机APP上实时展示温湿度等环境信息。
- zygalaxy DigiKey得捷技术专区
设计资源 培训 开发板 精华推荐
- LT3692AIUH、12V、3.3V、2.5V、1.2V 四路输出、具有外部同步、输出排序和跟踪应用的典型应用电路
- TB67H303HG 大电流驱动有刷直流电机驱动器评估板
- 使用 ROHM Semiconductor 的 BD46321 的参考设计
- EVAL-AD5428EBZ,AD5428 评估板,8 位并行输入,双通道,电流输出 DAC
- 阿里云emw3080物联网开关功能验证板
- 用于汽车照明的 16 至 20 个 LED 白光 LED 驱动器
- LTC2980CY 16 通道 PMBU 电源系统管理器的典型应用电路
- LM2902VDR2G 电压基准运算放大器的典型应用
- 加热台
- L7808C 电流调节器的典型应用