s3c2440学习笔记(上)-基于FL2440
来源:互联网 发布:微信霸屏广告源码 编辑:程序博客网 时间:2024/05/16 08:23
学习ARM有一段时间了,现在做一个记录裸机程序,再网上看到了赵老师讲2440裸机程序的博客,写的很好,建议和我一样的初学者能好好的学习一下赵老师的博客,网址:http://blog.csdn.net/zhaocj/article/details/6118860,真心不错!给赵老师做一下广告,哈哈 ^_^
1 2440启动文件分析
由于启动文件无法仿真,可以再要判断的语句的地方加上一段点亮led小灯程序
ResetHandler ;系统上电或复位后,由0x0处的跳转指令,跳转到该处开始真正执行系统的初始化工作
2 2440外部中断
2440的外部中断引脚EINT与通用IO引脚F和G复用,要想使用中断功能,就要把相应的引脚配置成中断模式,如我们想把端口F0设置成外部中断,而其他引脚功能不变,则GPFCON=(GPFCON & ~0x3) | 0x2。配置完引脚后,还需要配置具体的中断功能。我们要打开某一中断的屏蔽,这样才能响应该中断,相对应的寄存器为INTMSK;还要设置外部中断的触发方式,如低电平、高电平、上升沿、下降沿等,相对应的寄存器为EXTINTn。另外由于EINT4到EINT7共用一个中断向量,EINT8到EINT23也共用一个中断向量,而INTMSK只负责总的中断向量的屏蔽,要具体打开某一具体的中断屏蔽,还需要设置EINTMASK。
SRCPND和INTPND
S3C2440A有两个中断挂起寄存器:源挂起寄存器(SRCPND)和中断挂起寄存器(INTPND)。这些挂起寄存器表明一个中断请求是否为挂起。当中断源请求中断服务,SRCPND寄存器的相应位被置位为1,并且同时在仲裁步骤后INTPND 寄存器仅有1位自动置位为1。如果屏蔽了中断,则SRCPND寄存器的相应位被置位为1。这并不会引起INTPND 寄存器的位的改变。当INTPND 寄存器的挂起位为置位,每当I 标志或F标志被清除为0中断服务程序将开始。SRCPND和INTPND寄存器可以被读取和写入,因此服务程序必须首先通过写1到SRCPND寄存器的相应位来清除挂起状态并且通过相同方法来清除INTPND寄存器中挂起状态
3 2440的PWM应用
s3c2440芯片中一共有5个16位的定时器,其中有4个定时器(定时器0~定时器3)具有脉宽调制功能,因此用s3c2440可以很容易地实现PWM功能。下面就具体介绍如何实现PWM功能。
1、PWM是通过引脚TOUT0~TOUT3输出的,而这4个引脚是与GPB0~GPB3复用的,因此要实现PWM功能首先要把相应的引脚配置成TOUT输出。
2、再设置定时器的输出时钟频率,它是以PCLK为基准,再除以用寄存器TCFG0配置的prescaler参数,和用寄存器TCFG1配置的divider参数。
3、然后设置脉冲的具体宽度,它的基本原理是通过寄存器TCNTBn来对寄存器TCNTn(内部寄存器)进行配置计数,TCNTn是递减的,如果减到零,则它又会重新装载TCNTBn里的数,重新开始计数,而寄存器TCMPBn作为比较寄存器与计数值进行比较,当TCNTn等于TCMPBn时,TOUTn输出的电平会翻转,而当TCNTn减为零时,电平会又翻转过来,就这样周而复始。因此这一步的关键是设置寄存器TCNTBn和TCMPBn,前者可以确定一个计数周期的时间长度,而后者可以确定方波的占空比。由于s3c2440的定时器具有双缓存,因此可以在定时器运行的状态下,改变这两个寄存器的值,它会在下个周期开始有效。
4、最后就是对PWM的控制,它是通过寄存器TCON来实现的,一般来说每个定时器主要有4个位要配置(定时器0多一个死区位):启动/终止位,用于启动和终止定时器;手动更新位,用于手动更新TCNTBn和TCMPBn,这里要注意的是在开始定时时,一定要把这位清零,否则是不能开启定时器的;输出反转位,用于改变输出的电平方向,使原先是高电平输出的变为低电平,而低电平的变为高电平;自动重载位,用于TCNTn减为零后重载TCNTBn里的值,当不想计数了,可以使自动重载无效,这样在TCNTn减为零后,不会有新的数加载给它,那么TOUTn输出会始终保持一个电平(输出反转位为0时,是高电平输出;输出反转位为1时,是低电平输出),这样就没有PWM功能了,因此这一位可以用于停止PWM。
TCFG0 = 0xFFFF00;
TCFG0 |= 0x31; //低8为时钟的分频数
TCFG1 &= ~0xF; //1/2,PCLK=50MHz,所有50MHz/25/2=500KHz
TCNTB0 = 5000;
TCMPB0 = freq;
TCON &= ~0x1F;
TCON |= 0xF; //死区无效,自动装载,电平反转,手动更新,定时器开启
TCON &= ~0x2; //手动更新位清零,PWM开始工作
4 2440的PWM应用
在s3c2440中,有2个不同的PLL,一个是MPLL,另一个是UPLL。UPLL是给USB提供48MHz。在这里,我们主要介绍MPLL。外部时钟源经过MPLL处理后能够得到三个不同的系统时钟:FCLK、HCLK和PCLK。FCLK是主频时钟,用于ARM920T内核;HCLK用于AHB总线设备,如ARM920T,内存控制,中断控制,LCD控制,DMA以及USB主模块;PCLK用于APB总线设备,如外围设备的看门狗,IIS,I2C,PWM,MMC接口,ADC,UART,GPIO,RTC以及SPI。这三个系统时钟(FCLK、HCLK和PCLK)是有一定的比例关系,这种关系是通过寄存器CLKDIVN中的HDIVN位和PDIVN位来控制的,因此我们只要知道了FCLK,再通过这两位的控制,就能确定HCLK和PCLK。而FCLK是如何得到的呢?它是通过输入时钟(即外部时钟源)的频率,经过一个计算公式(具体公式请查阅数据手册)得到的,这个计算公式还需要三个参数(MDIV、PDIV、SDIV),而这三个参数是经过寄存器MPLLCON配置得到的。最后,我们用最清晰的线路来绘制一下时钟的产生过程:外部时钟源→通过寄存器MPLLCON得到FCLK→再通过寄存器CLKDIVN得到HCLK和PCLK。这个配置过程在启动文件中就已完成。
TCFG0 :定时器配置寄存器0,配置2个8位预分频器
[23:16] :死区长度
[16:8] :precsaler1,决定定时器2,3,4预分频值
[7:0] :prescaler0,决定定时器0,1的预分频值
5 2440的UART应用
s3c2440提供了三个UART端口,它们都可以通过查询、中断和DMA方式传输数据,而且每个UART都分别有一个64个字节的接收FIFO和一个64个字节的发送FIFO。
要实现某种通信,就必须遵循该通信协议。UART的协议包括传输数据的位数,停止位的位数,以及是否进行奇偶校验,这些设置是利用ULCONn寄存器完成的。另一个很重要的地方就是设置波特率。s3c2440波特率的时钟源有三个:PCLK、FCLK/n和UEXTCLK。时钟源的选择是由UCONn的第10位和第11位来完成的。波特率的具体计算公式为:
时钟源频率÷(波特率×16)-1
RS-232C标准采用的是负逻辑方式,逻辑1对用-15到-5V,逻辑0对应5到15V
S3C2440A 的 UART(通用异步串行接口)单元提供了三个独立的异步串行 I/O 端口,每个
都可以在中断和 DMA 两种模式下进行,他们支持的最高波特率是 115.2Kbps。每个 UART 通道包含 2 个 64 字节 FIFO 分别提供个接收和发送。
GPH7 [15:14] 00 = 输入 01 = 输出 10 = RXD[2] 11 = nCTS1
GPH6 [13:12] 00 = 输入 01 = 输出 10 = TXD[2] 11 = nRTS1
GPH5 [11:10] 00 = 输入 01 = 输出 10 = RXD[1] 11 = 保留
GPH4 [9:8] 00 = 输入 01 = 输出 10 = TXD[1] 11 = 保留
GPH3 [7:6] 00 = 输入 01 = 输出 10 = RXD[0] 11 = 保留
GPH2 [5:4] 00 = 输入 01 = 输出 10 = TXD[0] 11 = 保留
6 2440的NAND Flash应用
NAND Flash引导启动模式中必须选择GPG[15:13]为输入。
当复位时,NAND Flash控制器将通过引脚状态(NCON(先进闪存), GPG13(页大小),GPG14(地址周期),GPG15(总线宽度)—请参考引脚配置)来获取连接的NAND Flash的信息,在发生掉电或系统复位后,NAND Flash控制器自动加载4K字节的BootLoader代码。在加载完BootLoader代码后,Steppingstone中的BootLoader代码已经执行了
D[7:0] : 数据/命令/地址/的输入/输出口(与数据总线共享)
CLE : 命令锁存使能 (输出)
ALE : 地址锁存使能(输出)
nFCE : NAND Flash 片选使能(输出)
nFRE : NAND Flash 读使能 (输出)
nFWE : NAND Flash 写使能 (输出)
R/nB : NAND Flash 准备好/繁忙(输入)
//-------------- s3c2440的头文件 ----------------------------
/***********************************************************************//* This file is part of the uVision/ARM development tools *//* Copyright KEIL - An ARM Company 2002-2007 *//***********************************************************************//* *//* S3C2440.H: Header file for Samsung S3C2440 *//* *//***********************************************************************/#ifndef __S3C2440_H#define __S3C2440_H// Memory Controllers #define BWSCON (*(volatile unsigned long *) 0x48000000)#define BANKCON0 (*(volatile unsigned long *) 0x48000004)#define BANKCON1 (*(volatile unsigned long *) 0x48000008)#define BANKCON2 (*(volatile unsigned long *) 0x4800000C)#define BANKCON3 (*(volatile unsigned long *) 0x48000010)#define BANKCON4 (*(volatile unsigned long *) 0x48000014)#define BANKCON5 (*(volatile unsigned long *) 0x48000018)#define BANKCON6 (*(volatile unsigned long *) 0x4800001C)#define BANKCON7 (*(volatile unsigned long *) 0x48000020)#define REFRESH (*(volatile unsigned long *) 0x48000024)#define BANKSIZE (*(volatile unsigned long *) 0x48000028)#define MRSRB6 (*(volatile unsigned long *) 0x4800002C)#define MRSRB7 (*(volatile unsigned long *) 0x48000030)// USB Host Controller#define HcRevision (*(volatile unsigned long *) 0x49000000)#define HcControl (*(volatile unsigned long *) 0x49000004)#define HcCommonStatus (*(volatile unsigned long *) 0x49000008)#define HcInterruptStatus (*(volatile unsigned long *) 0x4900000C)#define HcInterruptEnable (*(volatile unsigned long *) 0x49000010)#define HcInterruptDisable (*(volatile unsigned long *) 0x49000014)#define HcHCCA (*(volatile unsigned long *) 0x49000018)#define HcPeriodCuttentED (*(volatile unsigned long *) 0x4900001C)#define HcControlHeadED (*(volatile unsigned long *) 0x49000020)#define HcControlCurrentED (*(volatile unsigned long *) 0x49000024)#define HcBulkHeadED (*(volatile unsigned long *) 0x49000028)#define HcBulkCurrentED (*(volatile unsigned long *) 0x4900002C)#define HcDoneHead (*(volatile unsigned long *) 0x49000030)#define HcRmInterval (*(volatile unsigned long *) 0x49000034)#define HcFmRemaining (*(volatile unsigned long *) 0x49000038)#define HcFmNumber (*(volatile unsigned long *) 0x4900003C)#define HcPeriodicStart (*(volatile unsigned long *) 0x49000040)#define HcLSTreshold (*(volatile unsigned long *) 0x49000044)#define HcRhDescriptorA (*(volatile unsigned long *) 0x49000048)#define HcRhDescriptorB (*(volatile unsigned long *) 0x4900004C)#define HcRhStatus (*(volatile unsigned long *) 0x49000050)#define HcRhPortStatus1 (*(volatile unsigned long *) 0x49000054)#define HcRhPortStatus2 (*(volatile unsigned long *) 0x49000058)// Interrupt Controller#define SRCPND (*(volatile unsigned long *) 0x4A000000)#define INTMOD (*(volatile unsigned long *) 0x4A000004)#define INTMSK (*(volatile unsigned long *) 0x4A000008)#define PRIORITY (*(volatile unsigned long *) 0x4A00000C)#define INTPND (*(volatile unsigned long *) 0x4A000010)#define INTOFFSET (*(volatile unsigned long *) 0x4A000014)#define SUBSRCPND (*(volatile unsigned long *) 0x4A000018)#define INTSUBMSK (*(volatile unsigned long *) 0x4A00001C)// DMA#define DISRC0 (*(volatile unsigned long *) 0x4B000000)#define DISRCC0 (*(volatile unsigned long *) 0x4B000004)#define DIDST0 (*(volatile unsigned long *) 0x4B000008)#define DIDSTC0 (*(volatile unsigned long *) 0x4B00000C)#define DCON0 (*(volatile unsigned long *) 0x4B000010)#define DSTAT0 (*(volatile unsigned long *) 0x4B000014)#define DCSRC0 (*(volatile unsigned long *) 0x4B000018)#define DCDST0 (*(volatile unsigned long *) 0x4B00001C)#define DMASKTRIG0 (*(volatile unsigned long *) 0x4B000020)#define DISRC1 (*(volatile unsigned long *) 0x4B000040)#define DISRCC1 (*(volatile unsigned long *) 0x4B000044)#define DIDST1 (*(volatile unsigned long *) 0x4B000048)#define DIDSTC1 (*(volatile unsigned long *) 0x4B00004C)#define DCON1 (*(volatile unsigned long *) 0x4B000050)#define DSTAT1 (*(volatile unsigned long *) 0x4B000054)#define DCSRC1 (*(volatile unsigned long *) 0x4B000058)#define DCDST1 (*(volatile unsigned long *) 0x4B00005C)#define DMASKTRIG1 (*(volatile unsigned long *) 0x4B000060)#define DISRC2 (*(volatile unsigned long *) 0x4B000080)#define DISRCC2 (*(volatile unsigned long *) 0x4B000084)#define DIDST2 (*(volatile unsigned long *) 0x4B000088)#define DIDSTC2 (*(volatile unsigned long *) 0x4B00008C)#define DCON2 (*(volatile unsigned long *) 0x4B000090)#define DSTAT2 (*(volatile unsigned long *) 0x4B000094)#define DCSRC2 (*(volatile unsigned long *) 0x4B000098)#define DCDST2 (*(volatile unsigned long *) 0x4B00009C)#define DMASKTRIG2 (*(volatile unsigned long *) 0x4B0000a0)#define DISRC3 (*(volatile unsigned long *) 0x4B0000C0)#define DISRCC3 (*(volatile unsigned long *) 0x4B0000C4)#define DIDST3 (*(volatile unsigned long *) 0x4B0000C8)#define DIDSTC3 (*(volatile unsigned long *) 0x4B0000CC)#define DCON3 (*(volatile unsigned long *) 0x4B0000D0)#define DSTAT3 (*(volatile unsigned long *) 0x4B0000D4)#define DCSRC3 (*(volatile unsigned long *) 0x4B0000D8)#define DCDST3 (*(volatile unsigned long *) 0x4B0000DC)#define DMASKTRIG3 (*(volatile unsigned long *) 0x4B0000E0)// Clock & Power Management#define LOCKTIME (*(volatile unsigned long *) 0x4C000000)#define MPLLCON (*(volatile unsigned long *) 0x4C000004)#define UPLLCON (*(volatile unsigned long *) 0x4C000008)#define CLKCON (*(volatile unsigned long *) 0x4C00000C)#define CLKSLOW (*(volatile unsigned long *) 0x4C000010)#define CLKDIVN (*(volatile unsigned long *) 0x4C000014)#define CAMDIVN (*(volatile unsigned long *) 0x4C000018)// LCD Controller#define LCDCON1 (*(volatile unsigned long *) 0x4D000000)#define LCDCON2 (*(volatile unsigned long *) 0x4D000004)#define LCDCON3 (*(volatile unsigned long *) 0x4D000008)#define LCDCON4 (*(volatile unsigned long *) 0x4D00000C)#define LCDCON5 (*(volatile unsigned long *) 0x4D000010)#define LCDSADDR1 (*(volatile unsigned long *) 0x4D000014)#define LCDSADDR2 (*(volatile unsigned long *) 0x4D000018)#define LCDSADDR3 (*(volatile unsigned long *) 0x4D00001C)#define REDLUT (*(volatile unsigned long *) 0x4D000020)#define GREENLUT (*(volatile unsigned long *) 0x4D000024)#define BLUELUT (*(volatile unsigned long *) 0x4D000028)#define DITHMODE (*(volatile unsigned long *) 0x4D00004C)#define TPAL (*(volatile unsigned long *) 0x4D000050)#define LCDINTPND (*(volatile unsigned long *) 0x4D000054)#define LCDSRCPND (*(volatile unsigned long *) 0x4D000058)#define LCDINTMSK (*(volatile unsigned long *) 0x4D00005C)#define LPCSEL (*(volatile unsigned long *) 0x4D000060)#define PALETTE 0x4D000400// NAND flash#define NFCONF (*(volatile unsigned long *) 0x4E000000)#define NFCONT (*(volatile unsigned long *) 0x4E000004)#define NFCMD (*(volatile unsigned long *) 0x4E000008)#define NFADDR (*(volatile unsigned long *) 0x4E00000C)#define NFDATA (*(volatile unsigned long *) 0x4E000010)#define NFMECCD0 (*(volatile unsigned long *) 0x4E000014)#define NFMECCD1 (*(volatile unsigned long *) 0x4E000018)#define NFSECCD (*(volatile unsigned long *) 0x4E00001C)#define NFSTAT (*(volatile unsigned long *) 0x4E000020)#define NFESTAT0 (*(volatile unsigned long *) 0x4E000024)#define NFESTAT1 (*(volatile unsigned long *) 0x4E000028)#define NFMECC0 (*(volatile unsigned long *) 0x4E00002C)#define NFMECC1 (*(volatile unsigned long *) 0x4E000030)#define NFSECC (*(volatile unsigned long *) 0x4E000034)#define NFSBLK (*(volatile unsigned long *) 0x4E000038)#define NFEBLK (*(volatile unsigned long *) 0x4E00003C)// Camera Interface#define CISRCFMT (*(volatile unsigned long *) 0x4F000000)#define CIWDOFST (*(volatile unsigned long *) 0x4F000004)#define CIGCTRL (*(volatile unsigned long *) 0x4F000008)#define CICOYSA1 (*(volatile unsigned long *) 0x4F000018)#define CICOYSA2 (*(volatile unsigned long *) 0x4F00001C)#define CICOYSA3 (*(volatile unsigned long *) 0x4F000020)#define CICOYSA4 (*(volatile unsigned long *) 0x4F000024)#define CICOCBSA1 (*(volatile unsigned long *) 0x4F000028)#define CICOCBSA2 (*(volatile unsigned long *) 0x4F00002C)#define CICOCBSA3 (*(volatile unsigned long *) 0x4F000030)#define CICOCBSA4 (*(volatile unsigned long *) 0x4F000034)#define CICORSA1 (*(volatile unsigned long *) 0x4F000038)#define CICORSA2 (*(volatile unsigned long *) 0x4F00003C)#define CICORSA3 (*(volatile unsigned long *) 0x4F000040)#define CICORSA4 (*(volatile unsigned long *) 0x4F000044)#define CICOTRGFMT (*(volatile unsigned long *) 0x4F000048)#define CICOCTRL (*(volatile unsigned long *) 0x4F00004C)#define CICOSCPRERATIO (*(volatile unsigned long *) 0x4F000050)#define CICOSCPREDST (*(volatile unsigned long *) 0x4F000054)#define CICOSCCTRL (*(volatile unsigned long *) 0x4F000058)#define CICOTAREA (*(volatile unsigned long *) 0x4F00005C)#define CICOSTATUS (*(volatile unsigned long *) 0x4F000064)#define CIPRCLRSA1 (*(volatile unsigned long *) 0x4F00006C)#define CIPRCLRSA2 (*(volatile unsigned long *) 0x4F000070)#define CIPRCLRSA3 (*(volatile unsigned long *) 0x4F000074)#define CIPRCLRSA4 (*(volatile unsigned long *) 0x4F000078)#define CIPRTRGFMT (*(volatile unsigned long *) 0x4F00007C)#define CIPRCTRL (*(volatile unsigned long *) 0x4F000080)#define CIPRSCPRERATIO (*(volatile unsigned long *) 0x4F000084)#define CIPRSCPREDST (*(volatile unsigned long *) 0x4F000088)#define CIPRSCCTRL (*(volatile unsigned long *) 0x4F00008C)#define CIPRTAREA (*(volatile unsigned long *) 0x4F000090)#define CIPRSTATUS (*(volatile unsigned long *) 0x4F000098)#define CIIMGCPT (*(volatile unsigned long *) 0x4F0000A0)// UART#define ULCON0 (*(volatile unsigned long *) 0x50000000)#define UCON0 (*(volatile unsigned long *) 0x50000004)#define UFCON0 (*(volatile unsigned long *) 0x50000008)#define UMCON0 (*(volatile unsigned long *) 0x5000000C)#define UTRSTAT0 (*(volatile unsigned long *) 0x50000010)#define UERSTAT0 (*(volatile unsigned long *) 0x50000014)#define UFSTAT0 (*(volatile unsigned long *) 0x50000018)#define UMSTAT0 (*(volatile unsigned long *) 0x5000001C)#define UTXH0 (*(volatile unsigned char *) 0x50000020)#define URXH0 (*(volatile unsigned char *) 0x50000024)#define UBRDIV0 (*(volatile unsigned long *) 0x50000028)#define ULCON1 (*(volatile unsigned long *) 0x50004000)#define UCON1 (*(volatile unsigned long *) 0x50004004)#define UFCON1 (*(volatile unsigned long *) 0x50004008)#define UMCON1 (*(volatile unsigned long *) 0x5000400C)#define UTRSTAT1 (*(volatile unsigned long *) 0x50004010)#define UERSTAT1 (*(volatile unsigned long *) 0x50004014)#define UFSTAT1 (*(volatile unsigned long *) 0x50004018)#define UMSTAT1 (*(volatile unsigned long *) 0x5000401C)#define UTXH1 (*(volatile unsigned char *) 0x50004020)#define URXH1 (*(volatile unsigned char *) 0x50004024)#define UBRDIV1 (*(volatile unsigned long *) 0x50004028)#define ULCON2 (*(volatile unsigned long *) 0x50008000)#define UCON2 (*(volatile unsigned long *) 0x50008004)#define UFCON2 (*(volatile unsigned long *) 0x50008008)#define UMCON2 (*(volatile unsigned long *) 0x5000800C)#define UTRSTAT2 (*(volatile unsigned long *) 0x50008010)#define UERSTAT2 (*(volatile unsigned long *) 0x50008014)#define UFSTAT2 (*(volatile unsigned long *) 0x50008018)#define UTXH2 (*(volatile unsigned char *) 0x50008020)#define URXH2 (*(volatile unsigned char *) 0x50008024)#define UBRDIV2 (*(volatile unsigned long *) 0x50008028)#ifdef __BIG_ENDIAN#undef UTXH0#define UTXH0 (*(volatile unsigned char *) 0x50000023)#undef URXH0#define URXH0 (*(volatile unsigned char *) 0x50000027)#undef UTXH1#define UTXH1 (*(volatile unsigned char *) 0x50004023)#undef URXH1#define URXH1 (*(volatile unsigned char *) 0x50004027)#undef UTXH2#define UTXH2 (*(volatile unsigned char *) 0x50008023)#undef URXH2#define URXH2 (*(volatile unsigned char *) 0x50008027)#endif// PWM Timer#define TCFG0 (*(volatile unsigned long *) 0x51000000)#define TCFG1 (*(volatile unsigned long *) 0x51000004)#define TCON (*(volatile unsigned long *) 0x51000008)#define TCNTB0 (*(volatile unsigned long *) 0x5100000C)#define TCMPB0 (*(volatile unsigned long *) 0x51000010)#define TCNTO0 (*(volatile unsigned long *) 0x51000014)#define TCNTB1 (*(volatile unsigned long *) 0x51000018)#define TCMPB1 (*(volatile unsigned long *) 0x5100001C)#define TCNTO1 (*(volatile unsigned long *) 0x51000020)#define TCNTB2 (*(volatile unsigned long *) 0x51000024)#define TCMPB2 (*(volatile unsigned long *) 0x51000028)#define TCNTO2 (*(volatile unsigned long *) 0x5100002C)#define TCNTB3 (*(volatile unsigned long *) 0x51000030)#define TCMPB3 (*(volatile unsigned long *) 0x51000034)#define TCNTO3 (*(volatile unsigned long *) 0x51000038)#define TCNTB4 (*(volatile unsigned long *) 0x5100003C)#define TCNTO4 (*(volatile unsigned long *) 0x51000040)// USB Device#ifdef __BIG_ENDIAN#define FUNC_ADDR_REG (*(volatile unsigned char *) 0x52000143)#define PWR_REG (*(volatile unsigned char *) 0x52000147)#define EP_INT_REG (*(volatile unsigned char *) 0x5200014B)#define USB_INT_REG (*(volatile unsigned char *) 0x5200015B)#define EP_INT_EN_REG (*(volatile unsigned char *) 0x5200015F)#define USB_INT_EN_REG (*(volatile unsigned char *) 0x5200016F)#define FRAME_NUM1_REG (*(volatile unsigned char *) 0x52000173)#define FRAME_NUM2_REG (*(volatile unsigned char *) 0x52000177)#define INDEX_REG (*(volatile unsigned char *) 0x5200017B)#define MAXP_REG (*(volatile unsigned char *) 0x52000183)#define EP0_CSR (*(volatile unsigned char *) 0x52000187)#define IN_CSR1_REG (*(volatile unsigned char *) 0x52000187)#define IN_CSR2_REG (*(volatile unsigned char *) 0x5200018B)#define OUT_CSR1_REG (*(volatile unsigned char *) 0x52000193)#define OUT_CSR2_REG (*(volatile unsigned char *) 0x52000197)#define OUT_FIFO_CNT1_REG (*(volatile unsigned char *) 0x5200019B)#define OUT_FIFO_CNT2_REG (*(volatile unsigned char *) 0x5200019F)#define EP0_FIFO (*(volatile unsigned char *) 0x520001C3)#define EP1_FIFO (*(volatile unsigned char *) 0x520001C7)#define EP2_FIFO (*(volatile unsigned char *) 0x520001CF)#define EP3_FIFO (*(volatile unsigned char *) 0x520001CF)#define EP4_FIFO (*(volatile unsigned char *) 0x520001D3)#define EP1_DMA_CON (*(volatile unsigned char *) 0x52000203)#define EP1_DMA_UNIT (*(volatile unsigned char *) 0x52000207)#define EP1_DMA_FIFO (*(volatile unsigned char *) 0x5200020B)#define EP1_DMA_TTC_L (*(volatile unsigned char *) 0x5200020F)#define EP1_DMA_TTC_M (*(volatile unsigned char *) 0x52000213)#define EP1_DMA_TTC_H (*(volatile unsigned char *) 0x52000217)#define EP2_DMA_CON (*(volatile unsigned char *) 0x5200021B)#define EP2_DMA_UNIT (*(volatile unsigned char *) 0x5200021F)#define EP2_DMA_FIFO (*(volatile unsigned char *) 0x52000223)#define EP2_DMA_TTC_L (*(volatile unsigned char *) 0x52000227)#define EP2_DMA_TTC_M (*(volatile unsigned char *) 0x5200022B)#define EP2_DMA_TTC_H (*(volatile unsigned char *) 0x5200022F)#define EP3_DMA_CON (*(volatile unsigned char *) 0x52000243)#define EP3_DMA_UNIT (*(volatile unsigned char *) 0x52000247)#define EP3_DMA_FIFO (*(volatile unsigned char *) 0x5200024B)#define EP3_DMA_TTC_L (*(volatile unsigned char *) 0x5200024F)#define EP3_DMA_TTC_M (*(volatile unsigned char *) 0x52000253)#define EP3_DMA_TTC_H (*(volatile unsigned char *) 0x52000257)#define EP4_DMA_CON (*(volatile unsigned char *) 0x5200025B)#define EP4_DMA_UNIT (*(volatile unsigned char *) 0x5200025F)#define EP4_DMA_FIFO (*(volatile unsigned char *) 0x52000263)#define EP4_DMA_TTC_L (*(volatile unsigned char *) 0x52000267)#define EP4_DMA_TTC_M (*(volatile unsigned char *) 0x5200026B)#define EP4_DMA_TTC_H (*(volatile unsigned char *) 0x5200026F)#else // Little Endian#define FUNC_ADDR_REG (*(volatile unsigned char *) 0x52000140)#define PWR_REG (*(volatile unsigned char *) 0x52000144)#define EP_INT_REG (*(volatile unsigned char *) 0x52000148)#define USB_INT_REG (*(volatile unsigned char *) 0x52000158)#define EP_INT_EN_REG (*(volatile unsigned char *) 0x5200015C)#define USB_INT_EN_REG (*(volatile unsigned char *) 0x5200016C)#define FRAME_NUM1_REG (*(volatile unsigned char *) 0x52000170)#define FRAME_NUM2_REG (*(volatile unsigned char *) 0x52000174)#define INDEX_REG (*(volatile unsigned char *) 0x52000178)#define MAXP_REG (*(volatile unsigned char *) 0x52000180)#define EP0_CSR (*(volatile unsigned char *) 0x52000184)#define IN_CSR1_REG (*(volatile unsigned char *) 0x52000184)#define IN_CSR2_REG (*(volatile unsigned char *) 0x52000188)#define OUT_CSR1_REG (*(volatile unsigned char *) 0x52000190)#define OUT_CSR2_REG (*(volatile unsigned char *) 0x52000194)#define OUT_FIFO_CNT1_REG (*(volatile unsigned char *) 0x52000198)#define OUT_FIFO_CNT2_REG (*(volatile unsigned char *) 0x5200019C)#define EP0_FIFO (*(volatile unsigned char *) 0x520001C0)#define EP1_FIFO (*(volatile unsigned char *) 0x520001C4)#define EP2_FIFO (*(volatile unsigned char *) 0x520001C8)#define EP3_FIFO (*(volatile unsigned char *) 0x520001CC)#define EP4_FIFO (*(volatile unsigned char *) 0x520001D0)#define EP1_DMA_CON (*(volatile unsigned char *) 0x52000200)#define EP1_DMA_UNIT (*(volatile unsigned char *) 0x52000204)#define EP1_DMA_FIFO (*(volatile unsigned char *) 0x52000208)#define EP1_DMA_TTC_L (*(volatile unsigned char *) 0x5200020C)#define EP1_DMA_TTC_M (*(volatile unsigned char *) 0x52000210)#define EP1_DMA_TTC_H (*(volatile unsigned char *) 0x52000214)#define EP2_DMA_CON (*(volatile unsigned char *) 0x52000218)#define EP2_DMA_UNIT (*(volatile unsigned char *) 0x5200021C)#define EP2_DMA_FIFO (*(volatile unsigned char *) 0x52000220)#define EP2_DMA_TTC_L (*(volatile unsigned char *) 0x52000224)#define EP2_DMA_TTC_M (*(volatile unsigned char *) 0x52000228)#define EP2_DMA_TTC_H (*(volatile unsigned char *) 0x5200022C)#define EP3_DMA_CON (*(volatile unsigned char *) 0x52000240)#define EP3_DMA_UNIT (*(volatile unsigned char *) 0x52000244)#define EP3_DMA_FIFO (*(volatile unsigned char *) 0x52000248)#define EP3_DMA_TTC_L (*(volatile unsigned char *) 0x5200024C)#define EP3_DMA_TTC_M (*(volatile unsigned char *) 0x52000250)#define EP3_DMA_TTC_H (*(volatile unsigned char *) 0x52000254)#define EP4_DMA_CON (*(volatile unsigned char *) 0x52000258)#define EP4_DMA_UNIT (*(volatile unsigned char *) 0x5200025C)#define EP4_DMA_FIFO (*(volatile unsigned char *) 0x52000260)#define EP4_DMA_TTC_L (*(volatile unsigned char *) 0x52000264)#define EP4_DMA_TTC_M (*(volatile unsigned char *) 0x52000268)#define EP4_DMA_TTC_H (*(volatile unsigned char *) 0x5200026C)#endif// Watchdog Timer#define WTCON (*(volatile unsigned long *) 0x53000000)#define WTDAT (*(volatile unsigned long *) 0x53000004)#define WTCNT (*(volatile unsigned long *) 0x53000008)// IIC#define IICCON (*(volatile unsigned long *) 0x54000000)#define IICSTAT (*(volatile unsigned long *) 0x54000004)#define IICADD (*(volatile unsigned long *) 0x54000008)#define IICDS (*(volatile unsigned long *) 0x5400000C)#define IICLC (*(volatile unsigned long *) 0x54000010)// IIS#define IISCON (*(volatile unsigned long *) 0x55000000)#define IISMOD (*(volatile unsigned long *) 0x55000004)#define IISPSR (*(volatile unsigned long *) 0x55000008)#define IISFCON (*(volatile unsigned long *) 0x5500000C)#define IISFIFO (*(volatile unsigned short*) 0x55000010)#ifdef __BIG_ENDIAN#undef IISFIFO#define IISFIFO (*(volatile unsigned short*) 0x55000012)#endif// I/O port #define GPACON (*(volatile unsigned long *) 0x56000000)#define GPADAT (*(volatile unsigned long *) 0x56000004) #define GPBCON (*(volatile unsigned long *) 0x56000010)#define GPBDAT (*(volatile unsigned long *) 0x56000014)#define GPBUP (*(volatile unsigned long *) 0x56000018) #define GPCCON (*(volatile unsigned long *) 0x56000020)#define GPCDAT (*(volatile unsigned long *) 0x56000024)#define GPCUP (*(volatile unsigned long *) 0x56000028) #define GPDCON (*(volatile unsigned long *) 0x56000030)#define GPDDAT (*(volatile unsigned long *) 0x56000034)#define GPDUP (*(volatile unsigned long *) 0x56000038) #define GPECON (*(volatile unsigned long *) 0x56000040)#define GPEDAT (*(volatile unsigned long *) 0x56000044)#define GPEUP (*(volatile unsigned long *) 0x56000048) #define GPFCON (*(volatile unsigned long *) 0x56000050)#define GPFDAT (*(volatile unsigned long *) 0x56000054)#define GPFUP (*(volatile unsigned long *) 0x56000058) #define GPGCON (*(volatile unsigned long *) 0x56000060)#define GPGDAT (*(volatile unsigned long *) 0x56000064)#define GPGUP (*(volatile unsigned long *) 0x56000068) #define GPHCON (*(volatile unsigned long *) 0x56000070)#define GPHDAT (*(volatile unsigned long *) 0x56000074)#define GPHUP (*(volatile unsigned long *) 0x56000078)#define GPJCON (*(volatile unsigned long *) 0x560000D0)#define GPJDAT (*(volatile unsigned long *) 0x560000D4)#define GPJUP (*(volatile unsigned long *) 0x560000D8) #define MISCCR (*(volatile unsigned long *) 0x56000080)#define DCLKCON (*(volatile unsigned long *) 0x56000084)#define EXTINT0 (*(volatile unsigned long *) 0x56000088)#define EXTINT1 (*(volatile unsigned long *) 0x5600008C)#define EXTINT2 (*(volatile unsigned long *) 0x56000090)#define EINTFLT0 (*(volatile unsigned long *) 0x56000094)#define EINTFLT1 (*(volatile unsigned long *) 0x56000098)#define EINTFLT2 (*(volatile unsigned long *) 0x5600009C)#define EINTFLT3 (*(volatile unsigned long *) 0x560000A0)#define EINTMASK (*(volatile unsigned long *) 0x560000A4)#define EINTPEND (*(volatile unsigned long *) 0x560000A8)#define GSTATUS0 (*(volatile unsigned long *) 0x560000AC)#define GSTATUS1 (*(volatile unsigned long *) 0x560000B0)#define GSTATUS2 (*(volatile unsigned long *) 0x560000B4)#define GSTATUS3 (*(volatile unsigned long *) 0x560000B8)#define GSTATUS4 (*(volatile unsigned long *) 0x560000BC)#define MSLCON (*(volatile unsigned long *) 0x560000CC)// RTC#ifdef __BIG_ENDIAN#define RTCCON (*(volatile unsigned char *) 0x57000043)#define TICNT (*(volatile unsigned char *) 0x57000047)#define RTCALM (*(volatile unsigned char *) 0x57000053)#define ALMSEC (*(volatile unsigned char *) 0x57000057)#define ALMMIN (*(volatile unsigned char *) 0x5700005B)#define ALMHOUR (*(volatile unsigned char *) 0x5700005F)#define ALMDATE (*(volatile unsigned char *) 0x57000063)#define ALMMON (*(volatile unsigned char *) 0x57000067)#define ALMYEAR (*(volatile unsigned char *) 0x5700006B)#define RTCRST (*(volatile unsigned char *) 0x5700006F)#define BCDSEC (*(volatile unsigned char *) 0x57000073)#define BCDMIN (*(volatile unsigned char *) 0x57000077)#define BCDHOUR (*(volatile unsigned char *) 0x5700007B)#define BCDDATE (*(volatile unsigned char *) 0x5700007F)#define BCDDAY (*(volatile unsigned char *) 0x57000083)#define BCDMON (*(volatile unsigned char *) 0x57000087)#define BCDYEAR (*(volatile unsigned char *) 0x5700008B)#else //Little Endian#define RTCCON (*(volatile unsigned char *) 0x57000040)#define TICNT (*(volatile unsigned char *) 0x57000044)#define RTCALM (*(volatile unsigned char *) 0x57000050)#define ALMSEC (*(volatile unsigned char *) 0x57000054)#define ALMMIN (*(volatile unsigned char *) 0x57000058)#define ALMHOUR (*(volatile unsigned char *) 0x5700005C)#define ALMDATE (*(volatile unsigned char *) 0x57000060)#define ALMMON (*(volatile unsigned char *) 0x57000064)#define ALMYEAR (*(volatile unsigned char *) 0x57000068)#define RTCRST (*(volatile unsigned char *) 0x5700006C)#define BCDSEC (*(volatile unsigned char *) 0x57000070)#define BCDMIN (*(volatile unsigned char *) 0x57000074)#define BCDHOUR (*(volatile unsigned char *) 0x57000078)#define BCDDATE (*(volatile unsigned char *) 0x5700007C)#define BCDDAY (*(volatile unsigned char *) 0x57000080)#define BCDMON (*(volatile unsigned char *) 0x57000084)#define BCDYEAR (*(volatile unsigned char *) 0x57000088)#endif// A/D Converter#define ADCCON (*(volatile unsigned long *) 0x58000000)#define ADCTSC (*(volatile unsigned long *) 0x58000004)#define ADCDLY (*(volatile unsigned long *) 0x58000008)#define ADCDAT0 (*(volatile unsigned long *) 0x5800000C)#define ADCDAT1 (*(volatile unsigned long *) 0x58000010)#define ADCUPDN (*(volatile unsigned long *) 0x58000014) // SPI #define SPCON0 (*(volatile unsigned long *) 0x59000000)#define SPSTA0 (*(volatile unsigned long *) 0x59000004)#define SPPIN0 (*(volatile unsigned long *) 0x59000008)#define SPPRE0 (*(volatile unsigned long *) 0x5900000C)#define SPTDAT0 (*(volatile unsigned long *) 0x59000010)#define SPRDAT0 (*(volatile unsigned long *) 0x59000014)#define SPCON1 (*(volatile unsigned long *) 0x59000020)#define SPSTA1 (*(volatile unsigned long *) 0x59000024)#define SPPIN1 (*(volatile unsigned long *) 0x59000028)#define SPPRE1 (*(volatile unsigned long *) 0x5900002C)#define SPTDAT1 (*(volatile unsigned long *) 0x59000030)#define SPRDAT1 (*(volatile unsigned long *) 0x59000034)// SD Interface#define SDICON (*(volatile unsigned long *) 0x5A000000)#define SDIPRE (*(volatile unsigned long *) 0x5A000004)#define SDICARG (*(volatile unsigned long *) 0x5A000008)#define SDICCON (*(volatile unsigned long *) 0x5A00000C)#define SDICSTA (*(volatile unsigned long *) 0x5A000010)#define SDIRSP0 (*(volatile unsigned long *) 0x5A000014)#define SDIRSP1 (*(volatile unsigned long *) 0x5A000018)#define SDIRSP2 (*(volatile unsigned long *) 0x5A00001C)#define SDIRSP3 (*(volatile unsigned long *) 0x5A000020)#define SDIDTIMER (*(volatile unsigned long *) 0x5A000024)#define SDIBSIZE (*(volatile unsigned long *) 0x5A000028)#define SDIDCON (*(volatile unsigned long *) 0x5A00002C)#define SDIDCNT (*(volatile unsigned long *) 0x5A000030)#define SDIDSTA (*(volatile unsigned long *) 0x5A000034)#define SDIFSTA (*(volatile unsigned long *) 0x5A000038)#define SDIIMSK (*(volatile unsigned long *) 0x5A00003C)#define SDIDAT (*(volatile unsigned char *) 0x5A000040)#ifdef __BIG_ENDIAN#undef SDIDAT#define SDIDAT (*(volatile unsigned char *) 0x5A000043)#endif// AC97 Audio-CODEC Interface#define AC_GLBCTRL (*(volatile unsigned long *) 0x5B000000)#define AC_GLBSTAT (*(volatile unsigned long *) 0x5B000004)#define AC_CODEC_CMD (*(volatile unsigned long *) 0x5B000008)#define AC_CODEC_STAT (*(volatile unsigned long *) 0x5B00000C)#define AC_PCMADDR (*(volatile unsigned long *) 0x5B000010)#define AC_MICADDR (*(volatile unsigned long *) 0x5B000014)#define AC_PCMDATA (*(volatile unsigned long *) 0x5B000018)#define AC_MICDATA (*(volatile unsigned long *) 0x5B00001C)// Interrupt Pending Bit#define BIT_EINT0 (1 << 0)#define BIT_EINT1 (1 << 1)#define BIT_EINT2 (1 << 2)#define BIT_EINT3 (1 << 3)#define BIT_EINT4_7 (1 << 4)#define BIT_EINT8_23 (1 << 5)#define BIT_CAM (1 << 6)#define BIT_nBAT_FLT (1 << 7)#define BIT_TICK (1 << 8)#define BIT_WDT_AC97 (1 << 9)#define BIT_TIMER0 (1 << 10)#define BIT_TIMER1 (1 << 11)#define BIT_TIMER2 (1 << 12)#define BIT_TIMER3 (1 << 13)#define BIT_TIMER4 (1 << 14)#define BIT_UART2 (1 << 15)#define BIT_LCD (1 << 16)#define BIT_DMA0 (1 << 17)#define BIT_DMA1 (1 << 18)#define BIT_DMA2 (1 << 19)#define BIT_DMA3 (1 << 20)#define BIT_SDI (1 << 21)#define BIT_SPI0 (1 << 22)#define BIT_UART1 (1 << 23)#define BIT_NFCON (1 << 24)#define BIT_USBD (1 << 25)#define BIT_USBH (1 << 26)#define BIT_IIC (1 << 27)#define BIT_UART0 (1 << 28)#define BIT_SPI1 (1 << 29)#define BIT_RTC (1 << 30)#define BIT_ADC (1 << 31)#define BIT_ALLMSK (0xFFFFFFFF)#define BIT_SUB_RXD0 (1 << 0)#define BIT_SUB_TXD0 (1 << 1)#define BIT_SUB_ERR0 (1 << 2)#define BIT_SUB_RXD1 (1 << 3)#define BIT_SUB_TXD1 (1 << 4)#define BIT_SUB_ERR1 (1 << 5)#define BIT_SUB_RXD2 (1 << 6)#define BIT_SUB_TXD2 (1 << 7)#define BIT_SUB_ERR2 (1 << 8)#define BIT_SUB_TC (1 << 9)#define BIT_SUB_ADC_S (1 << 10)#define BIT_SUB_CAM_C (1 << 11)#define BIT_SUB_CAM_P (1 << 12)#define BIT_SUB_WDT (1 << 13)#define BIT_SUB_AC97 (1 << 14)#define BIT_SUB_ALLMSK (0x000007FF)#define ClearPending(bit) { SRCPND = bit; \ INTPND = INTPND; }#endif // __S3C2440_H
//-------------- GPIO操作的头文件 ----------------------------
#ifndef _GPIO_H_#define _GPIO_H_#include "s3c2440.h"void Delay(int x);void Led_Init(void);void Led_ON(int x);void Led_OFF(int x);void Bell_Init(void);void Bell_ON(void);void Bell_OFF(void);void Key_Init(void);int Key_Scan(void);#endif
//-------------- GPIO操作的源文件 ----------------------------
/*;; 文件名:init.s; 说明: 启动代码;AREA |DATA|, CODE, READONLYENTRYldr r13, =0x1000IMPORT timerMainb timerMain ;我是在END;----------------- the end of init.s ----------------------*/
/* * 文件:led.c * 说明:有关LED控制的函数*//*LED借口说明LED0 ----- GPB5LED1 ----- GPB6LED2 ----- GPB8LED3 ----- GPB10*/void Delay(int x){int i=0;while(x){for(i = 0; i < 2000; i++);x--;}}void Led_Init(void){GPBCON &= 0xCCC3FF;GPBCON |= 0x111400;//GPB5, GPB6, GPB8, GPB10设置为输出GPBDAT |= ((1<<5) | (1<<6) | (1<<8) | (1<<10));//关闭LEDGPBUP = 0x00;}void Led_ON(int x){switch(x){case 0: GPBDAT &= ~(1<<5); break;case 1: GPBDAT &= ~(1<<6); break;case 2: GPBDAT &= ~(1<<8); break;case 3: GPBDAT &= ~(1<<10); break;default: break;}}void Led_OFF(int x){switch(x){case 0: GPBDAT |= (1<<5); break;case 1: GPBDAT |= (1<<6); break;case 2: GPBDAT |= (1<<8); break;case 3: GPBDAT |= (1<<10); break;default: break;}}// ----------------------- the end of bell.c ---------------------
/* * 文件:bell.c * 说明:有关bell控制的函数*//*bell接口说明BELL ----- GPB0*/void Bell_Init(void){GPBCON &= ~0x3;GPBCON |= 0x1;GPBUP &= ~0x1;//使能上拉}void Bell_ON(void){GPBDAT |= 0x1; }void Bell_OFF(void){GPBDAT &= ~0x1; H*}// ----------------------- the end of bell.c ---------------------
/* * 文件:key.c * 说明:有关key控制的函数*//*按键接口说明GPF0 ------ 按键S2------- key1GPF2 ------ 按键S3------- key2GPF3 ------ 按键S4------- key3GPF4 ------ 按键S5------- key4*/static void Key_Delay(void){int n;for(n = 0; n < 1000; n++);}void Key_Init(void){GPFCON &= ~(3<<0 | 3<<2*2 | 3<<2*3 | 3<<2*4);GPFUP &= ~(1<<0 | 1<<2 | 1<<3 | 1<<4);}
/* * 函数:Key_Scan * 说明:扫描按键,返回被按下按键的值 * 返回值:对应按键的值*/int Key_Scan(void){int tmp = 0;if((GPFDAT&0x01) == 0){Key_Delay();if((GPFDAT&0x01) == 0){while((GPFDAT&0x01) == 0);tmp = 1;}}if((GPFDAT&0x04) == 0){Key_Delay();if((GPFDAT&0x04) == 0){while((GPFDAT&0x04) == 0);tmp = 2;}}if((GPFDAT&0x08) == 0){Key_Delay();if((GPFDAT&0x08) == 0){while((GPFDAT&0x08) == 0);tmp = 3;}}if((GPFDAT&0x10) == 0){Key_Delay();if((GPFDAT&0x10) == 0){while((GPFDAT&0x10) == 0);tmp = 4;}}return tmp;}// ----------------------- the end of key.c ---------------------
//-------------- watchdog操作的头文件 ----------------------------
#ifndef _WATCHDOG_H_#define _WATCHDOG_H_#include "s3c440.h"void watchdog_Init(void);#endif/* --------------- 应用实例 ------------------void timer(void){//int n;//char str[] = "luoxn28\n";Led_Init();Bell_Init();Key_Init();UART0_Init();watchdog_Init();ISR_WDT_AC97 = (u32)watchdog;//UART_SendString("\n the old data:\n");while(1){Led_ON(0);Delay(200);Led_OFF(0);Delay(200);//WTCNT = 50000; //喂狗,重新赋值,防止中断Led_ON(1);Delay(200);Led_OFF(1);Delay(200);//WTCNT = 50000; //喂狗,重新赋值,防止中断}}*/
//-------------- watchdog操作的源文件 ----------------------------
#include "watchdog.h"#define _ISR_STARTADD 0x33FFFF00#define ISR_WDT_AC97 (*(unsigned *)(_ISR_STARTADD + 0x44))char cnt = 0;__irq void watchdog(void){cnt++;if((cnt%2) == 1){Led_ON(2);UART_SendString("\n Led_ON(2)\n");}else{Led_ON(3);UART_SendString("\n Led_ON(3)\n");}UART_SendChar((char)(cnt/100 + '0'));UART_SendChar(cnt/10%10 + '0');UART_SendChar(cnt%10 + '0');//清中断标志位SRCPND = 0x1<<9;SUBSRCPND = 0x1<<13;INTPND = 0x1<<9;WTCNT = 50000; }//看门狗产生中断方式void watchdog_Init(void){WTCON = 0xf9<<8; //Prescaler = 249,Division = 16,时钟频率为12.5kHz //禁止看门狗复位WTDAT = 50000; //设置看门狗定时器超时时间为4秒(50÷12.5)WTCNT = 50000;WTCON |= (1<<5)|(1<<2); //开启看门狗定时器中断SRCPND = 0x1<<9;SUBSRCPND = 0x1<<13;INTPND = 0x1<<9;INTSUBMSK = ~(0x1<<13); //打开中断子屏蔽INTMSK = ~(0x1<<9); //打开中断屏蔽}
//-------------- nanflash操作的头文件 ----------------------------
#ifndef _NANDFLASH_H_#define _NANDFLASH_H_#include "s3c2440.h"typedef unsigned int u32;typedef unsigned char u8;#define CMD_READ1 0x00 //页读命令周期1#define CMD_READ2 0x30 //页读命令周期2#define CMD_READID 0x90 //读ID命令#define CMD_WRITE1 0x80 //页写命令周期1#define CMD_WRITE2 0x10 //页写命令周期2#define CMD_ERASE1 0x60 //块擦除命令周期1#define CMD_ERASE2 0xd0 //块擦除命令周期2#define CMD_STATUS 0x70 //读状态命令#define CMD_RESET 0xff //复位#define CMD_RANDOMREAD1 0x05 //随意读命令周期1#define CMD_RANDOMREAD2 0xE0 //随意读命令周期2#define CMD_RANDOMWRITE 0x85 //随意写命令#define NFDATA8 (*(volatile unsigned char *)0x4E000010)#define NF_CMD(data) NFCMD = (data) //传输命令#define NF_ADDR(addr) NFADDR = (addr) //传输地址#define NF_RDDATA() (NFDATA) //读32位数据#define NF_RDDATA8() (NFDATA8) //读8位数据#define NF_WRDATA(data) NFDATA = (data) //写32位数据#define NF_WRDATA8(data) NFDATA8 = (data) //写8位数据#define TACLS 1#define TWRPH0 2#define TWRPH1 0#define NF_nFCE_L() NFCONT &= ~(1<<1)#define NF_CE_L() NF_nFCE_L() //打开nandflash片选#define NF_nFCE_H() NFCONT |= (1<<1)#define NF_CE_H() NF_nFCE_H() //关闭nandflash片选#define NF_RSTECC() NFCONT |= (1<<4) //复位ECC#define NF_MECC_UnLock() NFCONT &= ~(1<<5) //解锁main区ECC#define NF_MECC_Lock() NFCONT |= (1<<5) //锁定main区ECC#define NF_SECC_UnLock() NFCONT &= ~(1<<6) //解锁spare区ECC#define NF_SECC_Lock() NFCONT |= (1<<6) //锁定spare区ECC#define NF_WAITRB() while(!(NFSTAT&(1<<0))) //等待nandflash不忙#define NF_CLEAR_RB() NFSTAT |= (1<<2) //清除RnB信号#define NF_DETECT_RB() while(!(NFSTAT&(1<<2))) //等待RnB信号变高,即不忙void NF_Init ( void );char NF_ReadID();u8 NF_ReadPage(u32 page_number, char buffer[]);u8 NF_WritePage(u32 page_number, char buffer[]);u8 NF_EraseBlock(u32 block_number);u8 NF_RamdomRead(u32 page_number, u32 add);u8 NF_RamdomWrite(u32 page_number, u32 add, u8 dat);#endif /* -------------- 程序实例 --------------void main(void){int n;char str[] = "luoxn28\n";char buffer[2048], id;u32 NFBlockNO=6;u32 NFPagesNO = 25;u32 BlockPages;BlockPages =(NFBlockNO<<6)+NFPagesNO;Led_Init();Bell_Init();Key_Init();UART0_Init();NF_Init();id = NF_ReadID();UART_SendString("\ntest nand flash\n");UART_SendChar(id/100 + '0');UART_SendChar(id/10%10 + '0');UART_SendChar(id%10 + '0');UART_SendString("\n the old data:\n");NF_ReadPage(BlockPages*64, buffer);for(n = 0; n < 2048; n++){UART_SendChar(buffer[n]);}if(NF_EraseBlock(BlockPages) == 0x66){//NF_ReadPage(BlockPages*64, buffer);//for(n = 0; n < 2048; n++)//{// UART_SendChar(buffer[n]);//}UART_SendString("\nerase is ok1\n");}for(n = 0; n < 2048; n++){buffer[n] = 128 - n%128;}if(NF_WritePage(BlockPages*64, buffer) == 0x66){NF_ReadPage(BlockPages*64, buffer);UART_SendString("\nthe new data:\n");for(n = 0; n < 2048; n++){UART_SendChar(buffer[n]);}}while(1){Led_ON(0);Delay(1000);Led_OFF(0);Delay(1000);}}*/
//-------------- nanflash操作的源文件 ----------------------------
#include "nandflash.h"void NF_Init ( void ){GPACON = (GPACON &~(0x3f<<17)) | (0x3f<<17); //配置芯片引脚NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(0<<0);//TACLS=1、TWRPH0=2、TWRPH1=0,8位IO//非锁定,屏蔽nandflash中断,初始化ECC及锁定main区和spare区ECC,使能nandflash片选及控制器 NFCONT = (0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0);}static void NF_Reset(){NF_CE_L(); //打开nandflash片选NF_CLEAR_RB(); //清除RnB信号NF_CMD(CMD_RESET); //写入复位命令NF_DETECT_RB(); //等待RnB信号变高,即不忙NF_CE_H(); //关闭nandflash片选}char NF_ReadID(){char MID;char DID;char cyc3, cyc4, cyc5;NF_nFCE_L(); //打开nandflash片选NF_CLEAR_RB(); //清RnB信号NF_CMD(CMD_READID); //读ID命令NF_ADDR(0x0); //写0x00地址//读五个周期的IDMID = NF_RDDATA8(); //厂商ID:0xECDID = NF_RDDATA8(); //设备ID:0xDAcyc3 = NF_RDDATA8(); //0x10cyc4 = NF_RDDATA8(); //0x95cyc5 = NF_RDDATA8(); //0x44NF_nFCE_H(); //关闭nandflash片选return (DID);}u8 NF_ReadPage(u32 page_number, char buffer[]){u32 i, mecc0, secc;NF_RSTECC(); //复位ECCNF_MECC_UnLock(); //解锁main区ECCNF_nFCE_L(); //打开nandflash片选NF_CLEAR_RB(); //清RnB信号NF_CMD(CMD_READ1); //页读命令周期1//写入5个地址周期NF_ADDR(0x00); //列地址A0~A7NF_ADDR(0x00); //列地址A8~A11NF_ADDR((page_number) & 0xff); //行地址A12~A19NF_ADDR((page_number >> 8) & 0xff); //行地址A20~A27NF_ADDR((page_number >> 16) & 0xff); //行地址A28NF_CMD(CMD_READ2); //页读命令周期2NF_DETECT_RB(); //等待RnB信号变高,即不忙//读取一页数据内容for (i = 0; i < 2048; i++){ buffer[i] = NF_RDDATA8();}NF_MECC_Lock(); //锁定main区ECC值NF_SECC_UnLock(); //解锁spare区ECCmecc0=NF_RDDATA(); //读spare区的前4个地址内容,即第2048~2051地址,这4个字节为main区的ECC//把读取到的main区的ECC校验码放入NFMECCD0/1的相应位置内NFMECCD0=((mecc0&0xff00)<<8)|(mecc0&0xff);NFMECCD1=((mecc0&0xff000000)>>8)|((mecc0&0xff0000)>>16); NF_SECC_Lock(); //锁定spare区的ECC值secc=NF_RDDATA(); //继续读spare区的4个地址内容,即第2052~2055地址,其中前2个字节为spare区的ECC值//把读取到的spare区的ECC校验码放入NFSECCD的相应位置内NFSECCD=((secc&0xff00)<<8)|(secc&0xff);NF_nFCE_H(); //关闭nandflash片选//判断所读取到的数据是否正确if ((NFESTAT0&0xf) == 0x0) return 0x66; //正确else return 0x44; //错误}u8 NF_IsBadBlock(u32 block){ return NF_RamdomRead(block*64, 2054);}u8 NF_MarkBadBlock(u32 block){u8 result; result = NF_RamdomWrite(block*64, 2054, 0x33); if(result == 0x44)return 0x21; //写坏块标注失败 else return 0x60; //写坏块标注成功}void NF_Delay(int n){int i;while(n > 0){n--;for(i = 0; i < 200; i++);}}u8 ECCBuf[6];u8 NF_WritePage(u32 page_number, char buffer[]){u32 i, mecc0, secc;u8 stat, temp;temp = NF_IsBadBlock(page_number>>6); //判断该块是否为坏块if(temp == 0x33) return 0x42; //是坏块,返回NF_RSTECC(); //复位ECCNF_MECC_UnLock(); //解锁main区的ECCNF_nFCE_L(); //打开nandflash片选NF_CLEAR_RB(); //清RnB信号NF_CMD(CMD_WRITE1); //页写命令周期1//写入5个地址周期NF_ADDR(0x00); //列地址A0~A7NF_ADDR(0x00); //列地址A8~A11NF_ADDR((page_number) & 0xff); //行地址A12~A19NF_ADDR((page_number >> 8) & 0xff); //行地址A20~A27NF_ADDR((page_number >> 16) & 0xff); //行地址A28//写入一页数据for (i = 0; i < 2048; i++){ NF_WRDATA8((char)buffer[i]);}NF_MECC_Lock(); //锁定main区的ECC值mecc0=NFMECC0; //读取main区的ECC校验码//把ECC校验码由字型转换为字节型,并保存到全局变量数组ECCBuf中ECCBuf[0]=(u8)(mecc0&0xff);ECCBuf[1]=(u8)((mecc0>>8) & 0xff);ECCBuf[2]=(u8)((mecc0>>16) & 0xff);ECCBuf[3]=(u8)((mecc0>>24) & 0xff);NF_SECC_UnLock(); //解锁spare区的ECC//把main区的ECC值写入到spare区的前4个字节地址内,即第2048~2051地址for(i=0;i<4;i++){ NF_WRDATA8(ECCBuf[i]);}NF_SECC_Lock(); //锁定spare区的ECC值secc=NFSECC; //读取spare区的ECC校验码//把ECC校验码保存到全局变量数组ECCBuf中ECCBuf[4]=(u8)(secc&0xff);ECCBuf[5]=(u8)((secc>>8) & 0xff);//把spare区的ECC值继续写入到spare区的第2052~2053地址内for(i=4;i<6;i++){ NF_WRDATA8(ECCBuf[i]);}NF_CMD(CMD_WRITE2); //页写命令周期2NF_Delay(1000); //延时一段时间,以等待写操作完成NF_CMD(CMD_STATUS); //读状态命令//判断状态值的第6位是否为1,即是否在忙,该语句的作用与NF_DETECT_RB();相同do{ stat = NF_RDDATA8();}while(!(stat&0x40));NF_nFCE_H(); //关闭nandflash片选//判断状态值的第0位是否为0,为0则写操作正确,否则错误if (stat & 0x1){temp = NF_MarkBadBlock(page_number>>6); //标注该页所在的块为坏块if (temp == 0x21) return 0x43; //标注坏块失败else return 0x44; //写操作失败}elsereturn 0x66; //写操作成功}u8 stat;u8 NF_EraseBlock(u32 block_number){char stat, temp;temp = NF_IsBadBlock(block_number); //判断该块是否为坏块if(temp == 0x33) return 0x42; //是坏块,返回NF_nFCE_L(); //打开片选NF_CLEAR_RB(); //清RnB信号NF_CMD(CMD_ERASE1); //擦除命令周期1//写入3个地址周期,从A18开始写起NF_ADDR((block_number << 6) & 0xff); //行地址A18~A19NF_ADDR((block_number >> 2) & 0xff); //行地址A20~A27NF_ADDR((block_number >> 10) & 0xff); //行地址A28NF_CMD(CMD_ERASE2); //擦除命令周期2 NF_Delay(1000); //延时一段时间 NF_CMD(CMD_STATUS); //读状态命令 //判断状态值的第6位是否为1,即是否在忙,该语句的作用与NF_DETECT_RB();相同do{ stat = NF_RDDATA8();}while(!(stat&0x40)); NF_nFCE_H(); //关闭nandflash片选 //判断状态值的第0位是否为0,为0则擦除操作正确,否则错误if (stat & 0x1){ temp = NF_MarkBadBlock(block_number>>6); //标注该块为坏块 if (temp == 0x21) return 0x43; //标注坏块失败 else return 0x44; //擦除操作失败}elsereturn 0x66; //擦除操作成功}u8 NF_RamdomRead(u32 page_number, u32 add){NF_nFCE_L(); //打开nandflash片选NF_CLEAR_RB(); //清RnB信号NF_CMD(CMD_READ1); //页读命令周期1//写入5个地址周期NF_ADDR(0x00); //列地址A0~A7NF_ADDR(0x00); //列地址A8~A11NF_ADDR((page_number) & 0xff); //行地址A12~A19NF_ADDR((page_number >> 8) & 0xff); //行地址A20~A27NF_ADDR((page_number >> 16) & 0xff); //行地址A28NF_CMD(CMD_READ2); //页读命令周期2NF_DETECT_RB(); //等待RnB信号变高,即不忙NF_CMD(CMD_RANDOMREAD1); //随意读命令周期1//页内地址NF_ADDR((char)(add&0xff)); //列地址A0~A7NF_ADDR((char)((add>>8)&0x0f)); //列地址A8~A11NF_CMD(CMD_RANDOMREAD2); //随意读命令周期2return NF_RDDATA8(); //读取数据} u8 NF_RamdomWrite(u32 page_number, u32 add, u8 dat){u8 stat;NF_nFCE_L(); //打开nandflash片选NF_CLEAR_RB(); //清RnB信号NF_CMD(CMD_WRITE1); //页写命令周期1//写入5个地址周期NF_ADDR(0x00); //列地址A0~A7NF_ADDR(0x00); //列地址A8~A11NF_ADDR((page_number) & 0xff); //行地址A12~A19NF_ADDR((page_number >> 8) & 0xff); //行地址A20~A27NF_ADDR((page_number >> 16) & 0xff); //行地址A28NF_CMD(CMD_RANDOMWRITE); //随意写命令//页内地址NF_ADDR((char)(add&0xff)); //列地址A0~A7NF_ADDR((char)((add>>8)&0x0f)); //列地址A8~A11NF_WRDATA8(dat); //写入数据NF_CMD(CMD_WRITE2); //页写命令周期2NF_Delay(1000); //延时一段时间NF_CMD(CMD_STATUS); //读状态命令//判断状态值的第6位是否为1,即是否在忙,该语句的作用与NF_DETECT_RB();相同do{stat = NF_RDDATA8();}while(!(stat&0x40));NF_nFCE_H(); //关闭nandflash片选//判断状态值的第0位是否为0,为0则写操作正确,否则错误if (stat & 0x1)return 0x44; //失败elsereturn 0x66; //成功}
- s3c2440学习笔记(上)-基于FL2440
- FL2440驱动添加(3)LCD驱动添加学习笔记
- s3c2440学习笔记
- S3C2440学习笔记
- s3c2440学习笔记 串口
- s3c2440学习笔记 MMU
- 基于S3C2440的busybox的移植---解决FL2440的shell指令不能自动补全
- 基于FL2440平台在linux内核上led驱动开发
- 嵌入式arm学习总结(七)--中断-基于S3C2440
- s3c2440时钟学习(韦东山老师课程学习笔记)
- s3c2440学习笔记 存储管理器
- s3c2440 内存管理单元MMU学习笔记 (修改中)
- linux驱动学习笔记(S3C2440的LED驱动)
- ARM 学习笔记(二) S3C2440 中断配置
- ARM 学习笔记 (三) S3C2440 MMU 配置
- ARM 学习笔记 (三) S3C2440 MMU 配置
- ARM 学习笔记 (三) S3C2440 MMU 配置
- led驱动程序 基于FL2440
- uva 1444 - Knowledge for the masses(高效)
- RMI远程方法调用
- Struck跟踪算法(一)
- poj1915 bfs
- 【索引】Designing Efficient Algorithms:Examples:Advanced
- s3c2440学习笔记(上)-基于FL2440
- 2014 Multi-University Training Contest 2--by 镇海中学 解题报告
- 关于数据交换,不用临时变量的小算法 2014-7-25
- webService总结(四)——使用axis2发布和调用webService
- 在WPF程序中使用摄像头兼谈如何使用AForge.NET控件
- 从零开始—尝试java的for循环
- Java学习笔记(五)垃圾强制回收
- windows phone 2048源代码无偿奉上
- 对于cocos2dx,3.0的android编译问题