arm原理与c程序设计-第五章课件

PPT
  • 阅读 126 次
  • 下载 0 次
  • 页数 209 页
  • 大小 2.432 MB
  • 2022-11-12 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档40.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
arm原理与c程序设计-第五章课件
可在后台配置第一页与第二页中间广告代码
arm原理与c程序设计-第五章课件
可在后台配置第二页与第三页中间广告代码
arm原理与c程序设计-第五章课件
可在后台配置第三页与第四页中间广告代码
arm原理与c程序设计-第五章课件
arm原理与c程序设计-第五章课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 209
  • 收藏
  • 违规举报
  • © 版权认领
下载文档40.00 元 加入VIP免费下载
文本内容

【文档说明】arm原理与c程序设计-第五章课件.ppt,共(209)页,2.432 MB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-2165.html

以下为本文档部分文字说明:

第五章汇编语言程序设计及系统初始化第五章汇编语言程序设计及系统初分别化5.1ARM汇编语言程序框架5.2浮点数据处理5.3系统初始化5.4中断服务程序本章小结第五章汇编语言程序设计及系统初始化5.1ARM汇编语言程序框架在MDK环境下,新建一个工程ex5_1,拷贝工程ex4_3中的文件S3C2

410A.s和initmemcon.s,然后,编写一个新的汇编语言程序ledflash.s,其代码如下:1AREALEDLIGHT,CODE,READONLY2EXPORT__main;LedFlash3EXPORT__use_two_re

gion_memory4GPCDAT_ADDREQU0x560000245LED_ONEQU0x00006LED_OFFEQU0x00E0第五章汇编语言程序设计及系统初始化7ENTRY8;LedFlash9__main10LDRR0,=GPCDAT_ADDR11MOVR1,#LED_O

N12STRR1,[R0];LEDON1314BLDelay1516MOVR1,#LED_OFF17STRR1,[R0];LEDOFF第五章汇编语言程序设计及系统初始化1819BLDelay2021B__main2

2Delay23MOVR3,#0x0F000024MOVR4,#0x0F000025subcycle126SUBR3,R3,#127subcycle228SUBR4,R4,#1第五章汇编语言程序设计及系统初始化29CMPR4,#030BGEsubcycle23

132CMPR3,#033BGEsubcycle134BXLR3536__use_two_region_memory;nowarning37END将ledflash.s添加到工程ex5_1中,当前工作主窗口如图5-1所示。先不要编译连接这个工程文件,在5.1.2小节时

才能正确地编译连接并执行该工程。第五章汇编语言程序设计及系统初始化图5-1工程ex5_1工作界面第五章汇编语言程序设计及系统初始化5.1.1通用输入输出C口配置在图5-1中,双击S3C2410A.s打开它,保持其他设置不变(相对于工程ex4_3

)的情况下,对I/OConfiguration进行配置,如图5-2所示。图5-2中将PC5、PC6和PC7配置为输出特性(Output),对应于S3C2410A.s的第0606~0608行代码如下:P

IOC_SETUPEQU1PCONC_ValEQU0xAAAA56AAPUPC_ValEQU0x00000000第五章汇编语言程序设计及系统初始化图5-2通用I/O口配置第五章汇编语言程序设计及系统初始化PIOC_SETUP为1表示图5-2中的PortC被勾选;当设置PC0~PC15如图5-2

时,端口C的控制寄存器的值为0xAAAA56AA;端口C所有上拉电阻都是使能的,端口C上拉控制寄存器的值为0x00000000。图5-2中的I/OConfiguration勾选,对应于S3C2410A.s中的第0510行代码如下:PIO_SETUPEQU1如图5-2设置好之后,下面罗列

出启动代码文件S3C2410A.s中与通用I/O口配置相关的代码,如表5-1所示。第五章汇编语言程序设计及系统初始化表5-1S3C2410A.s中与I/O口配置相关的代码序号行号注释或语句10488;I/OPor

tsdefinitions20489PIO_BASEEQU0x56000000;PIOBaseAddress30490PCONA_OFSEQU0x00;PCONAOffset40491PCONB_OFSEQU0x10;PCONBOffset5049

2PCONC_OFSEQU0x20;PCONCOffset60493PCOND_OFSEQU0x30;PCONDOffset70494PCONE_OFSEQU0x40;PCONEOffset80495PCONF_OFSEQU0x50;PCONFOffset90496PCON

G_OFSEQU0x60;PCONGOffset100497PCONH_OFSEQU0x70;PCONHOffset110498PCONJ_OFSEQU0xD0;PCONJOffset120499PUPB_OFSEQU0x18;PUPBOffset第五章汇编语言程序设计及系统初始化130500PU

PC_OFSEQU0x28;PUPCOffset140501PUPD_OFSEQU0x38;PUPDOffset150502PUPE_OFSEQU0x48;PUPEOffset160503PUPF_OFSEQU0x58;PUPFOffset170504PUPG_OFSEQU0x

68;PUPGOffset180505PUPH_OFSEQU0x78;PUPHOffset190506PUPJ_OFSEQU0xD8;PUPJOffset200509;//<e>I/OConfiguration210510PIO_SETUPEQU122051

2~0536A口注释230537PIOA_SETUPEQU0240538PCONA_ValEQU0x000003FF250540~0565B口注释第五章汇编语言程序设计及系统初始化260566PIOB_SETUPEQU0270567PCONB_ValEQU0x

000007FF280568PUPB_ValEQU0x00000000290570~0605C口注释300606PIOC_SETUPEQU1310607PCONC_ValEQU0xAAAA56AA320608PUPC_ValEQU

0x00000000330610~0645D口注释340646PIOD_SETUPEQU0350647PCOND_ValEQU0x00000000360648PUPD_ValEQU0x00000000370650~0685E口注释380686PIOE_SETUPEQU039

0687PCONE_ValEQU0x00000000第五章汇编语言程序设计及系统初始化序号行号注释或语句400688PUPE_ValEQU0x00000000410690~0709F口注释420710PIOF_SETUPEQU0430711PCONF_ValEQU0x0000511A4407

12PUPF_ValEQU0x00000000450714~0749G口注释460750PIOG_SETUPEQU0470751PCONG_ValEQU0x00000000480752PUPG_ValEQU0x00000000490754~0

779H口注释500780PIOH_SETUPEQU0510781PCONH_ValEQU0x000007FF520782PUPH_ValEQU0x00000000第五章汇编语言程序设计及系统初始化530922;I/OConfiguration540923I

FPIO_SETUP<>0550924PIOA_CFG560925DCDPCONA_Val570926PIOB_CFGDCDPCONB_Val580927DCDPUPB_Val590928PIOC_CFGDCDPCON

C_Val600929DCDPUPC_Val610930PIOD_CFGDCDPCOND_Val620931DCDPUPD_Val630932PIOE_CFGDCDPCONE_Val第五章汇编语言程序设计及系统初始化640933DCDPUPE_Val650934

PIOF_CFGDCDPCONF_Val660935DCDPUPF_Val670936PIOG_CFGDCDPCONG_Val680937DCDPUPG_Val690938PIOH_CFGDCDPCONH_Val700939DCDPUPH_Val710940E

NDIF720981~1038S3C2410A.s有误,将在下面说明。第五章汇编语言程序设计及系统初始化S3C2410A.s中的第0981~1038行原始代码如下:IFPIO_SETUP<>0LDRR14,=P

IO_BASEIFPIOA_SETUP<>0ADRR0,PIOA_CFGSTRR0,[R14,#PCONA_OFS]ENDIFIFPIOB_SETUP<>0ADRR0,PIOB_CFG第五章汇编语言程序设计及系统初始化LDRR1,[R0,#4

]STRR0,[R14,#PCONB_OFS]STRR1,[R14,#PUPB_OFS]ENDIFIFPIOC_SETUP<>0ADRR0,PIOC_CFGLDRR1,[R0,#4]STRR0,[R14,#PCONC_OFS]STR

R1,[R14,#PUPC_OFS]ENDIF第五章汇编语言程序设计及系统初始化IFPIOD_SETUP<>0ADRR0,PIOD_CFGLDRR1,[R0,#4]STRR0,[R14,#PCOND_OFS]STRR1

,[R14,#PUPD_OFS]ENDIFIFPIOE_SETUP<>0ADRR0,PIOE_CFGLDRR1,[R0,#4]STRR0,[R14,#PCONE_OFS]STRR1,[R14,#PUPE_OFS]ENDIF第五章汇编语言程序设计及系统初始化IFPI

OF_SETUP<>0ADRR0,PIOF_CFGLDRR1,[R0,#4]STRR0,[R14,#PCONF_OFS]STRR1,[R14,#PUPF_OFS]ENDIFIFPIOG_SETUP<>0ADRR0,PIOG_CFGLDRR1,[R0,#4]STRR0,[R14,#PC

ONG_OFS]STRR1,[R14,#PUPG_OFS]ENDIF第五章汇编语言程序设计及系统初始化IFPIOH_SETUP<>0ADRR0,PIOH_CFGLDRR1,[R0,#4]STRR0,[R14,#PCONH_OFS

]STRR1,[R14,#PUPH_OFS]ENDIFENDIF修正后的代码如下,其中,添加了注释的为补充和修正的代码行:IFPIO_SETUP<>0LDRR14,=PIO_BASE第五章汇编语言程序设计及系统初始化IFPIOA_SETUP<>0ADRR0,PIOA_CFGL

DRR2,[R0];AddedbyZYSTRR2,[R14,#PCONA_OFS];ChangedbyZYENDIFIFPIOB_SETUP<>0ADRR0,PIOB_CFGLDRR2,[R0];AddedbyZYLDRR1

,[R0,#4]STRR2,[R14,#PCONB_OFS];ChangedbyZYSTRR1,[R14,#PUPB_OFS]ENDIF第五章汇编语言程序设计及系统初始化IFPIOC_SETUP<>0ADRR0,PIOC_CFGLDRR2,[R0];AddedbyZYLDRR1,[R0,#4]S

TRR2,[R14,#PCONC_OFS];R0,[R14,#PCONC_OFS]ChangedbyZYSTRR1,[R14,#PUPC_OFS]ENDIF第五章汇编语言程序设计及系统初始化IFPIOD_SETUP<>0

ADRR0,PIOD_CFGLDRR2,[R0];AddedbyZYLDRR1,[R0,#4]STRR2,[R14,#PCOND_OFS];ChangedbyZYSTRR1,[R14,#PUPD_OFS]ENDIF第五章汇编语言程序设计及系统初始化IFPIOE_SETUP<>0ADR

R0,PIOE_CFG`LDRR2,[R0];AddedbyZYLDRR1,[R0,#4]STRR2,[R14,#PCONE_OFS];ChangedbyZYSTRR1,[R14,#PUPE_OFS]ENDIF第五章汇编语言程序设计及系统初始化IFPIOF_SETUP<>0ADR

R0,PIOF_CFGLDRR2,[R0];AddedbyZYLDRR1,[R0,#4]STRR2,[R14,#PCONF_OFS];ChangedbyZYSTRR1,[R14,#PUPF_OFS]END

IF第五章汇编语言程序设计及系统初始化IFPIOG_SETUP<>0ADRR0,PIOG_CFGLDRR2,[R0];AddedbyZYLDRR1,[R0,#4]STRR2,[R14,#PCONG_OFS];Chang

edbyZYSTRR1,[R14,#PUPG_OFS]ENDIF第五章汇编语言程序设计及系统初始化IFPIOH_SETUP<>0ADRR0,PIOH_CFGLDRR2,[R0];AddedbyZYLDRR1,[R0,#4]STRR2,

[R14,#PCONH_OFS];ChangedbyZYSTRR1,[R14,#PUPH_OFS]ENDIFENDIF第五章汇编语言程序设计及系统初始化MDK软件虽然是个极其优秀的软件包,但是,此处的错误是很明显的,由于具有8个IO口,相同的错误连续出现了8次以上。例如对于C口,代

码如下:IFPIOC_SETUP<>0ADRR0,PIOC_CFGLDRR1,[R0,#4]STRR0,[R14,#PCONC_OFS]STRR1,[R14,#PUPC_OFS]ENDIF第五章汇编语言程序设计及系统初始化结合第二章,可知条件满足,执行完ADR指令后,R0装入的是PIOC_

CFG的标号,即一个地址,这个地址内的值为配置字,但是这个地址本身不能作为配置字,所以,后面的“STRR0,[R14,#PCONC_OFS]”语句就是完全错误的了。改正的方法很简单,代码如下:IFPIOC_S

ETUP<>0ADRR0,PIOC_CFGLDRR2,[R0];AddedbyZYLDRR1,[R0,#4]STRR2,[R14,#PCONC_OFS];R0,[R14,#PCONC_OFS]ChangedbyZYSTRR1,[R14,#PUPC_OFS]ENDIF第五章汇编语言程序

设计及系统初始化像上述代码一样,将R0值指向的地址处的值赋给R2,然后,再使用“STRR2,[R14,#PCONC_OFS]”就可以了。对于一个商业软件,其评估版的S3C2410芯片启动代码出现问题,一方面说明了这部分代码没有经过严格测试,另一方面也警告我们,汇编语言编程相对于C语言

来说,确有一些劣势。下面解释一下表5.1和启动代码中关于IO口配置的方法。序号2~19:定义了IO口存储器映射寄存器的基地址0x56000000,然后定义了A~H口的偏移地址,这些IO口寄存器的地址可参考附表1-1。例如,C口的控制寄存器地址为0x56000

020,相当于基址0x56000000+偏移地址PCONC_OFS(0x20)。这里没有J口,可以删除。第五章汇编语言程序设计及系统初始化序号21:当勾选了图5-2中I/OConfiguration后,此处,PIO_SETUP为1;否则,不勾选时,

PIO_SETUP为0,将不初始化IO口。序号23~24:由于图5-2中没有勾选PortA,则PIOA_SETUP为0,A口只有控制寄存器,没有上拉寄存器,这里只有PCONA_Val,当然,这个值由于PIOA_

SETUP为0而不会被用到。序号26~28:由于图5-2中没有勾选PortB,则PIOB_SETUP为0;符号PCONB_Val和PUPB_Val的值表示B口的控制寄存器和上拉寄存器的配置字,这些值随着图形配置向导而自动变化。第五章汇编语言程序设计及系统初始化序号30~

32:由于图5-2中勾选了PortC,则PIOC_SETUP为1;同时,根据图形配置向导自动设置了控制寄存器和上拉寄存器的值PCONC_Val和PUPC_Val,这两个值代表的含义请参考图5-2和“S3C2410AUser’sManual”第九章第10页,把GPC[7:5]设为输出口。

序号34~52:介绍端口D~H,与上述含义相近,不再重述。序号54~71:如果PIO_SETUP不为0,则开辟存储空间存放端口A~H的配置字,其中,A口只有一个配置字,B~H口均有两个配置字。第五章汇编语言程序设计及系统初始化5.1.2工程ex5_1的注解及运行情况在前面5.1.1小节对

S3C2410A.s进行修正之后,可以编译连接并下载这个工程了,在编译时会报告一条警告信息,即“ex5_1.sct(8):warning:L6314W:Nosectionmatchespattern*(InRoot$$Sections)”,这里的e

x5_1.sct是根据工程选项(像图4-15那样)的设置编译工程时自动产生的存储器配置文件,也称Scatter文件,以.sct结尾;“InRoot$$Section”是指为连接库里的段分配的空间,用于C语言程序设计中。双击该警告

信息,则弹出ex5_1.sct文件内容,如图5-3所示,在“*(InRoot$$Sections)”前面加上“;”号将其注释掉,并保存文件。第五章汇编语言程序设计及系统初始化图5-3ex5_1.sct文件第五章汇编语言程序

设计及系统初始化这时先不要编译工程,打开工程选项,选中“Linker”页签,设置如图5-4所示,即使用ScatterFile:ex5_1.sct。说明:工程选项中的其他页签保持不变(相对于工程ex4_3)。点击图5-4的“OK”按钮后,可以重新编译工程ex5_1,此

时没有错误,也没有警告信息了,如图5-5所示。在图5-5上,点击“Flash|Download”菜单(或单击工具栏上的快捷按钮)则把ex5_1.axf下载到UP-NETARM2410实验箱Nand型Flash上。下载完毕后,

程序将启动,可以看到三个LED灯在闪烁!也可以在线仿真调试(一般地,要把程序下载到Flash中后再仿真),或者把ULINK2仿真器从实验箱上取下来,重新给实验箱上电,则程序会从Flash中启动执行。第五章汇编语言程序设计及系统初始化

图5-4工程选项卡设置第五章汇编语言程序设计及系统初始化图5-5完整的工程ex5_1第五章汇编语言程序设计及系统初始化本节还有两个问题没有解决,其一为Scatter文件如何编写,其二为汇编语言程序ledf

lash.s的解释。笔者认为Scatter文件的内容及如何编写该文件方面的知识,除了一些ARM官方的文档之外,最好的资料是MDK软件的帮助菜单。这个帮助菜单和它的内容做得相当出色!本书中,笔者几乎无一例

外地使用工程选项卡配置存储器,因此,对Scatter文件内容的介绍也不会很多。现在,解释一下5.1节开头给出的程序段,即ledflash.s文件,该文件内容如图5-6所示,在图5-6中给出语句的行号,下面按行号解释。第五章汇编语言程序设计及系统初始化图5-6ledflash.s文件内容第五章

汇编语言程序设计及系统初始化行号01:定义名为LEDLIGHT的只读代码段。行号02:标号__main在外部可见。行号03:标号__use_two_region_memory在外部可见。这句和行号36处没有实际意义,仅是为了编译时不出现警告或错误,因为在S3C2410A.

s的第1095行(修正后的文件行号)有一句“IMPORT__use_two_region_memory”。行号04:定义C口数据寄存器地址。行号05:定义LED灯亮的常量。行号06:定义LED灯灭的常量。第五章汇编语言程序设计及系统初始

化行号07:ENTRY指程序入口点,一般的汇编程序只需要有一个入口点,而且这个入口点常被用作上电复位后的执行入口点。需要说明的是,这里的ENTRY入口点,并不是上电复位的执行入口点,在本程序中,由于RESET段是存储在地址0x00000000处的,

所以,RESET是上电复位入口点(RESET在S3C2410A.s文件中)。行号09:定义标号__main。行号10:R0=0x56000024。行号11:R1=0。行号12:向地址0x56000024处赋值

0,即使GPC5、GPC6和GPC7为0(低电平),由第二章图2-26可知,将点亮三个LED灯。第五章汇编语言程序设计及系统初始化行号14:跳转到延迟子程序,这个程序段不作介绍。行号16:R1=0xE0。行号17:向地址0x56000024处赋值1,即使GPC5、GPC6和GPC7为1(高电

平),由第二章图2-26可知,将熄灭三个LED灯。行号19:跳转到延迟子程序。行号21:跳转到__main,循环执行。程序功能:点亮三个LED灯后,等待约(0xF0000*0xF0000*指令周期)后,熄灭LED

灯,再等待一段时间后,重新点亮LED灯,循环执行,给人LED灯闪烁的感觉。第五章汇编语言程序设计及系统初始化5.1.3汇编语言语法ARM汇编语言的语法内容丰容,本书的重点不在于汇编语言,汇编语言主要用于初始化系统。因此,这里简单地介绍一些常用的汇编语言

语法。1)AREAAREA已出现在ledflash.s中,用于定义汇编语言代码段或数据段,例如:AREALEDLIGHT,CODE,READONLYAREALEDSHINE,DATA,READWRITE第五章汇编语言程序设计及系统初始化上述代码段

定义一个名为LEDLIGHT的只读代码段和一个名为LEDSHINE的读写代码段。DATA用得较少。在S3C2410A.s中有如下语句:AREASTACK,NOINIT,READWRITE,ALIGN=3该语句中,NOINIT伪关键字表示该段代码只分配空间,不初始化(用0填充),ALIGN=3

表示按双字对齐方式(23=8B)。2)SPACE在S3C2410A.s中有如下语句:Stack_MemSPACEStack_Size第五章汇编语言程序设计及系统初始化这里Stack_Mem为标号,Stack_S

ize为常量,SPACE表示为Stack_Mem分配大小为Stack_Size的连续空间,单位为字节。3)DCDDCD已出现在initmemcon.s中,表示分配字大小的连续空间,并用其他的值初始化该空间,例如:Mem_Val_ConfDCD0x

22111110,0x700表示为标号Mem_Val_Conf分配两个字空间,并初始化这个字的值为0x22111110和0x700。此外,还有DCDU表示不按字对齐方式存储,慎用!!除了DCD之外,还有DCB、DCW、DCQ、DCFS、DCFD等,分别表示为字节、半字、双字

、单精度浮点数(即字)、双精度浮点数(即字)分配空间,并使用指定的数据初始化。第五章汇编语言程序设计及系统初始化4)EQUEQU是汇编语言的相等伪指令,用得较多。例如在initmemcon.s中有:Mem_Addr

_BaseEQU0x480000005)PRESERVE8PRESERVE8指定当前文件的堆栈采用8字节对齐方式,出现在S3C2410A.s中第0789行,要求每个栈的长度的最低3位为0,且栈底地址的最低3位也应为0。6)ARMARM指示符出现在S3C2410A.s中第

0796行,指示编译器生成32位指令的ARM代码;而THUMB指示符表示生成16位指令的Thumb代码。另外,THUMBX用于生成Thumb-2EE代码。第五章汇编语言程序设计及系统初始化7)NOPNOP即Nooperation,

表示空操作。8)IF语句IF语句格式为:IF条件表达式语句组1ELSE语句组2ENDIF第五章汇编语言程序设计及系统初始化当条件表达式为真时,执行语句组1;否则,执行语句组2。出现在条件表达式中的“<>”(例如S3C2410A.s中的第0923行)表示不等于

。表示等于、大于、小于、大于等于、小于等于的关系操作符为=、>、<、>=、<=。9)IMPORTIMPORT后面跟标识符,表明该标识符是在该文件外部定义的,标识符后可以加可选项[WEEK],则引用的标识符没有定义时,编译时也不会出错。而该文件中定义的标识符需要被工程中的其他文

件引用时,使用EXPORT关键字。同时,GLOBAL可以声明一个全局标识符。此外,EXTERN的功能与IMPORT相似,当该文件中没有实际引用这个标识符时,EXTERN下编译器不会添加该标识符到符号表中。第五章汇编语言程序设计及系统初始化10)逻辑操作S3C2410A.s的第1054行出现

了“:OR:”,表示按位取或,还有以下伪操作符::AND:表示按位取与;:EOR:表示按位取异或;:NOT:表示取反。同时,还有:MOD:表示取模,:SHL:、:SHR:、:ROL:和:ROR:分别表示左移、右移、循环左移、循环右移,还可以使

用+、-、*、/算符,其中“+”出现在S3C2410A.s的第1100行。表示逻辑操作的有:LNOT:、:LAND:、:LOR:和:LEOR:,依次为逻辑取反、逻辑与、逻辑或、逻辑异或。第五章汇编语言程序设计及

系统初始化11)END汇编语言每个程序段均以END结尾。汇编语言程序是由AREA定义的一个个代码段组成的,每个代码段由汇编指令语句组成,完成某项特定的功能,最后以END结尾。不同的代码段之间可以通过引用标号的方式相互调用。工程ex5_1包含了汇编语言程序的基本特征,可以视为汇编语言程序的学习框架程

序。在5.4节中还将添加中断处理进一步完善该程序。第五章汇编语言程序设计及系统初始化5.2浮点数据处理浮点数即小数,使用ARM汇编语言表示和处理小数,需要借助于IEEE-754标准或者DSP定标的方法。DSP定标方法在定点DSP芯片进行浮点数据处理时经常使用,相关内容可参考《TMS320C5000

系列DSP汇编语言程序设计》第六章,在这一章中,作者指出,“汇编语言是公认的硬件操作最好的语言,并且用它来编写算法对编程者的思维也是一个很好的启迪过程。”事实上,由于汇编语言语法简单明了,用来实现算法时,没有现成的算法库来调用,因此,编程者必须亲自编写算法的每个函数和每个细节,从而要求编程者对

算法非常熟悉才行。本节内容将介绍ARM920T下的数值定标和正余弦函数的计算。第五章汇编语言程序设计及系统初始化5.2.1计算基础计算正弦和余弦函数的值,需要借助于泰勒级数展开式,如下:357111sin3!5!7!xxxx

x=−+−+246111cos12!4!6!xxxx=−+−+例如,取x=0.45,则第五章汇编语言程序设计及系统初始化357111sin0.450.450.450.450.453!5!7!−+−246111cos0.4510.450.450.452!4!6!−+−

(1)(2)上两式为本节程序采用的算法。第五章汇编语言程序设计及系统初始化5.2.2数值定标汇编语言中的32位操作数只能为0或1组成的码字。所谓“码字”,是指CPU只能把存储器的内容视为二进制数码符号(实际上是电平信号

),而不是数字。人们习惯把二进制码字之间的运算关系称为二进制数(二进制补码)之间的运算,所以常常给人一种存储器存储的是数的假象。但是,在码和数之间的确有一种一一映射的关系,并且,在这个映射关系上可以将数的运算映射为码间的运算。同时,由于十六进制表示的整数和码字之间这种映射

关系非常直观,以至于人们会忽略这种映射的存在。第五章汇编语言程序设计及系统初始化例如,给定一个十六进制码字0x00000055,人们会不加思考地认为它等于十进制数85。这种相等是有条件的,即0x00000055码字的小数定标点位于第0位以后(或认为没有小数定标点),这个定标点是思想中添加的

、用于码和数之间映射的一种关系。对于整数的处理,人们可以很直观地认为这个定标点不存在。对于小数处理,就不能忽视这个定标点了。第五章汇编语言程序设计及系统初始化定标的方法就是通过加定标的方法将小数转化为十六进制数(码)的方法,ARM是32位定点处理器,定标点可设为0~32。定标点确定后,3

2位的存储字存储的数据大小也就确定了。一个小数a的n定标值为取整(a×2n),0≤n≤32。根据这种方法,小数0.45的31定标值为0.45×231=966367641.6d≈966367641d=0x3

9999999,即设置定标点为31后,十六进制值0x39999999不再是整数966367641,而是小数0.45。定标有一种记号法,即Q(32-n).n,定标点为31时,记作Q1.31,有时简记为Q31,是最常用的一种定标方法。但是,Q

31定标只能表示[-1,1)区间的小数,如果表示更大范围内的小数,例如区间[-2,2),则需要采用定标Q2.30。第五章汇编语言程序设计及系统初始化小数定标后的值往往是小数的近似值,这说明计算机采用定标方法只能不

精确地表示小数,例如,小数0.1就不能精确定标。小数的定标值可参与加、减和乘等运算,由于定标值表示的数据范围有限,所以定标值间的运算不能有溢出,否则计算结果错误。特别是乘法运算,乘法结果为64位,定标点位

置移动到62位,必须取高32位(同时向左移一位)进行定标点的还原(为31位);加法和减法运算不改变定标点。第五章汇编语言程序设计及系统初始化常用的做法为:在十进制数条件下进行小数的算法处理,找到所有参与运算的小数、中间结果和最终结果的绝对值最大值,按照这

个最大值确定定标点位置。然后,将小数转换为定标值,编写汇编语言程序对定标值进行处理,得到定标值表示的最终结果。最后,用去定标的方法,即最终结果除去2n后得到真实的小数形式结果。在这个过程中,只有上一行的

阴影部分是ARM汇编语言程序完成的。第五章汇编语言程序设计及系统初始化计算0.45的正弦和余弦值汇编语言程序,由于输入数据、中间结果和最终结果都不可能超过1,可以采用Q31定标方法。需要指出的是,上述介绍的是有符号的定标,即定标值的最高位31位为符号位,这种定标方法用得较多

。关于无符号定标方法,由于与有符号定标方法相似,故本书不作介绍。下面把公式(1)和(2)中出现的常数按Q31定标方法计算的定标值列于表5-2中。第五章汇编语言程序设计及系统初始化表5-2公式(1)和(2)中常数的Q31定标值小数0.451/3!1/5!1

/7!定标值0x399999990x155555550x11111110x68068小数11/2!1/4!1/6!定标值0x7FFFFFFF0x400000000x55555550x2D82D8这里的定标点和小数点是完全不同的概念,请注意

区分。第五章汇编语言程序设计及系统初始化5.2.3程序代码及结果分析本小节的内容不是本书的重点,因此对本小节中的汇编程序不作深入分析,但是我们还是给出了完整的程序示例和源代码(注释清晰),供感兴趣的读者参考。在工程ex5_1的基

础上,新建工程ex5_2,修改ledflash.s文件,其代码如下所示:1AREALEDLIGHT,CODE,READONLY2EXPORT__main;LedFlash3EXPORT__use_tw

o_region_memory4第五章汇编语言程序设计及系统初始化5IMPORTSin0p45;forSincos0.456GPCDAT_ADDREQU0x560000247LED_ONEQU0x00008LED_OFFEQU0x00E09ENTRY10;LedFlash11

__main12BLSin0p45;forSincos0.4513ledflash14LDRR0,=GPCDAT_ADDR15MOVR1,#LED_ON第五章汇编语言程序设计及系统初始化16STRR1,[R0];LEDON1718BLDelay1

920MOVR1,#LED_OFF21STRR1,[R0];LEDOFF2223BLDelay2425Bledflash第五章汇编语言程序设计及系统初始化26Delay27MOVR3,#0x0F000028MOVR4,#0x0F000029subcycle130SU

BR3,R3,#131subcycle232SUBR4,R4,#133CMPR4,#034BGEsubcycle23536CMPR3,#037BGEsubcycle1第五章汇编语言程序设计及系统初始化38BXLR3940__use_two_region_memory;nowarning41

END上述代码中后跟注释“;forSincos0.45”的语句为新添加的语句,即先进行求正余弦值的运算,然后再作使LED灯闪烁的处理。新建汇编语言文件sincos0p45.s,并添加到工程ex5_2中,工程ex5_2的主界面如图5-7所示。第五章汇编语言程序设计

及系统初始化图5-7工程ex5_2的工作界面第五章汇编语言程序设计及系统初始化文件sincos0p45.s的完整代码如下:1AREASINCOS,CODE,READONLY2EXPORTSin0p453Sin0p454STMFDSP!,{R0-R9,R14}56;ca

lculatesin0.457;R0-R1loadaddress8;R3-R8loadvalue9ADRR0,x_q;R0isaddrofx第五章汇编语言程序设计及系统初始化10LDRR4,[R0];R4=x1112SMULLR5,R6,R4,

R413MOVR7,R6,LSL#114ADDR7,R7,R5,LSR#31;R7=x*x1516SMULLR5,R6,R4,R717MOVR8,R6,LSL#118ADDR8,R8,R5,LSR#31;R8=x*x

*x1920ADRR1,cof_3第五章汇编语言程序设计及系统初始化21LDRR3,[R1];R3=cof32223SMULLR5,R6,R3,R824MOVR2,R6,LSL#125ADDR2,R2,R5,LSR#31;R2=x^3/3!2627MOVR9,

R428SUBR9,R9,R2;R9=x-x^3/3!2930SMULLR5,R6,R7,R831MOVR8,R6,LSL#1第五章汇编语言程序设计及系统初始化32ADDR8,R8,R5,LSR#31;R8=x^53334ADRR1,cof_535LD

RR3,[R1];R3=cof53637SMULLR5,R6,R3,R838MOVR2,R6,LSL#139ADDR2,R2,R5,LSR#31;R2=x^5/5!4041ADDR9,R9,R2;R9=x-x^3/3!+x^5/5!第五章汇编语言程序设计及系

统初始化4243SMULLR5,R6,R7,R844MOVR2,R6,LSL#145ADDR2,R2,R5,LSR#31;R2=x^74647ADRR1,cof_748LDRR3,[R1];R3=cof74950SMULLR5,R6,R3,R251MOVR2,R6,L

SL#1第五章汇编语言程序设计及系统初始化52ADDR2,R2,R5,LSR#31;R2=x^7/7!5354SUBR9,R9,R2;R9=x-x^3/3!+x^5/5!-x^7/7!5556LDRR

1,=sin_x57STRR9,[R1]5859;calculatecos0.4560ADRR0,x_q;R0isaddrofx61LDRR4,[R0];R4=x62第五章汇编语言程序设计及系统初始化63SMUL

LR5,R6,R4,R464MOVR7,R6,LSL#165ADDR7,R7,R5,LSR#31;R7=x*x6667SMULLR5,R6,R7,R768MOVR8,R6,LSL#169ADDR8,R8,R5,LSR#31;R8=x^470

71ADRR1,cof_272LDRR3,[R1];R3=cof273第五章汇编语言程序设计及系统初始化74SMULLR5,R6,R3,R775MOVR2,R6,LSL#176ADDR2,R2,R5,LSR#31;R2=x^2/2!7778ADRR0,cof_179LDRR9,[R0

]80SUBR9,R9,R2;R9=1-x^2/2!8182ADRR1,cof_483LDRR3,[R1];R3=cof484第五章汇编语言程序设计及系统初始化85SMULLR5,R6,R3,R886MOVR2,R6,LSL#187ADDR2,R2,R5,LSR#31

;R2=x^4/4!8889ADDR9,R9,R2;R9=1-x^2/2!+x^4/4!9091SMULLR5,R6,R7,R892MOVR2,R6,LSL#193ADDR2,R2,R5,LSR#31;R2=x^694第五章汇编语言程序设计及系统初始化95ADR

R1,cof_696LDRR3,[R1];R3=cof69798SMULLR5,R6,R3,R299MOVR2,R6,LSL#1100ADDR2,R2,R5,LSR#31;R2=x^6/6!101102SUBR9,

R9,R2;R9=1-x^2/2!+x^4/4!-x^6/6!103104LDRR1,=cos_x105STRR9,[R1]第五章汇编语言程序设计及系统初始化106107;BXLR;return108L

DMFDSP!,{R0-R9,PC};return109110x_qDCD0x39999999;0.45111cof_1DCD0x7FFFFFFF;1112cof_2DCD0x40000000;1/2!113cof_3DCD0x15555555;1/3!114cof_4

DCD0x05555555;1/4!115cof_5DCD0x01111111;1/5!116cof_6DCD0x002D82D8;1/6!第五章汇编语言程序设计及系统初始化117cof_7DCD0x0006806

8;1/7!118119AREASINCOSRES,DATA,READWRITE120sin_xDCD0;sin0.45121cos_xDCD0;cos0.45122END编译连接下载工程ex5_2,然后调试工程,如图5-8所示。第五章汇编语言程序设计及系统初始化图5-8工程ex5_2的调试

窗口第五章汇编语言程序设计及系统初始化工程ex5_2的计算结果sin0.45和cos0.45保存在标号sin_x和cos_x处,即图5-8右侧Memory的0x30000000和0x30000004处,计算结果数值为0x37ACF357和0x7341D96B,去定标后的值(即转化为

十进制数,再除以231后的值)为:计算值sin0.45=0.4349655318073928356170654296875计算值cos0.45=0.9004470608197152614593505859375第五章汇编语言程序设计及系统初始化而真实值为:真实值sin0.

45=0.4349655341112302104208442462319真实值cos0.45=0.90044710235267692166884061148645计算值和真实值的误差在10-7数量级上,可见,计算结果是正确的。

(数学角度上,还要考虑级数的截断误差!)第五章汇编语言程序设计及系统初始化5.3系统初始化系统初始化是指上电复位后ARM芯片级程序首先要进行的处理,即配置工作时钟、看门狗电路、存储器空间、通用IO口、中断向量表及堆栈等,这些工作都可以借助MDK软件的启动代码可视

化配置向导完成,生成相关的启动代码文件。这里选用了S3C2410芯片,所以启动代码文件为S3C2410A.s。下面将介绍这个启动代码文件中还没有讲述的部分,并编制一个替换掉该启动代码文件的初始化代码文件。第五章汇编语言程序设计及系统初始化5.3.1启动代码S3C2410A.s启动代码文件S3C2

410A.s中已经讲述的部分为存储器控制器、通用IO口配置以及堆和栈等四部分,本小节中介绍的内容为看门狗定时器(WatchdogTimer)、时钟管理器(ClockManagement)和中断向量表(InterruptVectorTable)三部分,其中,中断向量表在5

.4节还要深入讲述。第五章汇编语言程序设计及系统初始化1.时钟管理器初始化时钟管理器往往是初始化工作的第一步(例如DSP中),而在启动文件S3C2410A.s中,第一步是初始化看门狗定时器,第二步是初始化时钟管理器。结合“S

3C2410AUser’sManual”第七章“Clock&PowerManagement”,可知时钟管理器如图5-9所示。第五章汇编语言程序设计及系统初始化S3C2410A有四种工作模式,即正常模式、慢速模式、空闲模式和掉电模式,正常模式下由图5-9所示模块向CPU和所有

外设提供时钟源,外设时钟源可以通过软件打开或关闭,当所有外设时钟都工作时,芯片功耗达到最大。这里仅讨论正常模式下的时钟管理器配置。从UP-NETARM2410实验箱原理图上可以查到,S3C2410A的OM3和OM2脚均接地,即OM[3:2]=0b00,则由S3

C2410A芯片资料手册可以查到,此时上电复位后时钟配置为MPLL有效、UPLL有效、主时钟源和USB时钟源均来自外部的晶体。再查UP-NETARM2410实验箱原理图,可以查到PLL时钟源频率为12MHz,RTC时钟源为32.768kHz。第五章汇编语言程序设计及系

统初始化图5-9S3C2410A时钟管理器第五章汇编语言程序设计及系统初始化从附录一的附表1-1可以查到与时钟管理器相关的映射寄存器共有6个,即LOCKTIME、MPLLCON(必须初始化)、UPLLC

ON、CLKCON、CLKSLOW和CLKDIVN,基地址为0x4C000000,偏移量依次为0、0x4、0x8、0xC、0x10和0x14。这些寄存器的含义请参考S3C2410A芯片资料手册第七章。这些寄存器统称为时钟控制寄存器,配置好这些寄存器后,输入到芯片的时钟将按图5-1

0进行分配,其中,FCLK给CPU,HCLK给AHB总线外设(例如ARM920T、存储控制器、中断控制器、LCD控制器、DMA和USB主机等),PCLK给APB总线外设(例如WDT、IIS、IIC、PWM定时器、M

MC接口、ADC、UART、GPIO、RTC和SPI等),UCLK为USB服务。第五章汇编语言程序设计及系统初始化图5-10S3C2410A时钟分配方案第五章汇编语言程序设计及系统初始化现在看一下启动代码S3C2410A.s中与配

置6个时钟控制寄存器相关的语句,如表5-3所示,其中,行号以工程ex5_1中的S3C2410A.s为准。表5-3S3C2410A.s中与时钟控制器相关的代码序号行号注释或语句10068~0076;ClockManagem

entdefinitionsCLK_BASEEQU0x4C000000;ClockBaseAddressLOCKTIME_OFSEQU0x00;LOCKTIMEOffsetMPLLCON_OFSEQU0x04;MPLLCONOffsetUPLLCON_OFSEQU0X08;UPLL

CONOffsetCLKCON_OFSEQU0x0C;CLKCONOffsetCLKSLOW_OFSEQU0x10;CLKSLOWOffsetCLKDIVN_OFSEQU0X14;CLDKIVNOffsetCAMDIVN_OFSEQU0X18;CAMDIVNOffset第五章汇编语言程序

设计及系统初始化20080~0140;时钟控制器寄存器注释30141~0147CLK_SETUPEQU1MPLLCON_ValEQU0x0005C080UPLLCON_ValEQU0x00028080CLKCON_ValEQU0x0007FFF0CLKSLOW_ValEQU0x

00000004LOCKTIME_ValEQU0x00FFFFFFCLKDIVN_ValEQU0X00000000第五章汇编语言程序设计及系统初始化序号行号注释或语句40909~0918;ClockManageme

ntConfigurationIFCLK_SETUP<>0CLK_CFGDCDLOCKTIME_ValDCDCLKDIVN_ValDCDMPLLCON_ValDCDUPLLCON_ValDCDCLKSLOW_ValDCDCLKCON_ValENDIF

第五章汇编语言程序设计及系统初始化50958~0968IFCLK_SETUP<>0LDRR0,=CLK_BASEADRR8,CLK_CFGLDMIAR8,{R1-R6}STRR1,[R0,#LOCKTIME_OFS]STRR2,[

R0,#CLKDIVN_OFS]STRR3,[R0,#MPLLCON_OFS]STRR4,[R0,#UPLLCON_OFS]STRR5,[R0,#CLKSLOW_OFS]STRR6,[R0,#CLKCON_OFS]ENDIF第五章汇编语言程序设计及系统初始化表5-

3中序号1一行表示定义时钟控制寄存器的基地址和偏移量;序号3一行中,CLK_SETUP为1表示在配置向导中“ClockManagement”勾选,即使用S3C2410A.s初始化时钟寄存器,其他的为6个寄存器的配置值;序号4中为时钟控制寄存器配置字分配空间;序号5一行为初

始化时钟控制寄存器。(这段代码写得不错!)下面理解一下表5-3中序号3一行中各配置字的含义,如表5-4所示,表5-4中也列出笔者拟配置的值,其中,“MDK值”表示MDK软件启动代码中配置的值,“笔者值”为笔者拟定的值。第五

章汇编语言程序设计及系统初始化表5-4时钟控制寄存器配置值及含义寄存器名MDK值笔者值含义LOCKTIME0x00FFFFFF0x00FFFFFFLOCKTIME的位[23:12]为UPLL的锁定时间,位[11:0]为MPLL的锁定时

间,位[31:24]保留。这里采用复位值,也是最大值,MPLL和UPLL稳定(锁住)前的计数值均为0xFFFMPLLCON0x0005C0800x00058011MPLLCON和UPLLCON结构相同,第[19:12]位为MDIV,第[9:4]位为PDIV,第[1:0]位为SDIV,

其他位保留。Mpll时钟值=[输入时钟*(MDIV+8)]/[(PDIV+2*2SDIV],MDK的设置值为默认值,表示Mpll为120MHz,笔者的设置值为192MHz。注意:虽然这款S3C2410A芯片最大工作

频率为200MHz,但是配置PLL值应使用推荐的配置,不要任意设置UPLLCON0x000280800x00078023MDK的配置值为57.6MHz,笔者的设定值为48MHz第五章汇编语言程序设计及系统初始化寄存器名MDK值作者值含义CLKCON0x0007F

FF00x0007FFF0CLKCON寄存器从第18位至第4位依次管理SPI、IIS、IIC、ADC(含触摸屏)、TRC、GPIO、UART2、UART1、UART0、SDI、PWMTIMER、USB设备、USB主机、LCDC、NandFlash的时钟源。当各位取1时有效;取0时无效。

第3位至第0位依次为POWER_OFF模式、空闲模式、保留、SM_BIT(推荐为0)的设置位,均需取0。采用的是缺省设置第五章汇编语言程序设计及系统初始化CLKSLOW0x000000040x00000004CLKSLOW寄存器第7位为1表示UCLK

开,为0表示UCLK关(UPLL终始有效)。第5位为1表示PLL开,为0表示PLL关。第4位为0表示FCLK=Mpll,为1表示SLOW模式(此时时钟大小计算请参考S3C2410A手册)。第[2:0]位为慢时

钟分频值,缺省为0x4。这里采用缺省值即可CLKDIVN0x000000000x00000003CLKDIVN寄存器第1位为0,则HCLK时钟为FCLK;第1位为1,则HCLK时钟为FCLK/2。第0位为0,表示PC

LK时钟为HCLK;第0位为1,表示PCLK时钟为HCLK/2。第2位为0,保留;如果第2位设为1,表示HCLK和PCLK均为FCLK./4,此时位[1:0]无效,且必须设为0b00第五章汇编语言程序设计及系统初始化结合图5

-9和图5-10,配置时钟寄存器后,Mpll时钟稳定前,CPU直接使用外部时钟;当PLL稳定后,CPU时钟FCLK将使用Mpll时钟,即工作在192MHz下。在工程ex5_1的基础上新建工程ex5_3(此时,与工程ex5_1完全

相同),然后,按表5-4中的“作者值”设置S3C2410A.s,如图5-11所示。第五章汇编语言程序设计及系统初始化图5-11在S3C2410A.s中设置ClockManagement第五章汇编语言程序设计及系统初始化此时的工程ex5_3的工作界面如图5-12所示。编译连接下载工程e

x5_3后,可以看到三个LED灯闪烁频率更快了。因为,工程ex5_1的CPU工作频率为120MHz,现在CPU的工作频率为192MHz。值得一提的是,越是高档的芯片,例如,高档的ARM和DSP芯片,其时钟设计往往是件很有趣的事。第五章汇编语言程序设计及系统初始化图5-12工程e

x5_3的主窗口第五章汇编语言程序设计及系统初始化2.看门狗定时器看门狗定时器的作用有两个,即产生中断信号或复位信号。根据附录一的附表1-1可知,看门狗定时器有三个寄存器,即WTCON、WTDAT和WTCNT,基地址为0x5

3000000,偏移量分别为0x0、0x4和0x8。看门狗定时器曾在工程ex4_3中修改过,之后所有的工程均采用了工程ex4_3修改后的看门狗定时器配置,如图5-13所示。第五章汇编语言程序设计及系统初始化图5-13看门狗定时器配置第五章汇编语言程序设计及系统初始

化图5-13设置好后,S3C2410A.s中与看门狗定时器有关的代码如表5-5所示。序号行号注释或语句10162~0166;WatchdogTimerdefinitionsWT_BASEEQU0x53000000;WTBa

seAddressWTCON_OFSEQU0x00;WTCONOffsetWTDAT_OFSEQU0x04;WTDATOffsetWTCNT_OFSEQU0x08;WTCNTOffset20168~0177;看门狗寄存器注释30178~0180WT_SE

TUPEQU1WTCON_ValEQU0x00008020WTDAT_ValEQU0x00008000表5-5S3C2410A.s中看门狗定时器配置的相关代码第五章汇编语言程序设计及系统初始化40948~0955I

FWT_SETUP<>0LDRR0,=WT_BASELDRR1,=WTCON_ValLDRR2,=WTDAT_ValSTRR2,[R0,#WTCNT_OFS]STRR2,[R0,#WTDAT_OFS]STRR1,[R0,#W

TCON_OFS]ENDIF表5-5中,序号1一行定义看门狗寄存器基地址及其偏移量,序号3为配置字,序号4为写看门狗寄存器(这些代码的写作风格与配置时钟和通用IO的写作风格不一样)。第五章汇编语言程序设计及系统初始化看门狗定时器各个

寄存器的含义如下:(1)看门狗控制寄存器WTCON,复位值为0x8021。其位[15:8]为预分频值,取值为0~28-1;第5位为1使能看门狗,为0禁止看门狗;第[4:3]位为时钟分频因子,取0b00、0b01、0b10和0b11分别表示分频因子大小为16、32、64、128;第2位为中

断发生位,取0禁止中断,为1使能看门狗中断;第0位为1时看门狗溢出将复位芯片,为0时看门狗溢出不复位;第7、6、1位保留,须写0。设置值为0x00008020表示看门狗时钟为PCLK/(预分频值+1)/分

频因子,这里为192MHz/(0x80+1)/16=930kHz。每隔一个看门狗时钟,看门狗计数值将减1,即WTCNT的值将减1。第五章汇编语言程序设计及系统初始化(2)看门狗计数寄存器WTCNT,复位值为0x8000,有效长度为16位,每隔一个看门狗时钟

周期,计数值减1。在使能看门狗之前,要先对WTCNT赋初值。(3)看门狗数据寄存器WTDAT,复位值为0x8000,有效长度为16位,看门狗有效后,WTCNT计数到0后,WTDAT的值自动装入WTCNT。注意:初始化看门狗后,WTDAT的值不会自动装入WTCNT中,要等WTCN

T减计数到0后,才会自动装入,即第一次看门狗溢出时间由WTCNT决定,所以,一般在初始化看门狗时,要先向WTCNT赋值。工程ex4_3的改动,在于使WTCON的第0位为0,即看门狗溢出时不会引起系统复位。

第五章汇编语言程序设计及系统初始化新建工程ex5_4(和工程ex5_3完全相同),设置看门狗如图5-14所示。图5-14看门狗新的配置第五章汇编语言程序设计及系统初始化图5-14设置了WTCON为0x00008039,即约

2.818秒看门狗溢出一次,溢出时将使芯片复位。当程序正常运行时(不跑飞的情况下)采用每隔小于2.818秒的时间里喂狗一次,则可保证看门狗不会溢出,因此,在ledflash.s中添加喂狗语句,完整源代码如下:1AREALEDL

IGHT,CODE,READONLY2EXPORT__main;LedFlash3EXPORT__use_two_region_memory4GPCDAT_ADDREQU0x560000245LED_ONEQU0x00006LED_OFFEQU0

x00E0第五章汇编语言程序设计及系统初始化7WTCNTEQU0x530000088ENTRY9;LedFlash10__main11LDRR0,=GPCDAT_ADDR12MOVR1,#LED_ON13STRR1,[R0];LEDON1415BLDelay1617MOVR1,#LED_OF

F第五章汇编语言程序设计及系统初始化18STRR1,[R0];LEDOFF1920BLDelay2122;feedwatchdog23LDRR2,=WTCNT24MOVR5,#0x800025STRR5,[R2]2627B__main28Delay第五章汇编语言程序设计及系

统初始化29MOVR3,#0x0F000030MOVR4,#0x0F000031subcycle132SUBR3,R3,#133subcycle234SUBR4,R4,#135CMPR4,#036BGEsubcycle23738CMPR3,#039BGEsubcycle1第五

章汇编语言程序设计及系统初始化40BXLR4142__use_two_region_memory;nowarning43END3.异常向量表新建工程ex5_5(与工程ex5_3完全相同),设置S3C2410A.s如图5-15所示。如图5-15设置好后,启动代码文件S3C2410A.s

中和异常向量表有关的代码,如表5-6所示。第五章汇编语言程序设计及系统初始化图5-15中断向量表设置第五章汇编语言程序设计及系统初始化表5-6S3C2410A.s中和异常向量表相关的代码序号行号注释或语句10151~0152;InterruptdefinitionsINTOFFSET

EQU0X4A000014;AddressofInterruptoffsetRegister20154~0160;//<e>InterruptVectorTable;//<o1.0..31>InterruptVectoraddress<0x20-0x3fff

ff78>;//<i>YoucoulddefineInteruuptVctorTableaddress.;//<i>TheInterruptVectorTableaddressmustbewordalign

edadress.;//</e>IntVT_SETUPEQU1IntVTAddressEQU0x33FFFF20第五章汇编语言程序设计及系统初始化30799~0811;ExceptionVectors;Mappedto

Address0.;Absoluteaddressingmodemustbeused.;DummyHandlersareimplementedasinfiniteloopswhichcanbemodified.Ve

ctorsLDRPC,Reset_AddrLDRPC,Undef_AddrLDRPC,SWI_AddrLDRPC,PAbt_AddrLDRPC,DAbt_AddrNOP;ReservedVectorLDRPC,IRQ_AddrLDRPC,FIQ_Addr第五章汇编语言

程序设计及系统初始化40814~0862IFIntVT_SETUP<>0;InterruptVectorTableAddressHandleEINT0EQUIntVTAddressHandleEINT1EQUIntVTAddress+4HandleEINT2EQUIntVTAddre

ss+4*2HandleEINT3EQUIntVTAddress+4*3HandleEINT4_7EQUIntVTAddress+4*4HandleEINT8_23EQUIntVTAddress+4*5HandleReserv

edEQUIntVTAddress+4*6HandleBATFLTEQUIntVTAddress+4*7HandleTICKEQUIntVTAddress+4*8HandleWDTEQUIntVTAddress+4*9Handle

TIMER0EQUIntVTAddress+4*10HandleTIMER1EQUIntVTAddress+4*11HandleTIMER2EQUIntVTAddress+4*12HandleTIMER3EQUIntVTAddress+4*13HandleTIMER4EQUIntVTAddr

ess+4*14HandleUART2EQUIntVTAddress+4*15HandleLCDEQUIntVTAddress+4*16HandleDMA0EQUIntVTAddress+4*17HandleDMA1EQUIntVTA

ddress+4*18HandleDMA2EQUIntVTAddress+4*19HandleDMA3EQUIntVTAddress+4*20HandleMMCEQUIntVTAddress+4*21第五章汇编语言程序设计及系统初始化序号行号注释

或语句40814~0862HandleSPI0EQUIntVTAddress+4*22HandleUART1EQUIntVTAddress+4*23;HandleReservedEQUIntVTAddress+4*24HandleUSBD

EQUIntVTAddress+4*25HandleUSBHEQUIntVTAddress+4*26HandleIICEQUIntVTAddress+4*27HandleUART0EQUIntVTAddress+4*28HandleSPI1EQUIntVTAddress+4*39HandleR

TCEQUIntVTAddress+4*30HandleADCEQUIntVTAddress+4*31IRQ_Entrysubsp,sp,#4;reservedforPCstmfdsp!,{r8-r9}l

drr9,=INTOFFSETldrr9,[r9]ldrr8,=HandleEINT0addr8,r8,r9,lsl#2ldrr8,[r8]strr8,[sp,#8]ldmfdsp!,{r8-r9,pc}ENDIF第五章汇编语言程序设计及系统初始化50864~0871Reset_Add

rDCDReset_HandlerUndef_AddrDCDUndef_HandlerSWI_AddrDCDSWI_HandlerPAbt_AddrDCDPAbt_HandlerDAbt_AddrDCDDAbt_Handl

erDCD0;ReservedAddressIRQ_AddrDCDIRQ_HandlerFIQ_AddrDCDFIQ_Handler60873~0886Undef_HandlerBUndef_HandlerSWI_HandlerBSWI_HandlerPAbt_HandlerBP

Abt_HandlerDAbt_HandlerBDAbt_HandlerIFIntVT_SETUP<>1IRQ_HandlerBIRQ_HandlerENDIFIFIntVT_SETUP<>0IRQ_HandlerBIRQ_EntryENDIFFIQ_HandlerBFIQ_Handler第五

章汇编语言程序设计及系统初始化理解表5-6需要进一步参考S3C2410A的资料手册第14章,这里简单地介绍一下这一章的内容,这些内容是本节的预备知识。S3C2410A有56个中断源,这些中断源的处理如

图5-16所示。如图5-16,有些中断源(Requestsources(withsub-register),约11个)具有子源悬挂寄存器(SUBSRCPND)和子源屏蔽寄存器(SUBMASK),这些源中断产生后,会自动向其SUBSRCPND相应的位写1,如果其SUBMASK屏蔽了这些中断,则这些中

断不会响应。第五章汇编语言程序设计及系统初始化图5-16S3C2410A中断源处理流程第五章汇编语言程序设计及系统初始化如果SUBMASK开放了这些中断,则这些中断和另外一些不具有子源寄存器的中断取或后进入到SRCPND中。为了

解释的方便,假定SUBMASK屏蔽了所有带子源寄存器的中断源,则那些不带子源寄存器的中断源(Requestsources(withoutsub-register),约35个)产生后,将首先置位SRCPND(地址为0x4A000000)

相应的位(不受屏蔽),表示该中断产生了,这些位和SRCPND的对应关系如表5-7所示。在进入中断服务程序后,应立即通过向相应的位写1清除该位,否则,会认为一个新的中断又产生了。第五章汇编语言程序设计及系统初始化表5-7中

断请求状态寄存器中断名位描述偏移号INT_ADC31中断请求是否产生:1—产生;0—没有31INT_RTC30中断请求是否产生:1—产生;0—没有30INT_SPI129中断请求是否产生:1—产生;0—没有29INT_UART028中断请求是否产生:1—产生;0—没有28INT

_IIC27中断请求是否产生:1—产生;0—没有27INT_USBH26中断请求是否产生:1—产生;0—没有26INT_USBD25中断请求是否产生:1—产生;0—没有25保留24—24第五章汇编语言程序设计及系统初始化INT_UART

123中断请求是否产生:1—产生;0—没有23INT_SPI022中断请求是否产生:1—产生;0—没有22INT_SDI21中断请求是否产生:1—产生;0—没有21INT_DMA320中断请求是否产生

:1—产生;0—没有20INT_DMA219中断请求是否产生:1—产生;0—没有19INT_DMA118中断请求是否产生:1—产生;0—没有18INT_DMA017中断请求是否产生:1—产生;0—没有17INT_LC

D16中断请求是否产生:1—产生;0—没有16INT_UART215中断请求是否产生:1—产生;0—没有15INT_TIMER414中断请求是否产生:1—产生;0—没有14第五章汇编语言程序设计及系统初始化中断名

位描述偏移号INT_TIMER313中断请求是否产生:1—产生;0—没有13INT_TIMER212中断请求是否产生:1—产生;0—没有12INT_TIMER111中断请求是否产生:1—产生;0—没有11INT_TIMER010中断请求是否产生:1—产生;0—没有10INT_WDT9中

断请求是否产生:1—产生;0—没有9INT_TICK8中断请求是否产生:1—产生;0—没有8nBATT_FLT7中断请求是否产生:1—产生;0—没有7第五章汇编语言程序设计及系统初始化保留6—6EINT8_235中断请求是否产生:

1—产生;0—没有5EINT4_74中断请求是否产生:1—产生;0—没有4EINT33中断请求是否产生:1—产生;0—没有3EINT22中断请求是否产生:1—产生;0—没有2EINT11中断请求是否产生:1—产生;0—没有1EINT00中断请求是否产生:1—产生;

0—没有0第五章汇编语言程序设计及系统初始化虽然产生的中断请求可以使SRCPND相应的位置1,用以表示该中断发生了,但是中断是否能得到响应受图5-16中MASK的约束,MASK即为中断屏蔽寄存器INTMSK(地址

为0x4A000008)。其32位的每一位为0表示开启中断,为1表示屏蔽中断,初始化值为0xFFFFFFFF。但是这种约束只能对图5-16中MODE确定为IRQ类型的中断才能起作用,对于MODE确定为FIQ的中断,即快速响应中断,则INTMSK不能屏蔽。这里的MODE即为中断模式寄

存器INTMOD(地址为0x4A000004)。其32位中相应的位设置为1表示该中断源为FIQ中断模式,清为0表示该中断源为IRQ中断,初始值为0x00000000。第五章汇编语言程序设计及系统初始化从图5-16可以看到,I

RQ模式的中断源还要经过Priority优先级仲裁,这里的Priority即为IRQ优先级寄存器PRIORITY(地址为0x4A00000C),初始化值为0x7F,优先级设定内容请参考S3C2410A手册。最后,当某IRQ中断源得到了服务,如图

5-16所示,则INTPND相应的位自动置1。当进入中断服务程序后,该位也需要通过写1清零的方法清位。这里需要注意,INTPND即中断挂起寄存器(地址为0x40000010)不能向原本为0的位写入1!因此写1清零时,要确保写入1的位为1才可以,往往采用读出IN

TPND的值后重新写入读出值的方法。第五章汇编语言程序设计及系统初始化现在,回到表5-6。表5-6序号1定义了中断偏移号寄存器的地址,即INTOFFSET寄存器的地址为0x4A000014,参考附录一的附表1-1。这个寄存器的复位值为0,在

IRQ模式下,如果某个中断产生了,该中断偏移号将保存在INTOFFSET中,例如,表5-7中的EINT4_7产生了,则中断偏移号4写入INTOFFSET中。INTOFFSET是只读寄存器,通过清零INTPND

和SRCPND,INTOFFSET自动清零。第五章汇编语言程序设计及系统初始化表5-6中序号2中的IntVT_SETUP等于1表示设置了中断向量地址,其地址为IntVTAddress,即为0x33FFFF20,这个值最好设定在SDRAM中,对于UP-NETARM2410实验箱

,由于64MB的SDRAM映射在0x30000000~0x33FFFFFF处,又有表5-7,S3C2410A的中断请求源最多占32个字空间,所以,中断向量地址设为0x33FFFF20是合理的。表5-6中序号3对应于2.3节表2-3,且是按地址对应的。由于ARM复位后PC指针自动指向

0x0,因此,0x0处需要存储跳转指令,同时,异常发生后,PC指针会固定地跳到表2-3中相应地址处,因此,那些位置也应存储跳转指令。第五章汇编语言程序设计及系统初始化表5-6中序号4说明,当IntVT_SETUP为1时,则定义32个中断标号,并指定一段程序IRQ_Entry,用于将PC指针跳转

到相应中断的地址(即中断标号处),这一小段程序写得相当出色。表5-6中序号5指定标号并分配空间,序号6中如果IntVT_SETUP为0,则全为死循环,如果IntVT_SETUP为1,则“IRQ_HandlerBIRQ

_Entry”,即IRQ中断将跳至IRQ_Entry标号处执行。第五章汇编语言程序设计及系统初始化读者可能注意到了表5-6中序号3中粗体的注释“;DummyHandlersareimplementedasinfiniteloopswhichcanbemod

ified.”这些注释提示大家死循环形式的中断处理可修改以响应相应的中断,即添加跳转语句到相应的中断服务程序。到此为止,我们已把整个S3C2410A.s全部介绍完了。笔者将在下一小节,即5.3.2小节编写一个初始化文件zyboot.s,替换MDK软件自动生成的启动代码文件S3C2410

A.s。关于中断的进一步学习,请跳到5.4节,在那里,将接着讲述工程ex5_5。第五章汇编语言程序设计及系统初始化5.3.2初始化代码zyboot.s新建工程ex5_6(与工程ex5_3完全相同),然后,从工程中移除S3C2410A.s和initmemcon.s

,添加文件zyboot.s,此时工程ex5_6如图5-17所示。图5-17所示工程ex5_6中只有两个文件,即zyboot.s和ledflash.s。这两个文件的内容罗列如下。第五章汇编语言程序设计及系统初始化图5-17工

程ex5_6的主界面第五章汇编语言程序设计及系统初始化ledflash.s文件代码:1AREALEDLIGHT,CODE,READONLY2EXPORT__main3GPCDAT_ADDREQU0x560000244LED_ONEQU0x00005LED_O

FFEQU0x00E06ENTRY7__main8LDRR0,=GPCDAT_ADDR9MOVR1,#LED_ON10STRR1,[R0];LEDON11第五章汇编语言程序设计及系统初始化12BLDelay1314MOVR1,#LED_OFF15STRR1,[R0];LEDOF

F1617BLDelay1819B__main20Delay21MOVR3,#0x0F000022MOVR4,#0x0F000023subcycle1第五章汇编语言程序设计及系统初始化24SUBR3,R3,#125subcycle226SUBR4

,R4,#127CMPR4,#028BGEsubcycle22930CMPR3,#031BGEsubcycle132BXLR3334END第五章汇编语言程序设计及系统初始化zyboot.s文件的代码是改编S3

C2410A.s得来的,其代码已经全部讲述了,现将完整代码罗列如下:1;BootCode-zyboot.s,ModifiedfromS3C2410A.s2;CopyrightbelongstoMDK,ModifiedPartsbelongtoZY,2

009.334;StandarddefinitionsofModebitsandInterrupt(I&F)flagsinPSRs56Mode_USREQU0x10第五章汇编语言程序设计及系统初始化7Mode_FIQEQU0x118Mo

de_IRQEQU0x129Mode_SVCEQU0x1310Mode_ABTEQU0x1711Mode_UNDEQU0x1B12Mode_SYSEQU0x1F1314I_BitEQU0x80;whenIbitisset,IRQisd

isabled15F_BitEQU0x40;whenFbitisset,FIQisdisabled1617第五章汇编语言程序设计及系统初始化18;StackConfiguration(StackSizesinBytes)1920UND_Stack_SizeEQU

0x0000000021SVC_Stack_SizeEQU0x0000000822ABT_Stack_SizeEQU0x0000000023FIQ_Stack_SizeEQU0x0000000024IRQ_Stack_SizeEQU0x0000008025USR_Stack_SizeEQU0x0

00004002627Stack_SizeEQU(UND_Stack_Size+SVC_Stack_Size+ABT_Stack_Size+\28FIQ_Stack_Size+IRQ_Stack_Si

ze+USR_Stack_Size)第五章汇编语言程序设计及系统初始化2930AREASTACK,NOINIT,READWRITE,ALIGN=331Stack_MemSPACEStack_Size3233Sta

ck_TopEQUStack_Mem+Stack_Size3435;HeapConfiguration3637Heap_SizeEQU0x000000003839AREAHEAP,NOINIT,READ

WRITE,ALIGN=3第五章汇编语言程序设计及系统初始化40Heap_MemSPACEHeap_Size4142;ClockManagementdefinitions43CLK_BASEEQU0x4C000000;ClockBaseAddress44LOCKTIME_OFSEQU0x00

;LOCKTIMEOffset45MPLLCON_OFSEQU0x04;MPLLCONOffset46UPLLCON_OFSEQU0X08;UPLLCONOffset47CLKCON_OFSEQU0x0C;CLKCONOffset48CLKSLOW_OFSEQU0x10;CLKSL

OWOffset49CLKDIVN_OFSEQU0X14;CLDKIVNOffset50CAMDIVN_OFSEQU0X18;CAMDIVNOffset第五章汇编语言程序设计及系统初始化5152;ClockManagement5354CLK_SETU

PEQU155MPLLCON_ValEQU0x0005801156UPLLCON_ValEQU0x0007802357CLKCON_ValEQU0x0007FFF058CLKSLOW_ValEQU0x0000000459LO

CKTIME_ValEQU0x00FFFFFF60CLKDIVN_ValEQU0X0000000361第五章汇编语言程序设计及系统初始化62;Interruptdefinitions63INTOFFSET

EQU0X4A000014;AddressofInterruptoffsetRegister6465;InterruptVectorTable66IntVT_SETUPEQU167IntVTAddressEQU0x33FFFF206869;WatchdogTimer

definitions70WT_BASEEQU0x53000000;WTBaseAddress71WTCON_OFSEQU0x00;WTCONOffset第五章汇编语言程序设计及系统初始化72WTDAT_OFSEQU0x04;WTDATOffset73WTCNT_

OFSEQU0x08;WTCNTOffset7475;WatchdogTimer76WT_SETUPEQU177WTCON_ValEQU0x0000802078WTDAT_ValEQU0x00008000798081;MemoryContr

ollerdefinitions第五章汇编语言程序设计及系统初始化82MC_BASEEQU0x48000000;MemoryControllerBaseAddress8384;//<e>MemoryController85MC_SETUPEQU18687BANKCON0_

ValEQU0x0000070088BANKCON1_ValEQU0x0000070089BANKCON2_ValEQU0x0000070090BANKCON3_ValEQU0x0000070091BANKCON4_ValEQU0x00000700第五章汇编语言程序设计及系

统初始化92BANKCON5_ValEQU0x0000070093BANKCON6_ValEQU0x0001800994BANKCON7_ValEQU0x0001800995BWSCON_ValEQU0x2211111096REFR

ESH_ValEQU0x00AC045997BANKSIZE_ValEQU0x000000B198MRSRB6_ValEQU0x0000002099MRSRB7_ValEQU0x00000020100101102;I/OPortsdefini

tions第五章汇编语言程序设计及系统初始化103PIO_BASEEQU0x56000000;PIOBaseAddress104PCONA_OFSEQU0x00;PCONAOffset105PCONB_OFSEQU0x10;PCONBOff

set106PCONC_OFSEQU0x20;PCONCOffset107PCOND_OFSEQU0x30;PCONDOffset108PCONE_OFSEQU0x40;PCONEOffset109PCONF_

OFSEQU0x50;PCONFOffset110PCONG_OFSEQU0x60;PCONGOffset111PCONH_OFSEQU0x70;PCONHOffset112PCONJ_OFSEQU0

xD0;PCONJOffset第五章汇编语言程序设计及系统初始化113PUPB_OFSEQU0x18;PUPBOffset114PUPC_OFSEQU0x28;PUPCOffset115PUPD_OFSEQU0x38

;PUPDOffset116PUPE_OFSEQU0x48;PUPEOffset117PUPF_OFSEQU0x58;PUPFOffset118PUPG_OFSEQU0x68;PUPGOffset119PUPH_OFSEQU0x78

;PUPHOffset120121;//<e>I/OConfiguration122PIO_SETUPEQU1123第五章汇编语言程序设计及系统初始化124PIOA_SETUPEQU0125PCONA_ValEQU0x000003FF126127PIO

B_SETUPEQU0128PCONB_ValEQU0x000007FF129PUPB_ValEQU0x00000000130131PIOC_SETUPEQU1132PCONC_ValEQU0xAAAA56AA133PUPC_ValEQU0x00000000134第五章汇编语言

程序设计及系统初始化135PIOD_SETUPEQU0136PCOND_ValEQU0x00000000137PUPD_ValEQU0x00000000138139PIOE_SETUPEQU0140PCONE_ValEQU0x000

00000141PUPE_ValEQU0x00000000142143PIOF_SETUPEQU0144PCONF_ValEQU0x0000591A145PUPF_ValEQU0x00000000第五章汇编语言程

序设计及系统初始化146147PIOG_SETUPEQU0148PCONG_ValEQU0x00000000149PUPG_ValEQU0x00000000150151PIOH_SETUPEQU0152PCONH_ValEQU0x000007FF153P

UPH_ValEQU0x00000000154155PRESERVE8156第五章汇编语言程序设计及系统初始化157158;AreaDefinitionandEntryPoint159;StartupCodemustbelinkedfirstatAddressatwhichite

xpectstorun.160161AREARESET,CODE,READONLY162ARM163164165;ExceptionVectors166第五章汇编语言程序设计及系统初始化167VectorsLDRPC,Reset_Addr1

68LDRPC,Undef_Addr169LDRPC,SWI_Addr170LDRPC,PAbt_Addr171LDRPC,DAbt_Addr172NOP;ReservedVector173LDRPC,IRQ_Addr174LDRPC,FIQ_Addr175176177IFIntVT

_SETUP<>0第五章汇编语言程序设计及系统初始化178179;InterruptVectorTableAddress180HandleEINT0EQUIntVTAddress181HandleEINT1E

QUIntVTAddress+4182HandleEINT2EQUIntVTAddress+4*2183HandleEINT3EQUIntVTAddress+4*3184HandleEINT4_7EQUIntVTAddress+4*4185HandleEINT8_23E

QUIntVTAddress+4*5186HandleReservedEQUIntVTAddress+4*6187HandleBATFLTEQUIntVTAddress+4*7第五章汇编语言程序设计及系统初始化188HandleTICKEQUI

ntVTAddress+4*8189HandleWDTEQUIntVTAddress+4*9190HandleTIMER0EQUIntVTAddress+4*10191HandleTIMER1EQUIntVTAddress+4*11192HandleTI

MER2EQUIntVTAddress+4*12193HandleTIMER3EQUIntVTAddress+4*13194HandleTIMER4EQUIntVTAddress+4*14195HandleUART2EQUIntVTAddress+4*15196Handl

eLCDEQUIntVTAddress+4*16197HandleDMA0EQUIntVTAddress+4*17198HandleDMA1EQUIntVTAddress+4*18第五章汇编语言程序设计及系统初始化199HandleDMA2EQUIntVTAddre

ss+4*19200HandleDMA3EQUIntVTAddress+4*20201HandleMMCEQUIntVTAddress+4*21202HandleSPI0EQUIntVTAddress+4*22203HandleUART1EQ

UIntVTAddress+4*23204;HandleReservedEQUIntVTAddress+4*24205HandleUSBDEQUIntVTAddress+4*25206HandleUSBHEQUIntVTAddress+4*26207HandleIICEQUIntVTAddre

ss+4*27208HandleUART0EQUIntVTAddress+4*28第五章汇编语言程序设计及系统初始化209HandleSPI1EQUIntVTAddress+4*39210HandleRTCEQUIntVTAddress+4*30211HandleADCEQUIntVTAdd

ress+4*31212213IRQ_Entry214subsp,sp,#4;reservedforPC215stmfdsp!,{r8-r9}216217ldrr9,=INTOFFSET218ldrr9,[r9]219ldrr8,=HandleEINT0第五章汇编语言程序设计及系统初始化220ad

dr8,r8,r9,lsl#2221ldrr8,[r8]222strr8,[sp,#8]223ldmfdsp!,{r8-r9,pc}224225ENDIF226227Reset_AddrDCDReset_Handler228Undef_AddrDCDUn

def_Handler229SWI_AddrDCDSWI_Handler第五章汇编语言程序设计及系统初始化230PAbt_AddrDCDPAbt_Handler231DAbt_AddrDCDDAbt_Handle

r232DCD0;ReservedAddress233IRQ_AddrDCDIRQ_Handler234FIQ_AddrDCDFIQ_Handler235236Undef_HandlerBUndef_Handler237SWI_HandlerBSWI_Handler238PAbt_

HandlerBPAbt_Handler239DAbt_HandlerBDAbt_Handler第五章汇编语言程序设计及系统初始化240241IFIntVT_SETUP<>1242IRQ_HandlerBIRQ_Hand

ler243ENDIF244245IFIntVT_SETUP<>0246IRQ_HandlerBIRQ_Entry247ENDIF248249FIQ_HandlerBFIQ_Handler250第五章汇编语言程

序设计及系统初始化251;MemoryControllerConfiguration252IFMC_SETUP<>0253MC_CFG254DCDBWSCON_Val255DCDBANKCON0_Val256DCDBANKCON1_Val257DCDBANKCON2_Val258DCDBANK

CON3_Val259DCDBANKCON4_Val260DCDBANKCON5_Val261DCDBANKCON6_Val第五章汇编语言程序设计及系统初始化262DCDBANKCON7_Val263DCDREFRES

H_Val264DCDBANKSIZE_Val265DCDMRSRB6_Val266DCDMRSRB7_Val267ENDIF268269;ClockManagementConfiguration270IFCLK_SETUP<>0271CLK_C

FG272DCDLOCKTIME_Val第五章汇编语言程序设计及系统初始化273DCDCLKDIVN_Val274DCDMPLLCON_Val275DCDUPLLCON_Val276DCDCLKSLO

W_Val277DCDCLKCON_Val278ENDIF279280;I/OConfiguration281IFPIO_SETUP<>0282PIOA_CFG283DCDPCONA_Val第五章汇编语言程序设计及系统初始化284PIOB_CFGDCDPCONB_Val285DCDPUPB_Val

286PIOC_CFGDCDPCONC_Val287DCDPUPC_Val288PIOD_CFGDCDPCOND_Val289DCDPUPD_Val290PIOE_CFGDCDPCONE_Val291DCDPUPE_Val292PIOF_CFGDCDPC

ONF_Val293DCDPUPF_Val294PIOG_CFGDCDPCONG_Val第五章汇编语言程序设计及系统初始化295DCDPUPG_Val296PIOH_CFGDCDPCONH_Val297DCDPUPH_Val298ENDIF299300;R

esetHandler301EXPORTReset_Handler302Reset_Handler303304IFWT_SETUP<>0305LDRR0,=WT_BASE第五章汇编语言程序设计及系统初始化306LDRR1,=WTCON_Val307LDRR2,=WTD

AT_Val308STRR2,[R0,#WTCNT_OFS]309STRR2,[R0,#WTDAT_OFS]310STRR1,[R0,#WTCON_OFS]311ENDIF312313314IFCLK_SETUP<>0315LDRR0,=CL

K_BASE316ADRR8,CLK_CFG第五章汇编语言程序设计及系统初始化317LDMIAR8,{R1-R6}318STRR1,[R0,#LOCKTIME_OFS]319STRR2,[R0,#CLKDIVN_OFS]320STRR3,[R0,#MPLLCON_OFS]32

1STRR4,[R0,#UPLLCON_OFS]322STRR5,[R0,#CLKSLOW_OFS]323STRR6,[R0,#CLKCON_OFS]324ENDIF325326327IFMC_SETUP<>0;ZY第五章汇编语言程序设计及系统初始化328ADRR8,MC_CFG329LDRR

9,=MC_BASE330LDMIAR8!,{R0-R7}331STMIAR9!,{R0-R7}332LDMIAR8,{R0-R4}333STMIAR9,{R0-R4}334ENDIF335336IFPIO_SETUP<>0337LDRR14,=

PIO_BASE第五章汇编语言程序设计及系统初始化338339IFPIOA_SETUP<>0340ADRR0,PIOA_CFG341LDRR2,[R0];AddedbyZY342STRR2,[R14,#PCONA_OFS];ChangedbyZY343ENDIF344345IFPIO

B_SETUP<>0346ADRR0,PIOB_CFG347LDRR2,[R0];AddedbyZY348LDRR1,[R0,#4]第五章汇编语言程序设计及系统初始化349STRR2,[R14,#PCONB_OFS];ChangedbyZY35

0STRR1,[R14,#PUPB_OFS]351ENDIF352353IFPIOC_SETUP<>0354ADRR0,PIOC_CFG355LDRR2,[R0];AddedbyZY356LDRR1,[R0,#4]357STRR2,[R14,

#PCONC_OFS];ChangedbyZY358STRR1,[R14,#PUPC_OFS]第五章汇编语言程序设计及系统初始化359ENDIF360361IFPIOD_SETUP<>0362ADRR0,PIOD_CFG363LDR

R2,[R0];AddedbyZY364LDRR1,[R0,#4]365STRR2,[R14,#PCOND_OFS];ChangedbyZY366STRR1,[R14,#PUPD_OFS]367ENDIF368369IFPIOE_SETUP

<>0第五章汇编语言程序设计及系统初始化370ADRR0,PIOE_CFG371LDRR2,[R0];AddedbyZY372LDRR1,[R0,#4]373STRR2,[R14,#PCONE_OFS];ChangedbyZY374STRR1,[R14,#PUPE_OFS]3

75ENDIF376377IFPIOF_SETUP<>0378ADRR0,PIOF_CFG379LDRR2,[R0];AddedbyZY第五章汇编语言程序设计及系统初始化380STRR2,[R14,#PCONF_OFS];ChangedbyZ

Y382STRR1,[R14,#PUPF_OFS]383ENDIF384385IFPIOG_SETUP<>0386ADRR0,PIOG_CFG387LDRR2,[R0];AddedbyZY388LDRR1,[R0,#4]389STRR2,[R14,#PCONG_OFS];Chan

gedbyZY390STRR1,[R14,#PUPG_OFS]第五章汇编语言程序设计及系统初始化391ENDIF392393IFPIOH_SETUP<>0394ADRR0,PIOH_CFG395LDRR2,[R0];AddedbyZY396LD

RR1,[R0,#4]397STRR2,[R14,#PCONH_OFS];ChangedbyZY398STRR1,[R14,#PUPH_OFS]399ENDIF400401ENDIF第五章汇编语言程序设计及系统初始化402403;SetupStackforeachmode404LDR

R0,=Stack_Top405406;EnterUndefinedInstructionModeandsetitsStackPointer407MSRCPSR_c,#Mode_UND:OR:I_Bit:OR:F_Bit408MOVSP,R0409SUBR0,R

0,#UND_Stack_Size410411;EnterAbortModeandsetitsStackPointer第五章汇编语言程序设计及系统初始化412MSRCPSR_c,#Mode_ABT:OR:I_Bit:OR:F_Bit413MOVSP

,R0414SUBR0,R0,#ABT_Stack_Size415416;EnterFIQModeandsetitsStackPointer417MSRCPSR_c,#Mode_FIQ:OR:I_Bit:OR:F_Bit418MOVSP,R0419SUBR0,R0,#FIQ_Stac

k_Size420421;EnterIRQModeandsetitsStackPointer第五章汇编语言程序设计及系统初始化422MSRCPSR_c,#Mode_IRQ:OR:I_Bit:OR:F_Bit423MOVSP,R0424SU

BR0,R0,#IRQ_Stack_Size425426;EnterSupervisorModeandsetitsStackPointer427MSRCPSR_c,#Mode_SVC:OR:I_Bit:OR:F_Bit428MOVSP,R0429SUBR0,R0,#SVC_Stack_S

ize430431;EnterUserModeandsetitsStackPointer第五章汇编语言程序设计及系统初始化432MSRCPSR_c,#Mode_USR433MOVSP,R0434SUBSL,SP,#USR_Stack_Size435436;Ente

rtheCcode437438IMPORT__main439LDRR0,=__main440BXR0441442END443第五章汇编语言程序设计及系统初始化工程ex5_6的功能与工程ex5_3完全相同,实现三个LED灯的闪烁。系统初始化代码zyboot.s本质上仍然是S3C2410A.s,然而

,在学习zyboot.s的基础上,进一步编写出完全属于自己知识产权的初始化代码将是件很容易的事。第五章汇编语言程序设计及系统初始化5.4中断服务程序本节承前面5.3.1小节3.中未完成的工程ex5_5,介绍IRQ中断响应处理方法程序

设计,在第六章中还将针对IRQ写一个C语言的版本。此外,本节的第5.4.3小节将简单地介绍一下软件中断SWI的处理方法。第五章汇编语言程序设计及系统初始化5.4.1硬件基础观察UP-NETARM2410实验箱,可在其右下角找到一个标记了“INTKEY”的按键,该按键按

下将触发EINT5中断,其原理图如图5-18所示。图上右侧U101C为S3C2410A芯片的部分原理图,在U101C左侧标注了KEY的地方,即M14脚为EINT5接入脚。但是,笔者这款UP-NETARM24

10实验箱上的EINT5工作不正常,同时,笔者在设计中发现EINT2即M16脚上总在不断地产生中断信号,因此,本节的程序采用了EINT2。如果读者的UP-NETARM2410实验箱上的EINT5工作正常,只需对5.4.2小节的程序作少许变动即可。第五章汇编语言程序设计及

系统初始化图5-18EINT5中断第五章汇编语言程序设计及系统初始化5.4.2EINT2外部中断及其程序设计在工程ex5-5中,修改S3C2410A.s的配置向导,如图5-19所示。在图5-19中,至少修改

PF2脚的功能为中断EINT2。然后,在S3C2410A.s文件中的第0942行后添加代码:EXPORTIntVTAddressEXPORTMode_USR此时的工程ex5_5如图5-20所示。第五章汇编语言程序设计及系统初始化图5-19设置端口F为中断响应口

第五章汇编语言程序设计及系统初始化图5-20工程ex5_5的工作界面第五章汇编语言程序设计及系统初始化工程ex5_5中的文件ledflash.s的代码如下:1AREALEDLIGHT,CODE,READONLY2

EXPORT__main3EXPORT__use_two_region_memory4IMPORTIntVTAddress5IMPORTMode_USR6GPCDAT_ADDREQU0x560000247LED

_MASKEQU0x0060;GPC5andGPC68LED3_MASKEQU0x00809第五章汇编语言程序设计及系统初始化10SRCPNDEQU0x4A000000;Interruptcontroller11INTMODEQU0x4A00000412INTMSKEQU

0x4A00000813PRIORITYEQU0x4A00000C14INTPNDEQU0x4A00001015INTOFFSETEQU0x4A00001416ENTRY1718__main19;movejumpinstructionaddrto0x33FFFF2020ADRR0,

ex_int第五章汇编语言程序设计及系统初始化21LDRR1,=IntVTAddress22MOVR2,#3223int_addr24STMIAR1!,{R0}25ADDR0,R0,#0x426SUBR2,R2,#127CMPR2

,#028BGTint_addr293031;initandopenEINT2,controlGPC7LED第五章汇编语言程序设计及系统初始化32LDRR0,=SRCPND33MOVR1,#0x034STRR1,[R0,#0x4]35MVNR1,#

0x0436STRR1,[R0,#0x8]37MOVR1,#0x7F38STRR1,[R0,#0xC]394041ledflash42LDRR0,=GPCDAT_ADDR第五章汇编语言程序设计及系统初始化43MOVR1,#0x044EORR1,R1,#LED_M

ASK45STRR1,[R0];LEDOFF4647BLDelay4849MOVR1,#0x6050EORR1,R1,#LED_MASK51STRR1,[R0];LEDON5253BLDelay第五章汇编语言程序设计及系统初始化5455Bledflash56Delay57MOVR3,#0x0

F000058MOVR4,#0x0F000059subcycle160SUBR3,R3,#161subcycle262SUBR4,R4,#163CMPR4,#064BGEsubcycle2第五章汇编语言程序设计及系统初始化6566CMPR3,#067BGEsubcycle168BX

LR697071;intteruptentrytable72ex_int73Bint0_isr74Bint1_isr75Bint2_isr第五章汇编语言程序设计及系统初始化76Bint3_isr77Bint4_7_isr78Bint8_23_isr79NOP80BBATFIL_isr81

BTICK_isr82BWDT_isr83BTIMER0_isr84BTIMER1_isr85BTIMER2_isr86BTIMER3_isr第五章汇编语言程序设计及系统初始化87BTIMER4_isr88BUART2_isr89BLCD_isr90BD

MA0_isr91BDMA1_isr92BDMA2_isr93BDMA3_isr94BMMC_isr95BSPIO_isr96BUART1_isr97NOP第五章汇编语言程序设计及系统初始化98BUSBD_isr99BUSBH_isr100BIIC_isr101BUART0_

isr102BSPI1_isr103BRTC_isr104BADC_isr105;intteruptservice106int0_isr107int1_isr108int3_isr第五章汇编语言程序设计及系统初始化109int4_7_isr

110int8_23_isr111BATFIL_isr112TICK_isr113WDT_isr114TIMER0_isr115TIMER1_isr116TIMER2_isr117TIMER3_isr118TIMER4_isr119UART2_isr第五章汇编语言程序设计及系统初始化120L

CD_isr121DMA0_isr122DMA1_isr123DMA2_isr124DMA3_isr125MMC_isr126SPIO_isr127UART1_isr128USBD_isr129USBH_isr130IIC_isr第五章汇编语言程序设计及系统初始化131UART0_

isr132SPI1_isr133RTC_isr134ADC_isr135NOP136;int2service137int2_isr138;SUBR14,R14,#4139;STMFDSP!,{R0-R8,R14};saveenv140STMFDSP!,{R0-R1

}141第五章汇编语言程序设计及系统初始化142LDRR0,=SRCPND143MOVR1,#0x40144STRR1,[R0];clearSRCPND145146LDRR1,[R0,#0x10]147STRR1,[R0,#0x10];clearINTP

ND148149;int2-LED3ONofOFF150LDRR0,=GPCDAT_ADDR151MOVR1,#0x0152EORR1,R1,#LED3_MASK第五章汇编语言程序设计及系统初始化153STRR1,[R0];LEDOFF154155BLDelay156157MOVR1,#0x80

158EORR1,R1,#LED3_MASK159STRR1,[R0];LEDON160161BLDelay162第五章汇编语言程序设计及系统初始化163;openIRQ164MSRCPSR_c,#Mode_USR165166;LDMFDSP!,{R0-R8,PC}^;recov

erenv167LDMFDSP!,{R0-R1}168Bledflash169;endofint4_7170__use_two_region_memory;nowarning171172END第五章汇编语言程序设计及系统初始化工程ex5_5执行的功能为:由于EINT2不断触发

(原因不明,需要查找硬件问题,如果读者的EINT5有效,则屏蔽掉EINT2即可),在该中断服务程序中设置了LED3闪烁,因此,程序运行时,可以看到LED3不断闪烁。ledflash.s中的下列代码:__main;movejumpinstructionaddrto0x33FFF

F20ADRR0,ex_intLDRR1,=IntVTAddressMOVR2,#32第五章汇编语言程序设计及系统初始化int_addrSTMIAR1!,{R0}ADDR0,R0,#0x4SUBR2,R2,#1CMPR2,#0BGTint_a

ddr为将S3C2410的32个中断入口地址拷贝到0x33FFFF20地址开始处。而下面的代码:;initandopenEINT2,controlGPC7LEDLDRR0,=SRCPNDMOVR1,#0x0第五章汇编语言程序设计及系统初始化STR

R1,[R0,#0x4]MVNR1,#0x04STRR1,[R0,#0x8]MOVR1,#0x7FSTRR1,[R0,#0xC]为使能EINT2中断。下面的代码:;int2serviceint2_isr;SUBR14,R14,#4;STMFDSP!,{R0-R8,R14};save

envSTMFDSP!,{R0-R1}第五章汇编语言程序设计及系统初始化LDRR0,=SRCPNDMOVR1,#0x40STRR1,[R0];clearSRCPNDLDRR1,[R0,#0x10]STRR1,[R0,#0x10];clearINTPND;int2-LED3ONofOFFLDRR

0,=GPCDAT_ADDRMOVR1,#0x0EORR1,R1,#LED3_MASKSTRR1,[R0];LEDOFFBLDelayMOVR1,#0x80第五章汇编语言程序设计及系统初始化EORR1,R1,#LED3_MASKSTRR1,[R0];LE

DONBLDelay;openIRQMSRCPSR_c,#Mode_USR;LDMFDSP!,{R0-R8,PC}^;recoverenvLDMFDSP!,{R0-R1}Bledflash为EINT2的中断服务程序,使LED3灯闪烁。第五章汇编语言程

序设计及系统初始化5.4.3SWI中断及其注意事项SWI中断是指令SWI触发的,常用于把用户工作模式切换到管理模式。其应用最简单,可参考3.4.8小节。SWI指令强制PC指向0x08地址处,可在该地址放置跳转指令,跳到SWI中断服务程序处,同时,SWI后面可跟24位的立即数(如果忽

略这个立即数,则使用R0值作为立即数),这个立即数可用作分支条件。第五章汇编语言程序设计及系统初始化因此,软件中断语句的典型用法为:(1)SWI0x123(2)MOVR0,#0x123SWI限于篇幅,并且由于SWI程序设计十分简单,所以这里不再

作详细说明。第五章汇编语言程序设计及系统初始化本章小结本章详细地介绍了系统初始化文件及其汇编语言程序设计,并介绍了中断程序设计方法。到此,本书的第一部分“ARM原理”的内容就讲述完了。值得一提的是,PeterKnaggs和StephenWelsh合编的“ARM:AssemblyLanguag

eProgramming”资料是学习汇编语言程序设计的好助手。本章第5.2节中关于浮点数处理的定标方法程序设计,重在讲述汇编语法,在ARM中处理浮点数应使用IEEE-754标准(参见第六章的6.4.2小节的4.)!第六、七章将阐述本书的第

二部分内容“C程序设计”,仍将借助UP-NETARM2410实验箱和MDK软件包,并且使用启动代码文件S3C2410A.s初始化系统。

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?