第2章ARM基础开发1_第1页
第2章ARM基础开发1_第2页
第2章ARM基础开发1_第3页
第2章ARM基础开发1_第4页
第2章ARM基础开发1_第5页
已阅读5页,还剩97页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章ARM基础开发2.1S3C2440概述2.2编程基础2.3时钟与电源体系2.4GPIO2.5存储器控制器2.6异常系统2.7定时器2.8ADC与触摸屏12.1S3C2440概述1.系统结构:ARM920T内核外设

ARM9TDMI核心MMUCache22.1S3C2440概述2.外设接口:ARM920T内核外设外设控制执行AMBA总线标准

AMBA:是ARM公司研发的一种标准,其中定义了三组总线,AHB、ASB和APB。AHB:用于高速外设ASB:系统总线APB:用于低速外设32.2.1S3C2440体系结构

1.体系结构采用哈佛结构冯·诺依曼结构:单一存储、统一编址、分时复用哈佛结构:分开存储、独立编址、两倍带宽、执行效率更高42.2.1S3C2440体系结构

1.体系结构5级流水线技术52.2.1S3C2440体系结构

1.体系结构两套指令集:32位ARM、16位Thumb

Thumb为ARM的功能子集可节省30%-40%的存储空间支持MMU,实现虚拟内存管理以及访问权限的定义,使处理器可以支持操作系统中多任务的运行。支持16KB数据Cache和16KB指令Cache,极大的提高了处理器的运行速度。

62.2.1S3C2440体系结构

2.工作状态:72.2.1S3C2440体系结构

2.工作状态:切换

使用BX指令将内核的操作状态在ARM状态和Thumb状态之间进行切换;从Arm状态切换到Thumb状态

LDRR0,=Lable+1BXR0;从Thumb状态切换到ARM状态

LDRR0,=LableBXR0地址最低位为1,表示切换到Thumb状态地址最低位为0,表示切换到ARM状态跳转地址标号82.2.1S3C2440体系结构

3.运行模式:ARM920T有七种运行模式处理器模式说明备注

用户(usr)正常程序工作模式不能直接切换到其它模式

系统(sys)用于支持操作系统的特权任务等可以直接切换到其它模式等特权

快中断(fiq)支持高速数据传输及通道处理FIQ异常响应时进入此模式

中断(irq)用于通用中断处理IRQ异常响应时进入此模式

管理(svc)操作系统保护代码系统复位和软件中断时进入此模式

中止(abt)用于虚拟存储及存储保护数据或指令预取中止时进入

未定义(und)用于软件仿真的硬件协处理未定义指令异常响应时进入此模式92.2.1S3C2440体系结构寄存器寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理中止未定义中断快中断通用寄存器R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiq*R9(SB,v6)R9R9_fiq*R10(SL,v7)R10R10_fiq*R11(FP,v8)R11R11_fiq*R12(IP)R12R12_fiq*R13(SP)R13R13_svc*R13_abt*R13_und*R13_irq*R13_fiq*R14(LR)R14R14_svc*R14_abt*R14_und*R14_irq*R14_fiq*R15(PC)R15状态寄存器R16(CPSR)CPSRSPSR——SPSR_svcSPSR_abtSPSR_undSPSR_irqSPSR_fiq

5.寄存器组织:10

寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM处理器具有8种基本寻址方式。

1.寄存器寻址; 2.立即寻址;

3.寄存器移位寻址; 4.寄存器间接寻址;

5.基址寻址; 6.多寄存器寻址;

7.堆栈寻址; 8.相对寻址。2.2.2汇编指令集

1.ARM寻址方式:分类112.2.2汇编指令集

2.ARM常用指令集:分类

ARM微处理器的指令集主要有六大类:跳转指令数据处理指令程序状态寄存器(PSR)处理指令存储器访问指令协处理器指令异常产生指令122.2.2汇编指令集

3.汇编程序模板:AREAReset,CODE,READONLY;声明只读代码段ResetPRESERVE8;字节对齐关键字CODE32;ARM程序

ENTRY;程序入口START;标号顶格写

LDRR3,=0x56000010;ARM指令

LDRR4,=0xddd7fcSTRR4,[R3].......LDRR1,=0x56000014MOVR2,#0x00000STRR2,[R1]

BSTARTEND;程序结束使用“;”进行注释标号顶格写实际代码段声明文件结束132.2.3汇编与C交互编程

C程序:ARM开发中大部分程序使用C语言编写,文件类型为“*.C”。

ARM程序:

汇编程序:涉及到硬件底层操作的代码有时必须使用汇编语言编写,文件类型为“*.S”。C与汇编混合编程采用三种方式:内嵌汇编,针对汇编代码比较短的情况,可采用这种方式。汇编程序和C程序之间进行变量的互访。利用ATPCS规则,实现汇编程序与C程序相互调用。142.2.3汇编与C交互编程语法:

1.内嵌汇编:_asm{ 指令}举例:voidenable_IRQ(void){

int

tmp _asm//嵌入汇编代码

{

mrs

tmp,CPSR

bic tmp,tmp,#0x80

msr

CPSR_c,tmp }}注意:小心使用物理寄存器。不要使用寄存器代替变量。除了CPSR和SPSR,无需保存和恢复寄存器

152.2.3汇编与C交互编程使用IMPORT伪指令引入全局变量。利用LDR和STR指令根据全局变量的地址访问。

2.全局变量:举例:IMPORT globval

;IMPORT引入全局变量 ...fuc1

LDR R1,=globval

;采用LDR读取内容

LDR R0,[R1] ADD R0,R0,#1

STR R0,[R1] MOV PC,LR162.2.3汇编与C交互编程

4.C调用汇编:在汇编程序中用EXPORT伪指令声明该子程序。在C程序中使用extern关键字声明外部函数。5.汇编调用C:

3.ATPCS:规定了C程序与汇编程序间子程序间调用的基本规则。

寄存器的使用规则及其相应的名称。堆栈的使用规则。参数传递的规则。在汇编程序中使用IMPORT伪指令声明要调用的C程序函数。调用C程序中,要正确设置入口参数,然后使用BL调用。172.2.3汇编与C交互编程

6.实例:任务描述2.D.2,实现汇编和c的相互调用。

AREAReset,CODE,READONLY

PRESERVE8 ENTRY IMPORTledMain ;IMPORT声明外部函数ledMain EXPORTledInit ;EXPORT声明ledinit可被调用

bl

ledMain ;调用外部函数ledMainledInit ;子函数

ldr r3, =0x56000010

ldr r4, =0xddd7fc

str r4, [r3]

ldrr1, =0x56000014

ldrr2, =0xffff

strr2, [r1]

mov

pc,lr ;子函数返回

END182.2.3汇编与C交互编程

6.实例:任务描述2.D.2,实现汇编和c的相互调用。

#defineGPBCON(*(volatileunsigned*)0x56000010)#defineGPBDAT(*(volatileunsigned*)0x56000014)#defineGPBUP(*(volatileunsigned*)0x56000018)#defineucharunsignedchar#defineuintunsignedintexternledinit();//声明外部函数voidDelay(intx);int

ledMain(void){

ledinit();//调用外部函数

while(1) //死循环

{ GPBDAT=~(1<<5); Delay(5); GPBDAT=~(1<<6); Delay(5); GPBDAT=~(1<<8); Delay(5); GPBDAT=~(1<<10); Delay(5); }}192.2.3汇编与C交互编程

启动代码:ARM程序一般由汇编代码和c代码两部分组成。汇编代码,称为启动代码。系统上电或复位以后运行的第一段代码,它的作用是在用户程序之前对系统硬件或软件运行环境进行必要的初始化,并在最后使程序跳转至用户程序(c程序)。它直接面对ARM处理器内核以及硬件控制器进行,所执行的操作与具体的目标系统紧密相关。组成:

建立异常向量表; 初始化系统堆栈; 初始化硬件资源; 初始化软件运行; 跳转至主程序(c程序)。20

2.3.1时钟体系

2.3.2电源模式2.3时钟与电源体系21

S3C2440的时钟体系可以产生系统必须的时钟信号:FCLK、HCLK、PCLK、UCLK。其中:2.3时钟与电源体系FCLK:用于CPU内核ARM920T。HCLK:用于AHB总线上设备,如:存储器控制器,中断控制器,LCD控制器,DMA,USB主机模块等。

PCLK:用于APB总线的设备,如:WDT,IIS,I2C,PWM定时器,MMC/SD接口,ADC,UART,GPIO,RTC,SPI等。

UCLK:为USB设备的工作频率48MHz。

S3C2440的电源体系则给出了各种电源管理方案用来保证系统各任务的最佳功耗。222.3.1时钟体系

1.时钟源:晶振或外部时钟,由芯片引脚OM[3:2]组合确定。OM[3:2]主时钟源USB时钟源00晶振晶振01晶振外部时钟10外部时钟晶振11外部时钟外部时钟开发板晶振为12MHz主频HCLK达到400MHz功能:时钟变换电路,实现倍频功能锁相环PLL?达到为什么要这么做呢?因为外部时钟频率太高,容易受到干扰。232.3.1时钟体系

2.锁相环:两个锁相环UPLL和MPLLMPLL:产生FCLK,HCLK和PCLK。UPLL:产生48MHz的UCLK。Fin=12MHzMPLLCON寄存控制FCLK与Fin的关系,即设定倍频因子CLKDIVN寄存器用于设置FCLK、HCLK、PCLK之间的比例MPLL锁相环输出三种频率242.3.1时钟体系锁相环

锁相环工作原理:2.重新设置PLL时,时钟逻辑先禁止FCLK,甚至使用PLL锁定时间(LockTime)使PLL稳定输出。

1.上电时,PLL没有被启动,此时FCLK=Fin,当复位信号变为高电平后,PLL按默认MPLLCON/CLKDIVN配置运行。3.锁定时间过后,MPLL输出正常,CPU工作在新的FCLK下

252.3.1时钟体系FCLK与Fin关系:

MDIV、PDIV、SDIV由MPLLCON寄存器设定假设:

Fin=12MHz,MDIV=0x7f,PDIV=0x02,SDIV=0x01;则:FCLK=400MHzUCLK与Fin关系:262.3.1时钟体系

3.时钟控制寄存器:寄存器R/W描述初值地址LOCKTIMER/WPLL锁定时间寄存器0xFFFFFFFF0x4C000000MPLLCONR/WMPLL配置寄存器0x0005C0800x4C000004UPLLCONR/WUPLL配置寄存器0x000280800x4C000008CLKDIVNR/W时钟比控制寄存器0x000000000x4C00001427锁相环从启动到正常工作所需的时间一般保持默认,即0xFFFF即可2.3.1时钟体系

3.时钟控制寄存器:PLL锁定时间寄存器LOCKTIMELOCKTIME位描述初始值U_LTIME[31:16]UCLK的UPLL锁定时间计数值(300μs)0xFFFFM_LTIME[15:0]FCLK的MPLL锁定时间计数值(300μs)0xFFFF由LOCKTIME设定282.3.1时钟体系

3.时钟控制寄存器:PLL控制寄存器MPLLCON、UPLLCONMPLLCON/UPLLCON位描述初始值MDIV[19:12]主分频控制0x96/0x4dPDIV[9:4]预分频控制0x03/0x03SDIV[1:0]后分频控制0x0/0x0在设置完UPLLCON后,经过7个NOP后再设置MPLLCON用于设置倍频因子MDIV、PDIV、SDIV292.3.1时钟体系

3.时钟控制寄存器:时钟控制比寄存器CLKDIVNCLKDIVN位描述初始值DIVN_UPLL[3]0:UCLK=UPLL时钟,

UPLL时钟=48MHz1:UCLK=UPLL时钟/2,

UPLL时钟=96MHzUCLK=48MHz0HDIVN[2:1]00:HCLK=FCLK01:HCLK=FCLK/210:HCLK=FCLK/4当CAMDIVN[9]=0时HCLK=FCLK/8当CAMDIVN[9]=1时11:HCLK=FCLK/3当CAMDIVN[9]=0时

HCLK=FCLK/6当CAMDIVN[9]=1时00PDIVN[0]0:PCLK=HCLK1:PCLK=HCLK/20用于控制HCLK、PCLK、FCLK之间的分频比举例:

DIVN_UPLL=1,HDIVN=10,PDIVN=1时,即CLKDIVN=0X0D时,FCLK:HCLK:PCLK=8:2:1302.3.1时钟体系

4.系统频率设置方法:任务描述2.D.3,编写一段代码实现系统时钟FCLK为400MHz,HCLK为100MHz,PCLK为50MHz,UCLK为48MHz。设置锁定时间寄存器LOCKTIME,使用默认值0xffffffff。设置时钟控制比寄存器CLKDIVN,PCLK:HCLK:FCLK=1:2:8,所以值为0x0d。设置UPLLCON控制寄存器,根据倍频公式和主频要求计算或查表MDIV=0x38,PDIV=ox02,SDIV=0x01。延时等待7个NOP间隔。设置MPLLCON控制寄存器,根据倍频公式和主频要求计算或查表MDIV=0x7f,PDIV=ox02,SDIV=0x01。

ldr r0,=LOCKTIME ldr r1,=0xffffffff str r1,[r0]

ldr r0,=CLKDIVN ldr r1,=0x0000000d str r1,[r0]

ldr r0,=UPLLCON ldr r1,=0x00038021 str r1,[r0]

nop nop nop nop nop nop nop

ldr r0,=MPLLCON ldr r1,=0x0007f021

str r1,[r0]

31电源管理模块可以通过软件来控制时钟以达到减少电源功耗的功能

。2.3.2电源模式普通模式:所有外设和基本模块都可运行,此模式功耗最大。模式ARM920TAHB模块电源管理GPIORTC时钟APB模块普通OOOSELOSEL空闲×OOSELOSEL慢速OOOSELOSEL睡眠OFFOFF等待唤醒先前状态OOFF空闲模式:CPU不工作,外设工作,任何中断请求都可唤醒CPU,并退出空闲模式。

慢速模式:PLL不工作,利用外部原始时钟给CPU和外设工作。

睡眠模式:除一个电源供给唤醒电路,其他电源不工作,此模式功耗最低,可通过外部中断EINT[15:0]或RTC中断唤醒。32

2.4.1概述

2.4.2GPIO寄存器

2.4.3GPIO编程2.4GPIO33I/O口的划分:根据传输方式不同:

并行、串行

并行:数据总线、片选信号、读写信号 串行:UART、SPI、IIC、USB等根据功能不同:通用型、专用型

通用型(GPIO):基本的信息输入输出 专用型:LCD驱动电路、SD卡驱动电路等根据传送方向不同:输入型、输出型根据信号类型不同:模拟信号、数字信号

模拟信号:AD、DA、触摸屏等

数字信号:外部中断、存储器交换数据2.4GPIO34

GPIO,通用输入输出(GeneralPurposeI/O)的简称,是I/O的一种。“通用”即该I/O口可以通过引脚外接不同种类的外部设备。在嵌入式系统中,经常需要控制许多结构简单的外部设备,有时只需要CPU提供输入高低电平信号即可,例如控制LED的亮或灭。

GPIO的使用在ARM开发中是最基础的硬件操作,只有掌握了外部设备最基本的开发流程,才能以后的开发应用能够举一反三,缩短开发周期。2.4GPIO352.4GPIOCPUI/O开关量检测

组合时序,进行串并行数据I/OLED、LCD等结果显示片外数据存储控制命令驱动功能其它特殊信号输入、输出36

S3C2440共有289个引脚,其中有130个多功能I/O口,特点如下:2.4.1概述共分为九组GPIO:GPA、GPB、GPC、GPD、GPE、GPF、GPG、GPH、GPJ,每组I/O接口外接引脚数不同大部分I/O是复用的,可以单独被配置为输入模式、输出模式或者功能模式,但GPA除了用做功能模式外,只能用作输出口。每组I/O接口都有独立的数据寄存器、控制寄存器、上拉电阻寄存器来控制接口工作状态和输入输出数据。37

S3C2440每组I/O都可以通过3个寄存器来控制和访问,I/O寄存器的基地址为0x56000000。寄存器分别是:2.4.1GPIO寄存器控制寄存器GPxCON:定义每个引脚的功能是输入、输出还是第二功能。数据寄存器GPxDAT:用于读写引脚。上拉寄存器GPxUP:控制每个引脚是否使用上拉电阻。当引脚被设置为输入时,可从此寄存器相应位读取数据。当引脚被设置为输出时,写此寄存器可以写到端口的相应位中。以GPB口为例,寄存器为:38寄存器GPBCON:2.4.1GPIO寄存器GPBCON位描述初始值GPB10[21:20]00=输入

01=输出

10=nXDREQ011=保留0GPB9[19:18]00=输入

01=输出

10=nXDACK011=保留0GPB8[17:16]00=输入

01=输出

10=nXDREQ111=保留0GPB7[15:14]00=输入

01=输出

10=nXDREQ111=保留0GPB6[13:12]00=输入

01=输出

10=nXBREQ11=保留0GPB5[11:10]00=输入

01=输出

10=nXBACK11=保留0GPB4[9:8]00=输入

01=输出

10=TCLK[0]11=保留0GPB3[7:6]00=输入

01=输出

10=TOUT311=保留0GPB2[5:4]00=输入

01=输出

10=TOUT211=保留0GPB1[3:2]00=输入

01=输出

10=TOUT111=保留0GPB0[1:0]00=输入

01=输出

10=TOUT011=保留0PA口功能设置不同:GPACON的每一位对应一个引脚:0-输出;1-地址线或地址控制每个I/O口功能由两位组合定义:00-输入;01-输出;10-功能;11-保留。应用举例:设置GPB5为输出 LDR R0,=0x56000010;GPBCON寄存器地址0x56000010 MOV R1,#0x00000400;[11:10]为0b01,输出 STR R1,[R0];配置GPBCON,GPB5为输出

39寄存器GPBDAT:2.4.1GPIO寄存器GPBDAT位描述初始值GPB[10:0][10:0]配置为输入时,相应位为引脚状态配置为输出时0:低电平1:高电平0应用举例:GPB5输出高低电平LDR R0,=0x56000014;GPBDAT寄存器地址0x56000014MOV R1,#0x0020STR R1,[R0];GPB5输出高电平MOV R1,#0x00000000STR R1,[R0];GPB5输出低电平

40寄存器GPBUP:2.4.1GPIO寄存器GPBUP位描述初始值GPB[10:0][10:0]0:使能上拉1:禁止上拉0应用举例:GPB上拉电阻禁止LDR R0,=0x56000018;GPBUP寄存器地址0x56000018MOV R1,#0xff;每位为1STR R1,[R0];上拉电阻禁止

412.4.3GPIO编程1.根据需求分析端口功能

GPIO编程步骤:GPB5、6、8、10功能为为输出。输出为低电平时,LED被点亮,输出为高电平时,LED被熄灭

。任务描述2.D.4:利用GPIO的编程实现跑马灯程序

422.4.3GPIO编程2.配置GPxCON和GPxUP寄存器

GPIO编程步骤:任务描述2.D.4:利用GPIO的编程实现跑马灯程序

#defineGPBCON(*(volatileunsigned*)0x56000010)#defineGPBDAT(*(volatileunsigned*)0x56000014)#defineGPBUP(*(volatileunsigned*)0x56000018)int

ledMain(void){ //配置寄存器

GPBCON=0x1dd7fc;// GPB5、6、8、10功能为为输出。

GPBDAT=((1<<5)|(1<<6)|(1<<8)|(1<<10));

GPBUP=0x00;//上拉电阻使能

...}432.4.3GPIO编程3.对端口进行操作GPxDAT,读或写GPIO编程步骤:任务描述2.D.4:利用GPIO的编程实现跑马灯程序

int

ledMain(void){

...

while(1) //死循环

{

GPBDAT=~(1<<5); //GPB5输出低电平,LED1亮

Delay(5); GPBDAT=~(1<<6); //GPB6输出低电平,LED2亮

Delay(5); GPBDAT=~(1<<8); //LED3亮

Delay(5); GPBDAT=~(1<<10); //LED4亮

Delay(5); }}44

2.5.1概述

2.5.2存储器控制器寄存器

2.5.3存储器控制器编程2.5存储器控制器45存储器控制器特性:2.5.1概述S3C2440的存储器管理器提供访问外部存储器的所有控制信号,27位地址信号、32位数据信号、8个片选信号、以及读/写控制信号等。总共有8个存储器bank(bank0—bank7),容量可达1GB。

bank0~bank6都有固定的起始地址,bank7的起始地址可变,但必须与bank6衔接。bank0数据线宽只能是16/32位,其它bank可编程访问线宽(8/16/32位)。所有存储器bank的访问周期都是可编程的。支持SDRAM的自刷新和掉电模式。支持大小端(软件选择)。46存储器映射图:2.5.1概述4748

S3C2440提供了13个寄存器用于存储器控制:2.5.2存储器控制器寄存器寄存器地址功能操作复位值BWSCON0x48000000总线宽度和等待控制读/写0x0BANKCON00x48000004BANK0控制读/写0x0700BANKCON10x48000008BANK1控制读/写0x0700BANKCON20x4800000CBANK2控制读/写0x0700BANKCON30x48000010BANK3控制读/写0x0700BANKCON40x48000014BANK4控制读/写0x0700BANKCON50x48000018BANK5控制读/写0x0700BANKCON60x4800001CBANK6控制读/写0x18008BANKCON70x48000020BANK7控制读/写0x18008REFRESH0x48000024SDRAM刷新控制读/写0xAC0000BANKSIZE0x48000028可变的组大小设置读/写0x0MRSRB60x4800002CBANK6模式设置读/写xxxMRSRB70x48000030BANK7模式设置读/写xxx控制设备的访问时序,使用默认值即可

定义SDRAM的工作模式49寄存器BWSCON:总线宽度和等待寄存器BWSCON位描述初始值STn1位控制Bank的UB/LB引脚输出信号。1:使UB/LB与nBE[3:0]相连;0:使UB/LB与nWBE[3:0]相连0WSn1位Bank的WAIT状态,通常为00=WAIT禁止

1=WAIT使能0DWn2位Bank的数据总线宽度(位宽)00=8位

01=16位

10=32位

11=保留0DW0[2:1]Bank0的数据总线宽度(只读),由引脚OM[1:0]决定01=16位

10=32位-每四位对应一个bank,bank1同bank7Bank0由硬件决定2.5.2存储器控制器寄存器50寄存器REFRESH:刷新控制寄存器决定了SDRAM的刷新使能,刷新模式和刷新时间

REFRESH位描述初始值REFEN[23]SDRAM刷新使能0=禁止

1=使能0TREFMD[22]SDRAM自刷新模式0=CBR/自动刷新

1=自刷新0Trp[21:20]SDRAMRAS预充电时间00=2个时钟

01=3个时钟10=4个时钟

11=不支持10Tsrc[7:6]SDRAM半行周期时间00=4个时钟

01=5个时钟10=6个时钟

11=7个时钟11刷新计数器[10:0]SDRAM刷新计数值02.5.2存储器控制器寄存器51寄存器BANKSIZE:bank大小寄存器主要定义了SDRAM的大小

2.5.2存储器控制器寄存器BANKSIZE位描述初始值BURST_EN[7]ARM核突发操作使能0=禁止

1=使能0SCKE_EN[5]SDRAM掉电模式使能SCKE控制0=禁止掉电模式

1=使能掉电模式0SCLK_EN[4]只在SDRAM访问周期时间SCLK使能,未访问SDRAM时,SCLK变为低电平0=SCLK一直有效

1=SCLK只在访问时有效(推荐)0BK76MAP[2:0]Bank6/7存储器映射000=32M001=64M010=128M100=2M101=4M110=8M111=16M01052SDRAM概述:SDRAM(SynchronousDynamicRandomAccessMemory)即同步动态随机存储器,也就是通常所说的内存。2.5.3存储器控制器编程同步指存储器工作需要同步时钟,命令的发送和数据的传输都以同步时钟为基准。动态是指存储阵列需要不断地刷新来保证数据不丢失。

随机是指数据不是线性依次存储,而是自由按指定地址进行数据读写。SDRAM存储原理存储阵列组合,每个单元格是一个存储单元寻址方式是先选中L-Bank块地址,再指定行地址,最后指定列地址

53SDRAM连接:开发板选用SDRAM为16位,4Banks,32MB的SDRAM,行地址线13根,列地址线为9根。2.5.3存储器控制器编程SCKE:SDRAM时钟有效信号。SCLK0/SCLK1:SDRAM时钟信号。DQM0-/DQM3:数据掩码信号。nSCSn:SDRAM片选信号,A25/A24:Bank地址信号nSRAS:SDRAM行地址选中信号。nSCAS:SDRAM列地址选中信号。nWE:SDRAM写允许信号。54SDRAM访问:SDRAM初始化,即根据SDRAM硬件配置存储器控制器寄存器。CPU发片选信号nSCSn,选中SDRAM。具体地址寻址,CPU可从32位地址中自动分离L-Bank,行地址信号,列地址信号。具体实现步骤如下:数据传输,存储地址选中以后,就可以对此区域进行数据读写。2.5.3存储器控制器编程发送L-Bank信号和行信号nSRAS,L-Bank信号为ADDR25/ADDR24,对应32位地址中[25:24],行地址ADDR14-ADDR2,对应32位地址中[23:11]。发送列信号nSCAS,列地址ADDR10-ADDR2,对应32位地址中[10:2]。根据寄存器配置,S3C2440的Bank6位宽为32位,ADDR1,ADDR0为0,即对应32位地址中[1:0]为0。55SDRAM初始化:2.5.3存储器控制器编程BWSCON=0x22011110;//Bank6/7线宽为32位;Bank5为8位;其余16位BANKCON0=0x0700;//Bank0-5使用默认值0x0700BANKCON1=0x0700;BANKCON2=0x0700;BANKCON3=0x0700;BANKCON4=0x0700;BANKCON5=0x0700;BANKCON6=0x018005;//存储器类型MT[16:15]=0b11BANKCON7=0x018005;//外接SDRAM且列地址线为9位,同Bank6REFRESH=0x08C07A3;//SDRAM自动刷新使能BANKSIZE=0x0B1;//SDRAM为64MMRSRB6=0x030;//注意:代码在SDRAM运行中时,一定不能刷新此寄存器MRSRB7=0x030;56任务描述2.D.5,实现程序到SDRAM的复制,并最终在SDRAM中执行。2.5.3存储器控制器编程SDRAM初始化,本例使用查表方式。将代码从0地址复制到SDRAM中,程序代码为任务描述2.D.4代码。程序跳到SDRAM(地址为0x30000000)中执行。copy_steppingstone_to_sdram

movr1,#0ldrr2,=SDRAM_BASEmovr3,#4*1024loop1ldrr4,[r1],#4;从Steppingstone读取4字节的数据,并让源地址加4strr4,[r2],#4;将此4字节的数据复制到SDRAM中,并让目地地址加4cmpr1,r3;判断是否完成:源地址等于Steppingstone的未地址?

bneloop1;若没有复制完,继续

movpc,lr;返回

bl

disable_watch_dog;关闭WATCHDOG

bl

memsetup;SDRAM初始化

bl

copy_steppingstone_to_sdram;复制代码到SDRAM中

ldrpc,=nosdram;跳到SDRAMnosdram

ldrsp,=0x34000000;设置堆栈

blmain将Steppingstone(地址0)中的代码(4K)拷贝到SDRAM(地址:0x30000000)中。跳入SDRAM中;SDRAM初始化memsetupmov r1,#MEM_CTL_BASE;存储控制器的13个寄存器的开始地址

adrl r2,mem_cfg_val;这13个值的起始存储地址

add r3,r1,#52;13*4=52loop2ldrr4,[r2],#4;读取设置值,并让r2加4strr4,[r1],#4;将此值写入寄存器,并让r1加4cmpr1,r3;判断是否设置完所有13个寄存器

bneloop2;若没有写成,继续

movpc,lr;返回align4mem_cfg_valdcd0x22011110,0x00000700,0x00000700,0x00000700,0x00000700,0x00000700,0x00000700,0x00018005,0x00018005,0x008C07A3,0x000000B1,0x00000030,0x00000030;57

2.6.1异常

2.6.2中断机制

2.6.3中断控制器寄存器2.6异常系统

2.6.4中断编程582.6异常系统

异常与中断:只要正常的程序流被暂时中止,处理器就进入异常模式异常与中断:异常是CPU在执行过程中出现的错误,即不正常的情况。例如CPU在执行过程中突然掉电产生复位,称为复位异常。中断是CPU在执行程序时,系统发生了一件急需CPU处理的事件,事件处理完成后,CPU再返回指向原来正在执行的程序。592.6.1异常

异常种类:S3C2440支持7种异常异常向量表异常具体含义进入模式0x00000000复位异常当CPU刚上电或按下复位键时产生管理模式0x00000004未定义指令异常在流水线译码阶段,当处理器遇到不能处理的指令时产生,可用于软件仿真未定义模式0x00000008软件中断异常执行SWI指令时产生,可在用户模式下调用特权操作指令,用于实现操作系统调用管理模式0x0000000C预取中止异常在流水线取指阶段,处理器预取指令的地址不存在或该地址不允许此指令访问时,存储器回向处理器发中止信号,但当预取指令时才会产生该异常中止模式0x00000010数据中止异常执行存储器访问指令Load/Store时,目标地址不存在或该地址不允许当前指令访问时产生中止模式0x00000014保留异常——保留0x00000018中断IRQ异常当处理器的外部中断请求引脚有效,且CPSR中I位为0时产生,系统外设可通过该异常请求中断服务中断模式0x0000001C快中断FIQ异常当处理器的外部中断请求引脚有效,且CPSR中F位为0时产生,常用于数据传输和通道处理快中断模式602.6.1异常

异常优先级:当多个异常同时发生时,一个固定的优先级决定系统处理它们的顺序。优先级异常1复位2数据中止3FIQ4IRQ5预取指中止6未定义指令中止6软件中断异常优先级由高到低61

异常处理过程:只要正常的程序流被暂时中止,处理器就进入异常模式异常与中断:异常是CPU在执行过程中出现的错误,即不正常的情况。例如CPU在执行过程中突然掉电产生复位,称为复位异常。中断是CPU在执行程序时,系统发生了一件急需CPU处理的事件,事件处理完成后,CPU再返回指向原来正在执行的程序。2.6.1异常62①将异常处理程序的返回地址(加固定的偏移量)保存到相应异常模式下的LR;②将CPSR的当前值保存到相应异常模式下的SPSR;③设置CPSR为相应的异常模式;④设置PC为相应异常处理程序的中断入口向量地址,跳转到相应的异常中断处理程序执行;SPSR异常模式CPSRR15(PC)R14(LR)R0~R13-返回地址入口地址用户模式异常模式2.6.1异常程序代码正常运行在用户模式下。当一个异常导致模式切换时,内核自动的做如下处理:

异常处理过程—进入:63①返回到发生异常中断的指令的下一条指令处执行,即就是说将LR中的值减去偏移量后移入PC,各模式偏移量汇总如下表。②复制SPSR_mode的内容到CPSR中。2.6.1异常

当异常处理程序结束时,异常处理程序必须:③如果在异常进入时置位了中断禁止标志位,清除中断禁止标志位。异常入口返回指令返回地址复位无无数据中止SUBSPC,R14_abt,#8R14-8中断IRQSUBSPC,R14_irq,#4R14-4快中断FIQSUBSPC,R14_fiq,#4R14-4预取中止SUBSPC,R14_abt,#4R14-4未定义指令MOVSPC,R14_undR14软件中断MOVSPC,R14_svcR14

异常处理过程—退出:642.6.1异常

复位异常的进入:保存R14和SPSR:复位异常,忽略。修改CPSR值:设置PC值,PC=0x00000000。CPSR[4:0]=0b10011,进入特权模式。CPSR[5]=0,进入ARM状态。CPSR[6]=1,禁止快速中断。CPSR[7]=1,禁止外部中断。设置异常向量表。栈初始化,为各模式分配栈空间。初始化存储系统,关键I/O口等。开中断。切换处理器模式。跳转到应用程序执行(c程序)。652.6.1异常

异常向量表:修改CPSR值:ResetEntrybReset_Handler;0x00跳入reset处理程序

bUndef_Handler;0x04跳入未定义异常处理程序

bSWI_Handler;0x08跳入软中断异常处理程序

bPAbt_Handler;0x0c跳入指令预取异常处理程序

bDAbt_Handler;0x10跳入数据中止异常处理程序

nop;0x14保留

bIRQ_Entry;0x18跳入中断处理程序

bFIQ_Handler;0x1c跳入快中断异常程序FIQ_Handler

...节省时间,快中断直接处理662.6.2中断机制

中断源:S3C2440有60个中断源。分为内部中断源和外部中断源。内部中断源:嵌入式系统常见硬件产生的中断信号。外部中断源:外部接口挂载设备产生的中断信号。

对内核来说,只有FIQ和IRQ两种中断模式。672.6.2中断机制中断源描述中断源描述INT_ADCADC/触屏中断INT_DMA0DMA通道0中断INT_RTCRTC闹钟中断INT_LCDLCD中断INT_SPI1SPI1中断INT_UART2UART2中断(Rxd\Txd\Err)INT_UART0UART0中断(Rxd\Txd\Err)INT_TIMER4定时器4中断INT_IICIIC中断INT_TIMER3定时器3中断INT_USBHUSB主机中断INT_TIMER2定时器2中断INT_USBDUSB设备中断INT_TIMER1定时器1中断INT_NFCONNandFlash控制中断INT_TIMER0定时器0中断INT_UART1UART1中断(Rxd\Txd\Err)INT_WDT_AC97看门狗/AC97中断INT_SPI0SPI0中断INT_TICKRTC时钟滴答中断INT_SDISDI中断nBATT_FLT电池故障中断INT_DMA3DMA通道3中断INT_CAM摄像头P/C接口INT_DMA2DMA通道2中断EINT1_23外部中断1至23INT_DMA1DMA通道1中断EINT0外部中断0682.6.2中断机制

中断控制器:在当CPU收到多个中断请求时,由中断控制器进行仲裁以后再请求ARM920T内核是FIQ中断还是IRQ中断。

由硬件产生的中断请求根据中断源类型分别将信号送到SUBSRCPND(子中断源暂存寄存器)和SRCPND(中断源寄存器)。对不带有子中断源寄存器的中断源被触发后,SRCPND寄存器中相应位被置1。对带有sub寄存器的中断源被触发后,SUBSRCPEND寄存器中的相应位被置1,如果此中断没有被INTSUBMSK寄存器屏蔽的话,它在SRCPND寄存器中的相应位也被置1。MODE是中断模式判断寄存器,用来判断当前中断是否为快速中断,如果被触发的中断中有快速中断,INTMOD寄存器中为1的位对应的中断是FIQ。对于一般的中断IRQ,可能同时有几个中断被触发,未被MASK寄存器屏蔽的中断经过比较后,经过Priority中断源优先级仲裁选择器选择出优先级最高的中断,此中断在INTPND寄存器中的相应位被置1,INTPND是中断源结果寄存器,里面存放优先级仲裁出的唯一中断源。确定是FIQ还是IRQ模式后,中断控制器向CPU向内核发出FIQ请求或IRQ请求。如果程序状态寄存器PSR的F位或I位被置1,CPU则不会接受来自中断控制器的中断请求。若要接受CPU的中断请求,必须清除PSR的F位和I位并设置INTMSK的相应位为0。69

中断处理:2.6.2中断机制ResetEntry

;复位入口

...bIRQ_Entry;中断异常0x18bFIQ_Handler;快中断异常0x1cFIQ_Handler ……

IRQ_Entry sub sp,sp,#4

stmfd sp!,{r8-r9};根据INTOFFSET内容判断进入哪个中断服务子程序

ldr r9,=INTOFFSET

ldr r9,[r9]

ldr r8,=HandleEINT0;中断向量表首地址 add r8,r8,r9,lsl#2 ldr r8,[r8] str r8,[sp,#8] ldmfd sp!,{r8-r9,pc}

...若是IRQ中断,程序指针0x18;若是FIQ中断,程序指针0x1C。读取INTPND寄存器或INTOFFSET寄存器的值来确定中断源,根据中断服务号,转去执行相应的中断处理程序。70

中断处理:2.6.2中断机制;中断向量表HandleEINT0 EQUIntVTAddress

HandleEINT1 EQUIntVTAddress+4HandleEINT2 EQUIntVTAddress+4*2HandleEINT3 EQUIntVTAddress+4*3HandleEINT4_7 EQUIntVTAddress+4*4HandleEINT8_23EQUIntVTAddress+4*5HandleCAM EQUIntVTAddress+4*6HandleBATFLT EQUIntVTAddress+4*7HandleTICK EQUIntVTAddress+4*8HandleWDT EQUIntVTAddress+4*9HandleTIMER0 EQUIntVTAddress+4*10…HandleUART1 EQUIntVTAddress+4*23HandleNFCON EQUIntVTAddress+4*24HandleUSBD EQUIntVTAddress+4*25HandleUSBH EQUIntVTAddress+4*26HandleIIC EQUIntVTAddress+4*27HandleUART0 EQUIntVTAddress+4*28HandleSPI1 EQUIntVTAddress+4*39HandleRTC EQUIntVTAddress+4*30HandleADC EQUIntVTAddress+4*3171

S3C2440提供了8个寄存器用于中断控制:2.6.3中断控制器寄存器RegisterAddressR/WDescriptionResetValueSRCPND0x4A000000R/W中断标志寄存器0x00000000INTMOD0x4A000004R/W中断模式寄存器0x00000000INTMSK0x4A000008R/W中断屏蔽寄存器0xFFFFFFFFPRIORITY0x4A00000CR/W中断优先级寄存器0x7FINTPND0x4A000010R/W中断服务寄存器0x00000000INTOFFSET0x4A000014R中断偏移寄存器0x00000000SUBSRCPND0x4A000018R/W子中断源挂起寄存器0x00000000INTSUBMSK0x4A00001CR/W子中端源屏蔽寄存器0x7FF72子中断屏蔽寄存器(SUBSRCPND/

INTSUBMSK):2.6.3中断控制器寄存器位中断源位中断源位中断源11保留5INT_ERR110INT_ADC4INT_TXD131:15………9INT_TC3INT_RXD114INT_AC978INT_ERR22INT_ERR013INT_WDT7INT_TXD21INT_TXD012INT_CAM_P6INT_RXD20INT_RXD0寄存器R/W描述初始值地址SUBSRCPNDR/W子中断源挂起寄存器0=未请求中断

1=已中断请求0x00x4A000018INTSUBMSKR/W子中断屏蔽寄存器0=中断服务可用

1=屏蔽中断请求0xFFFF0x4A00001C注意:在中断服务程序中,需要对其置1的标志位清0。73源挂起寄存器(SRCPND)

:2.6.3中断控制器寄存器寄存器R/W描述初始值地址SRCPNDR/W源挂起寄存器0=未请求中断

1=已中断请求0x00x4A000000位中断源位中断源位中断源位中断源31INT_ADC23INT_UART115INT_UART27nBATT_FLT30INT_RTC22INT_SPI014INT_TIM46INT_CAM29INT_SPI121INT_SDI13INT_TIM35EINT8_2328INT_UART020INT_DMA312INT_TIM24EINT4_727INT_IIC19INT_DMA211INT_TIM13EINT326INT_USBH18INT_DMA110INT_TIM02EINT225INT_USBD17INT_DMA09INT_WDT_AC97

1EINT124NT_NFCON16INT_LCD8INT_TICK0EINT074中断屏蔽寄存器(INTMSK)

:2.6.3中断控制器寄存器寄存器R/W描述初始值地址INTMSKR/W中断屏蔽寄存器0=中断服务可用

1=屏蔽中断请求0xFFFFFFFF0x4A000008寄存器R/W描述初始值地址INTMODR/W中断寄存器0=IRQ模式

1=FIQ模式0x00x4A000004中断模式寄存器(INTMOD)

:注意:同一时间,只能有一个中断被设置为FIQ中断。75中断优先级寄存器(PRIORITY):2.6.3中断控制器寄存器76中断优先级寄存器(PRIORITY):2.6.3中断控制器寄存器PRIORITY位描述初始值ARB_SELn(n=0,5)2位仲裁器组n优先顺序集00=REQ0-1-2-3-4-501=REQ0-2-3-4-1-510=REQ0-3-4-1-2-511=REQ0-4-1-2-3-500ARB_SELn(n=1,2,3,4)2位仲裁器组n优先顺序集00=REQ0-1-2-3-401=REQ0-2-3-4-110=REQ0-3-4-1-211=REQ0-4-1-2-300ARB_MODE(n=0-5)1位仲裁器组n优先级翻转使能0=优先级不翻转

1=优先级翻转1位含义位含义位含义31:21保留12:11ARB_SEL24ARB_MODE420:19ARB_SEL610:9ARB_SEL13ARB_MODE318:17ARB_SEL58:7ARB_SEL02ARB_MODE216:15ARB_SEL46ARB_MODE61ARB_MODE114:13ARB_SEL35ARB_MODE50ARB_MODE077中断挂起寄存器(INTPND)

:2.6.3中断控制器寄存器寄存器R/W描述初始值地址INTPNDR/W中断挂起寄存器0=未发生中断请求

1=发出中断请求0x7F0x4A0000010寄存器内容同SRCPND必须在中断处理程序中对其服务标志位清0。方法为对某位写1便清除为0,即在清除SRCPND中相应位后,要清除该寄存器相应位782.6.3中断控制器寄存器中断偏移寄存器(INTOFFSET)

:寄存器R/W描述初始值地址INTOFFSETR中断偏移寄存器指示IRQ中断请求源0x7F0x4A0000014该寄存器的偏移值指示在INTPND中显示的中断源,该值与INTPND寄存器的值完全相同。根据此值进入相应服务子程序。用于二级中断向量表中区分各中断源。792.6.4中断编程

中断编程:对于中断的使用,可以通过以下步骤来实现:中断控制器寄存器的配置。中断设备初始化。编写中断向量表。编写中断服务程序。802.6.4中断编程

中断编程:任务描述2.D.6,利用外部中断实现按键控制灯亮。1.原理分析按键K1~K2所接的CPU引脚为EINT0和EINT2,为一级中断源,当按下按键时,CPU调用其中的中断服务程序来点亮或熄灭对应的LED。

812.6.4中断编程

中断编程:2.代码分析#defineGPB5_out(1<<(5*2))//LED1#defineGPB6_out(1<<(6*2))//LED2#defineGPF2_eint(2<<(2*2))//K2,EINT2#defineGPF0_eint(2<<(0*2))//K1,EINT0voidinit_led(void){ GPBCON=GPB5_out|GPB6_out; GPBDAT=0xff;}voidinit_irq(){

GPFCON=GPF0_eint|GPF2_eint;PRIORITY=(PRIORITY&((~0x01)|(0x3<<7)))|(0x0<<7);//EINT0、EINT2使能

INTMSK&=(~(1<<0))&(~(1<<2));}822.6.4中断编程

中断编程:HandleIRQsublr,lr,#4;计算返回地址

stmdbsp!,{r0-r12,lr};保存现场

ldr

lr,=int_return;设置调用ISR即EINT_Handle函

;数后的返回地址

ldrpc,=EINT_Handle;调用中断服务函数int_return

ldmiasp!,{r0-r12,pc}^;中断返回,^表示将;spsr的值复制到cpsr2.代码分析832.6.4中断编程任务描述2.D.6,利用外部中断实现按键控制灯亮。voidEINT_Handle(){unsignedlongoft=INTOFFSET;//中断偏移寄存器

switch(oft){//K1被按下

case0:{GPBDAT|=(0xf<<5);//所有LED熄灭

GPBDAT&=~(1<<5);//LED1点亮

break;}

//K2被按下

case2:{GPBDAT|=(0x0f<<5);//所有LED熄灭

GPBDAT&=~(1<<6);//LED2点亮

break;}default:break;}//清中断

SRCPND=1<<oft;INTPND=1<<oft;}84

2.7.1概述

2.7.2定时器寄存器

2.7.3定时器编程2.7定时器85定时器特性:5个16位定时器,4个具有PWM功能。两个8位预分频器和两个4位分频器:2.7定时器自动重载

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论