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

上传人:飞*** 文档编号:56563303 上传时间:2018-10-13 格式:PPT 页数:209 大小:2.43MB
返回 下载 相关 举报
arm原理与c程序设计 第五章_第1页
第1页 / 共209页
arm原理与c程序设计 第五章_第2页
第2页 / 共209页
arm原理与c程序设计 第五章_第3页
第3页 / 共209页
arm原理与c程序设计 第五章_第4页
第4页 / 共209页
arm原理与c程序设计 第五章_第5页
第5页 / 共209页
点击查看更多>>
资源描述

《arm原理与c程序设计 第五章》由会员分享,可在线阅读,更多相关《arm原理与c程序设计 第五章(209页珍藏版)》请在金锄头文库上搜索。

1、第五章 汇编语言程序设计及 系统初分别化,5.1 ARM汇编语言程序框架 5.2 浮点数据处理 5.3 系统初始化 5.4 中断服务程序 本章小结,5.1 ARM汇编语言程序框架 在MDK环境下,新建一个工程ex5_1,拷贝工程ex4_3中的文件S3C2410A.s和initmemcon.s,然后,编写一个新的汇编语言程序ledflash.s,其代码如下: 1 AREA LEDLIGHT, CODE, READONLY 2 EXPORT _main ; LedFlash 3 EXPORT _use_two_region_memory 4 GPCDAT_ADDR EQU 0x56000024 5

2、 LED_ON EQU 0x0000 6 LED_OFF EQU 0x00E0,7 ENTRY 8 ; LedFlash 9 _main 10 LDR R0, =GPCDAT_ADDR 11 MOV R1, #LED_ON 12 STR R1, R0 ; LED ON 13 14 BL Delay 15 16 MOV R1, #LED_OFF 17 STR R1, R0 ; LED OFF,18 19 BL Delay 20 21 B _main 22 Delay 23 MOV R3, #0x0F0000 24 MOV R4, #0x0F0000 25 subcycle1 26 SUB R3,

3、 R3, #1 27 subcycle2 28 SUB R4, R4, #1,29 CMP R4, #0 30 BGE subcycle2 31 32 CMP R3, #0 33 BGE subcycle1 34 BX LR 35 36 _use_two_region_memory ; no warning 37 END 将ledflash.s添加到工程ex5_1中,当前工作主窗口如图5-1所示。先不要编译连接这个工程文件,在5.1.2小节时才能正确地编译连接并执行该工程。,图5-1 工程ex5_1工作界面,5.1.1 通用输入输出C口配置 在图5-1中,双击S3C2410A.s打开它,保持其

4、他设置不变(相对于工程ex4_3)的情况下,对I/O Configuration进行配置,如图5-2所示。 图5-2中将PC5、PC6和PC7配置为输出特性(Output),对应于S3C2410A.s的第06060608行代码如下: PIOC_SETUP EQU 1 PCONC_Val EQU 0xAAAA56AA PUPC_Val EQU 0x00000000,图5-2 通用I/O口配置,PIOC_SETUP为1表示图5-2中的Port C被勾选;当设置PC0PC15如图5-2时,端口C的控制寄存器的值为0xAAAA56AA;端口C所有上拉电阻都是使能的,端口C上拉控制寄存器的值为0x000

5、00000。 图5-2中的I/O Configuration勾选,对应于S3C2410A.s中的第0510行代码如下: PIO_SETUP EQU 1 如图5-2设置好之后,下面罗列出启动代码文件S3C2410A.s中与通用I/O口配置相关的代码,如表5-1所示。,表5-1 S3C2410A.s中与I/O口配置相关的代码,S3C2410A.s中的第09811038行原始代码如下: IF PIO_SETUP 0 LDR R14, =PIO_BASE IF PIOA_SETUP 0 ADR R0, PIOA_CFG STR R0, R14, #PCONA_OFS ENDIF IF PIOB_SET

6、UP 0 ADR R0, PIOB_CFG,LDR R1, R0,#4 STR R0, R14, #PCONB_OFS STR R1, R14, #PUPB_OFS ENDIF IF PIOC_SETUP 0 ADR R0, PIOC_CFG LDR R1, R0,#4 STR R0, R14, #PCONC_OFS STR R1, R14, #PUPC_OFS ENDIF,IF PIOD_SETUP 0 ADR R0, PIOD_CFG LDR R1, R0,#4 STR R0, R14, #PCOND_OFS STR R1, R14, #PUPD_OFS ENDIF IF PIOE_SET

7、UP 0 ADR R0, PIOE_CFG LDR R1, R0,#4 STR R0, R14, #PCONE_OFS STR R1, R14, #PUPE_OFS ENDIF,IF PIOF_SETUP 0 ADR R0, PIOF_CFG LDR R1, R0,#4 STR R0, R14, #PCONF_OFS STR R1, R14, #PUPF_OFS ENDIF IF PIOG_SETUP 0 ADR R0, PIOG_CFG LDR R1, R0,#4 STR R0, R14, #PCONG_OFS STR R1, R14, #PUPG_OFS ENDIF,IF PIOH_SET

8、UP 0 ADR R0, PIOH_CFG LDR R1, R0,#4 STR R0, R14, #PCONH_OFS STR R1, R14, #PUPH_OFS ENDIF ENDIF 修正后的代码如下,其中,添加了注释的为补充和修正的代码行: IF PIO_SETUP 0 LDR R14, =PIO_BASE,IF PIOA_SETUP 0 ADR R0, PIOA_CFG LDR R2, R0; Added by ZY STR R2, R14, #PCONA_OFS; Changed by ZY ENDIF IF PIOB_SETUP 0 ADR R0, PIOB_CFG LDR R2

9、, R0; Added by ZY LDR R1, R0,#4 STR R2, R14, #PCONB_OFS ; Changed by ZY STR R1, R14, #PUPB_OFS ENDIF,IF PIOC_SETUP 0 ADR R0, PIOC_CFG LDR R2, R0; Added by ZY LDR R1, R0,#4 STR R2, R14, #PCONC_OFS ; R0,R14, #PCONC_OFS Changed by ZY STR R1, R14, #PUPC_OFS ENDIF,IF PIOD_SETUP 0 ADR R0, PIOD_CFG LDR R2,

10、 R0 ; Added by ZY LDR R1, R0,#4 STR R2, R14, #PCOND_OFS ; Changed by ZY STR R1, R14, #PUPD_OFS ENDIF,IF PIOE_SETUP 0 ADR R0, PIOE_CFG LDR R2, R0; Added by ZY LDR R1, R0,#4 STR R2, R14, #PCONE_OFS ; Changed by ZY STR R1, R14, #PUPE_OFS ENDIF,IF PIOF_SETUP 0 ADR R0, PIOF_CFG LDR R2, R0 ; Added by ZY L

11、DR R1, R0,#4 STR R2, R14, #PCONF_OFS ; Changed by ZY STR R1, R14, #PUPF_OFS ENDIF,IF PIOG_SETUP 0 ADR R0, PIOG_CFG LDR R2, R0 ; Added by ZY LDR R1, R0,#4 STR R2, R14, #PCONG_OFS ; Changed by ZY STR R1, R14, #PUPG_OFS ENDIF,IF PIOH_SETUP 0 ADR R0, PIOH_CFG LDR R2, R0 ; Added by ZY LDR R1, R0,#4 STR R

12、2, R14, #PCONH_OFS ; Changed by ZY STR R1, R14, #PUPH_OFS ENDIF ENDIF,MDK软件虽然是个极其优秀的软件包,但是,此处的错误是很明显的,由于具有8个IO口,相同的错误连续出现了8次以上。例如对于C口,代码如下: IF PIOC_SETUP 0 ADR R0, PIOC_CFG LDR R1, R0,#4 STR R0, R14, #PCONC_OFS STR R1, R14, #PUPC_OFS ENDIF,结合第二章,可知条件满足,执行完ADR指令后,R0装入的是PIOC_CFG的标号,即一个地址,这个地址内的值为配置字,但

13、是这个地址本身不能作为配置字,所以,后面的“STR R0, R14, #PCONC_OFS”语句就是完全错误的了。改正的方法很简单,代码如下: IF PIOC_SETUP 0 ADR R0, PIOC_CFG LDR R2, R0 ; Added by ZY LDR R1, R0,#4 STR R2, R14, #PCONC_OFS ; R0,R14, #PCONC_OFS Changed by ZY STR R1, R14, #PUPC_OFS ENDIF,像上述代码一样,将R0值指向的地址处的值赋给R2,然后,再使用“STR R2, R14, #PCONC_OFS”就可以了。对于一个商业软件,其评估版的S3C2410芯片启动代码出现问题,一方面说明了这部分代码没有经过严格测试,另一方面也警告我们,汇编语言编程相对于C语言来说,确有一些劣势。 下面解释一下表5.1和启动代码中关于IO口配置的方法。 序号219:定义了IO口存储器映射寄存器的基地址0x56000000,然后定义了AH口的偏移地址,这些IO口寄存器的地址可参考附表1-1。例如,C口的控制寄存器地址为0x56000020,相当于基址0x56000000 + 偏移地址PCONC_OFS(0x20)。这里没有J口,可以删除。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 质量控制/管理

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号