周立功ARM调试心得
arm 嵌入式系统基础教程 - 广州周立功单片机发展有限公司

ARM嵌入式系统基础教程周立功等编著北京航空航天大学出版社2005年1月定价:32.00元内容简介本书是《ARM嵌入式系统系列教程》中的理论课教材。
以PHILIPS公司LPC2000系列ARM微控制器为例,深入浅出地介绍嵌入式系统开发的各个方面。
全书共分为3部分:第1章和第2章为理论部分,主要介绍嵌入式系统的概念及开发方法。
第3~5章为基础部分,主要介绍ARM7体系结构、指令系统及LPC2000系列ARM微控制器的结构原理。
第6~8章为应用部分,主要以LPC2000系列微控制器为例介绍如何设计嵌入式系统,包括硬件的设计、μC/OSII的移植以及建立软件开发平台的方法。
本书可以作为高等院校电子、自动化、机电一体化计算机等相关专业嵌入式系统课程的教材,也可作为从事嵌入式系统应用开发工程师的参考资料。
本书配套多媒体教学课件。
序1. ARM嵌入式系统的发展趋势由于网络与通信技术的发展,嵌入式系统在经历了近20年的发展历程后,又进入了一个新的历史发展阶段,即从普遍的低端应用进入到一个高、低端并行发展,并且不断提升低端应用技术水平的时代,其标志是近年来32位MCU的发展。
32位MCU的应用不会走8位机百花齐放、百余种型号系列齐上阵的道路,这是因为在8位机的低端应用中,嵌入对象与对象专业领域十分广泛而复杂;而当前32位MCU的高端应用则多集中在网络、通信和多媒体技术领域,32位MCU将会集中在少数厂家发展的少数型号系列上。
在嵌入式系统高端应用的发展中,曾经有众多的厂家参与,很早就有许多8位嵌入式MCU厂家实施了8位、16位和32位机的发展计划。
后来,8位和32位机的技术扩展侵占了16位机的发展空间。
传统电子系统智能化对8位机的需求使这些厂家将主要精力放在8位机的发展上,形成了32位机发展迟迟不前的局面。
当网络、通信和多媒体信息家电业兴起后,出现了嵌入式系统高端应用的市场;而在嵌入式系统的高端应用中,进行多年技术准备的ARM公司适时地推出了32位ARM系列嵌入式微处理器,以其明显的性能优势和知识产权平台扇出的运行方式,迅速形成32位机高端应用的主流地位,以至于使不少传统嵌入式系统厂家放弃了自己的32位发展计划,转而使用ARM内核来发展自己的32位MCU。
关于大三找实习的经历分享(周立功公司)

关于周立功2013夏令营的面试经历今天收到了周立功名下的致远电子的实习通过邀请通知,心情久久不能平静,回想从投简历到终面,还真是一个漫长的时间。
现在回想起来,发现这个找实习的道路还真是非常艰难。
我报的是模拟电路开发工程师这个岗位,网申之后就去听周立功的宣讲会,地点是在广工,刚开始对周立功这家公司没什么感觉,感觉像是在做单片机似的,不过我还是去听了他的宣讲会,听了之后才发现这家公司不全是做销售的,他名下的致远电子有限公司专门搞高端仪器研发,听HR说这次名是招实习,实际是将2014招聘提前招了。
感觉现在就业好严峻。
当天听完宣讲会,了解了一下相关的企业文化等等,这天就这样过去了。
具体网申是否通过,要明天等通知。
第二天(4月27日)中午2点33分,收到了周立功公司发送的短信,说我通过了网筛,并当天晚上18:30分去参加笔试,我报的是模拟电路开发工程师,所以我要考的内容是模电+数电。
因为那时候我还不在状态,收到短信通知的时候我还在学英语,突然收到要晚上考试,感觉准备是来不及了。
所以我就没特意去复习相关的书籍,只是顺它自然。
晚上我和舍友准时到达考场,笔试的内容挺多的,模拟部分考得最多的就是一些关于电容、电感的基础问题,感觉挺简单,数方面考数制运算、求补和一些基本的时序电路,这部分靠平时积累,考试的时候半推导,半回忆地完成了,最后还有4道大题,第一道大题是关于晶体管的,第二道是要C语言写一个带有优先级的译码模块,第三道是关于一个移位寄存器的题,最后一道是单片机和LED结合的题。
感觉最后的大题如果做过实验的,都可以做出大部分了。
做完之后我感觉一般,就这样回去等通知了。
HR说如果通过,会在第二天3点前发通知。
第三天(4月28日),这天早上有课,我就没多大心思查看手机的信息了,下午3点,还是没收到通知,我估计是没戏了,毕竟做完题目之后没感觉,所以下午就和班里同学一起去打球了,打完球后,我打开手机,却发现有3条未读信息,我估计有希望了。
周立功谈我的25年嵌入式生涯

有些理念,很值得工程师们思考!
周立功,男,1964年3月出生,毕业于东华大学自动化及计算机系,高级工程师,中国单片机学会理事,中国海洋大学讲座教授,硕士生导师,主要研究方向为嵌入式系统与现场总线,目前正在从事80C51、ARM与Nios II等软核SoC的研究与开发。
下面我会把我“第一桶金”的故事告诉你,这也是尽量减少“阶段0”开发一个非常典型的例子。
当年,《羊城晚报》几乎每天都有半版广告刊登信息台(听歌、悄悄话等)广告,一打听广告费每天几十万。当时相信不少人在利用公费电话在拨打这些信息台。后来我送货到客户那里发现电话机都外加了一个铁壳并上了一把锁,从看到那一幕开始,我决定做电话加密码锁,锁长途电话0字头,手机、BB机、信息台的9字头。通过朋友介绍,福州某公司有这个技术,于是我打了一个试探性的电话,使用5000元购买方案和源代码,对方非常爽快地同意了。我生怕有变立即坐飞机到福州去,很快就见到了郑新建工程师,他原来在福州某公司工作,我见到他的时候已经离开了福州某公司,但仍然自己写一些产品解决方案,通过福州某公司销售。买到方案与源代码之后,我立即带样机到各地去做测试,发现这台样机兼容性太差,而且市场已经开始在卖的产品也存在同样的问题,我想只要解决好兼容性的问题,如果在任何地区交换机局域网都能够使用,那就是最好的产品不愁没有市场。
也许有程序员会关心JTAG开发工具问题,那也是一个“外包”的项目。当时,我们在网上发现了一个由计算机爱好者业余时间设计的H-JTAG,这是一个比较稳定的调试器软件,正好适合我们使用。于是我就同设计者联系,并决定由周立功单片机资助他继续开发,同时,其开发成果还免费提供给网上的用户下载,保证它作为一个自由软件。其实,无论是Linux还是H-JTAG都是开源软件,如果担心其它的同行因此受益而超越自己的话,难免需要在公司负担很多开发人员,面面俱到地做许多事实上是重复的开发工作。其实,我们的合作伙伴都是所在领域的专家,如果自己从头到尾去学习和开发,不仅抢了合作伙伴的饭碗,而且结果未必理想。这种情况下不但会延误宝贵的商机,而且还会影响与合作伙伴之间的关系。其实只要引入我们企业长期积累和制定的嵌入式系统工程管理思想和规范,即可得到自己想要的结果:“做你最擅长的,其余的外包”,类似这样的案例在周立功单片机将会越来越多。
周立功 LPC2000系列ARM微控制器应用开发教程说明书

个人电脑已经是64位了,您还在使用8位微控制器吗?尽管一般情况下嵌入式系统对CPU处理能力的要求比个人电脑(对CPU处理能力的要求)低,但随着人们生活的提高和技术的进步,嵌入式系统对CPU处理能力的要求也稳步的提高,大量高速的与MCS51体系结构兼容的微控制器的出现就证明了这一点。
但8位微控制器受限于体系结构,处理能力的提高始终有限。
而16位系统在性能上与8位机相比始终没有太大优势,成本上与32位系统相比也没有什么优势,未来一段时间嵌入式微控制器的发展方向必然是32位系统。
基于ARM体系结构的32位系统占领了32位嵌入式系统的大部分分额,但长期以来,基于ARM体系结构的32位系统仅在嵌入式式系统的高端(通讯领域、PDA)等场合使用,要么以专用芯片的面貌出现,要么以位处理器的庙貌出现,并没有出现性价比高的通用的微控制器。
PHILIPS发现了这个空当,推出了性价比很高LPC2000系列微控制器,让更多的嵌入式系统具有32位的处理能力。
这也预示着32位系统即将成为嵌入式系统的主流。
基于ARM体系结构的芯片在中国推广已经有好几年了,关于ARM的图书也出了不少。
关于ARM的图书主要有以下几类:1.关于ARM内核的图书,主要读者是芯片设计者,内容主要是介绍芯片设计的。
2.芯片应用类图书,主要是芯片的生产商或代理商编写,主要读者为应用工程师。
3.开发板类图书,主要介绍相应的ARM开发板,给应用者一些参考。
以上3类图书的侧重点都不是ARM应用开发教学,用于大学本科教学不太适合。
为了方便高等院校教学方便,笔者编写了这本教材。
不过,因为嵌入式系统牵涉的知识太广,一本教材无法深入论述。
为此,笔者还会推出多本被套图书以便学生知识扩展。
第1章嵌入式系统概述 (1)1.1嵌入式系统 (1)1.1.1 现实中的嵌入式系统 (1)1.1.2 嵌入式系统的概念 (2)1.1.3 嵌入式系统的未来 (2)1.2嵌入式处理器 (2)1.2.1 简介 (2)1.2.2 分类 (3)1.3嵌入式操作系统 (4)1.3.1 简介 (4)1.3.2 基本概念 (5)1.3.3 使用实时操作系统的必要性 (8)1.3.4 实时操作系统的优缺点 (8)1.3.5 常见的嵌入式操作系统 (8)第2章嵌入式系统工程设计 (14)2.1嵌入式系统项目开发生命周期 (14)2.1.1 概述 (14)2.1.2 识别需求 (15)2.1.3 提出方案 (17)2.1.4 执行项目 (19)2.1.5 结束项目 (21)2.2嵌入式系统工程设计方法简介 (22)2.2.1 由上而下与由下而上 (22)2.2.2 UML系统建模 (22)2.2.3 面向对象OO的思想 (23)第3章ARM7体系结构 (25)3.1简介 (25)3.1.1 ARM (25)3.1.2 ARM的体系结构 (25)3.1.3 ARM处理器核简介 (26)3.2ARM7TDMI (27)3.2.1 简介 (27)3.2.2 三级流水线 (28)3.2.4 存储器接口 (28)3.3ARM7TDMI的模块和内核框图 (29)3.4体系结构直接支持的数据类型 (31)3.5处理器状态 (32)3.6处理器模式 (32)3.7内部寄存器 (33)3.7.1 简介 (33)3.7.2 ARM状态寄存器集 (33)3.7.3 Thumb状态寄存器集 (35)3.8程序状态寄存器 (37)3.8.1 简介 (37)3.8.2 条件代码标志 (38)3.8.3 控制位 (38)3.8.4 保留位 (39)3.9异常 (39)3.9.1 简介 (39)3.9.2 异常入口/出口汇总 (39)3.9.3 进入异常 (40)3.9.4 退出异常 (41)3.9.5 快速中断请求 (41)3.9.6 中断请求 (41)3.9.7 中止 (41)3.9.8 软件中断指令 (42)3.9.9 未定义的指令 (42)3.9.10 异常向量 (42)3.9.11 异常优先级 (43)3.10中断延迟 (43)3.10.1 最大中断延迟 (43)3.10.2 最小中断延迟 (44)3.11复位 (44)3.12存储器及存储器映射I/O (44)3.12.1 简介 (44)3.12.2 地址空间 (44)3.12.3 存储器格式 (45)3.12.4 未对齐的存储器访问 (46)3.12.5 指令的预取和自修改代码 (47)3.13寻址方式简介 (51)3.14ARM7指令集简介 (52)3.14.1 简介 (52)3.14.2 ARM指令集 (52)3.14.3 Thumb指令集 (54)3.15协处理器接口 (56)3.15.1 简介 (56)3.15.2 可用的协处理器 (56)3.15.3 关于未定义的指令 (57)3.16调试接口简介 (57)3.16.1 典型调试系统 (57)3.16.2 调试接口 (58)3.16.3 EmbeddedICE-RT (58)3.16.4 扫描链和JTAG接口 (59)3.17ETM接口简介 (59)第4章ARM7TDMI(-S)指令系统 (61)4.1ARM处理器寻址方式 (61)4.2指令集介绍 (64)4.2.1 ARM指令集 (64)4.2.2 Thumb指令集 (90)第5章LPC2000系列ARM硬件结构 (112)5.1简介 (112)5.1.1 描述 (112)5.1.2 特性 (112)5.1.3 器件信息 (113)5.1.4 结构概述 (113)5.2引脚配置 (114)5.2.1 引脚排列及封装信息 (114)5.2.2 LPC2114/2124的引脚描述 (116)5.2.3 LPC2210/2212/2214的引脚描述 (120)5.2.4 引脚功能选择使用示例 (126)5.3存储器寻址 (126)5.3.1 片内存储器 (126)5.3.3 存储器映射 (127)5.3.4 预取指中止和数据中止异常 (131)5.3.5 存储器重映射及引导块 (132)5.3.6 启动代码相关部分 (134)5.4系统控制模块 (136)5.4.1 系统控制模块功能汇总 (136)5.4.2 引脚描述 (137)5.4.3 寄存器描述 (137)5.4.4 晶体振荡器 (138)5.4.5 复位 (139)5.4.6 外部中断输入 (142)5.4.7 外部中断应用示例 (145)5.4.8 存储器映射控制 (146)5.4.9 PLL(锁相环) (148)5.4.10 VPB分频器 (153)5.4.11 功率控制 (154)5.4.12 唤醒定时器 (156)5.4.13 启动代码相关部分 (156)5.5存储器加速模块(MAM) (158)5.5.1 描述 (158)5.5.2 MAM结构 (159)5.5.3 MAM的操作模式 (160)5.5.4 MAM配置 (161)5.5.5 寄存器描述 (161)5.5.6 MAM使用注意事项 (162)5.5.7 启动代码相关部分 (162)5.6外部存储器控制器(EMC) (163)5.6.1 特性 (163)5.6.2 概述 (163)5.6.3 引脚描述 (164)5.6.4 寄存器描述 (164)5.6.5 外部存储器接口 (166)5.6.6 典型总线时序 (168)5.6.7 外部存储器选择 (168)5.6.8 启动代码相关部分 (169)5.7引脚连接模块 (170)5.7.1 介绍 (170)5.7.2 寄存器描述 (170)5.7.3 引脚功能控制 (173)5.7.4 启动代码相关部分 (173)5.8.1 特性 (175)5.8.2 描述 (175)5.8.3 结构 (176)5.8.4 寄存器描述 (177)5.8.5 中断源 (181)5.8.6 VIC使用事项 (183)5.8.7 VIC应用示例 (184)5.8.8 启动代码相关部分 (185)5.9GPIO (186)5.9.1 特性 (186)5.9.2 应用 (186)5.9.3 引脚描述 (187)5.9.4 寄存器描述 (187)5.9.5 GPIO使用注意事项 (189)5.9.6 GPIO应用示例 (189)5.10UART 0 (189)5.10.1 特性 (189)5.10.2 引脚描述 (190)5.10.3 应用 (190)5.10.4 结构 (190)5.10.5 寄存器描述 (191)5.10.6 使用示例 (198)5.11UART1 (200)5.11.1 特性 (200)5.11.2 引脚描述 (200)5.11.3 应用 (201)5.11.4 结构 (202)5.11.5 寄存器描述 (203)5.12I2C接口 (211)5.12.1 特性 (211)5.12.2 应用 (211)5.12.3 引脚描述 (211)5.12.4 I2C接口描述 (211)5.12.5 I2C操作模式 (214)5.12.6 寄存器描述 (225)5.13SPI接口 (228)5.13.1 特性 (228)5.13.2 引脚描述 (228)5.13.3 描述 (229)5.13.5 寄存器描述 (235)5.14定时器0和定时器1 (237)5.14.1 描述 (237)5.14.2 特性 (237)5.14.3 应用 (238)5.14.4 管脚描述 (238)5.14.5 结构 (239)5.14.6 寄存器描述 (239)5.14.7 定时器举例操作 (244)5.14.8 使用示例 (245)5.15脉宽调制器(PWM) (247)5.15.1 特性 (247)5.15.2 引脚描述 (248)5.15.3 描述 (248)5.15.4 结构 (249)5.15.5 寄存器描述 (251)5.15.6 使用示例 (256)5.16A/D转换器 (258)5.16.1 特性 (258)5.16.2 描述 (258)5.16.3 引脚描述 (258)5.16.4 寄存器描述 (259)5.16.5 操作 (261)5.16.6 使用示例 (261)5.17实时时钟 (262)5.17.1 特性 (262)5.17.2 描述 (262)5.17.3 结构 (262)5.17.4 RTC中断 (263)5.17.5 闰年计算 (264)5.17.6 寄存器描述 (264)5.17.7 混合寄存器组 (265)5.17.8 完整时间寄存器 (267)5.17.9 时间计数器组 (268)5.17.10 报警寄存器组 (269)5.17.11 基准时钟分频器(预分频器) (269)5.17.12 RTC使用注意事项 (271)5.17.13 使用示例 (271)5.18看门狗 (274)5.18.2 应用 (274)5.18.3 描述 (274)5.18.4 结构 (275)5.18.5 寄存器描述 (275)5.18.6 使用示例 (277)5.19本章小结 (278)第6章接口技术与硬件设计 (280)6.1最小系统 (280)6.1.1 框图 (280)6.1.2 电源 (280)6.1.3 时钟 (284)6.1.4 复位及复位芯片配置 (284)6.1.5 存储器系统 (287)6.1.6 调试与测试接口 (288)6.1.7 完整的最小系统 (289)6.2片内外设 (291)6.2.1 GPIO(通用I/O) (291)6.2.2 UART、MODEM (295)6.2.3 I2C (298)6.2.4 SPI (304)6.3总线接口 (308)6.3.1 并行SRAM (308)6.3.2 并行FALSH (314)6.3.3 USB(D12)接口 (328)6.3.4 液晶接口 (332)6.3.5 网络接口 (341)6.4其它外设 (350)6.4.1 并行打印机接口 (350)6.4.2 CF卡及IDE硬盘接口 (356)第7章移植µC/OS-II到ARM7 (362)7.1µC/OS-II简介 (362)7.1.1 概述 (362)7.1.2 µC/OS-II的特点 (362)7.2移植规划 (363)7.2.1 编译器的选择 (363)7.2.2 任务模式的取舍 (363)7.3移植µC/OS-II (363)7.3.1 概述 (363)7.3.2 关于头文件includes.h和config.h (364)7.3.3 编写OS_CPU.H (365)7.3.4 编写Os_cpu_c.c文件 (366)7.3.5 编写Os_cpu_a.s (371)7.3.6 关于中断及时钟节拍 (374)7.4移植代码应用到LPC2000 (376)7.4.1 编写或获取启动代码 (376)7.4.2 挂接SWI软件中断 (376)7.4.3 中断及时钟节拍中断 (377)7.4.4 编写应用程序 (377)7.5本章小结 (379)第8章嵌入式系统开发平台 (380)8.1如何建立嵌入式系统开发平台 (380)8.1.1 使用平台开发是大势所趋 (380)8.1.2 建立开发平台的方法 (383)8.1.3 编写自己的软件模块 (384)8.2数据队列 (384)8.2.1 简介 (384)8.2.2 API函数集 (384)8.3串口驱动 (387)8.3.1 简介 (387)8.3.2 API函数集 (387)8.4MODEM接口模块 (389)8.4.1 简介 (389)8.4.2 MODEM的状态 (389)8.4.3 API函数集 (389)8.5I2C总线模块 (390)8.5.1 简介 (390)8.5.2 API函数集 (391)8.6SPI总线模块 (392)8.6.1 简介 (392)8.6.2 API函数集 (392)第1章嵌入式系统概述1.1 嵌入式系统经过几十年的发展,嵌入式系统已经在很大程度改变了人们的生活、工作和娱乐方式,而且这些改变还在加速。
2嵌入式产品安装与调试课程标准

《嵌入式产品安装与调试》课程标准一、课程基本信息(一)课程信息(二)专业概况1、培养目标通过《嵌入式产品安装与调试》的理论及实验教学,使学生了解嵌入式系统体系结构,嵌入式处理器结构(ARM架构为主),异常处理,存储处理,系统控制过程,流水线作业及各种I/O接口;引导学生自主学习,使学生掌握嵌入式操作系统(uC/OS-ll),以及在嵌入式 OS支持下的开发应用方法,训练学生的系统整合能力、程序语言能力、市场应用导向能力,使学生具备理论联系实际、运用所学知识发现问题和解决问题的能力。
为今后学习Linux内核,外围驱动的开发奠定坚实的基础,为学生的职业素质和职业技能的形成服务,为IT企业输送合格的软硬件从业者。
2、岗位面向嵌入式产品安装与调试课程是计算机科学与应用学科下的一个重要课程,设有嵌入式系统设计与开发室、计算机组装与维护、Linux操作系统、计算机网络基础、单片机及应用、第1页共9页Linux C编程、OA外围设备原理与维修、嵌入式系统原理、£口庆、嵌入式系统应用、常用工具软件、Internet操作技术、可编程控制器、微机组成原理、电工仪表与测量、局域网的组建与安装、传感器及应用、网络设备配置与管理等课程。
主要面向嵌入式电子产品的设计开发、生产制作、安装调试、运行维护、故障分析等岗位。
3、专业核心能力(1)训练学生的系统整合能力;(2)具备理论联系实际、运用所学知识发现问题和解决问题的能力;(3)提高学生在电子电路设计方面的实践技能;(4)能够进一步自学相关知识。
二、教学大纲(一)总体目标与任务1、课程性质和任务《嵌入式产品安装与调试》课程是所属学科为电气与信息类下的一级学科计算机科学与技术,在计算机科学与技术专业培养方案中属专业基础系列课程之一。
2、课程定位《嵌入式产品安装与调试》课程是应用电子技术专业的学生必修的一门实践性很强的专业技能课。
3、课程目标(1)能力目标1)使学生能够全面了解嵌入式系统的状况,培养学生系统整合能力。
周立功的学习经历

我的学习经历!以下帖子不针对matadorfor网友。
首先声明,zlgARM是上班时间就挂在网上,并非眼睛时刻叮嘱网页,请不要钻牛角尖!我们每天要不停地接电话,那是6条技术支持的专线。
您的心情我非常能够理解,这不是一句客气话。
我想如果您不坚持学好,难道学其他的东西又能够学好吗?肯定不能。
不学好是您的损失,最大损失是不能赢得挑战。
不知道我说得是否正确?当然,您骂我也无妨。
很多问题需要自己下功夫学习,我也同样如此。
很多东西可以找一找以前的帖子,同时也要看看相关的书。
学习ARM我也是将相关的图书看了几十遍,不断地查找相关的技术资料“苦”学出来的。
我不知道大家是怎么学习新技术的,有没有将程序一行一行地自己重新敲进去,并将书上的标注也并写上,与此同时保证这行程序的意思“已经全部”搞懂了。
如果没有搞懂,则应该等搞懂了才进行下一步,而不是将程序“Load”进去“RUN”一次就算搞懂了,那是自欺欺人的做法。
除了配套资料上提供的程序之外,每个人自己是否还写了很多“自己的程序”,这是必须要做的事情,而且还要写笔记,随后的笔记越来越多,直到最后成为了“自己的专著”,我想这才算真的学会了,这就是我的学习经历,估计没有更好的办法。
有很多问题可以说不完全属于技术支持本身的范畴,不能说凡是用户不会的知识,我们都要立即回答,我们是否需要支持所有的问题?值得商榷,其实,有很多问题使用电话直接提问可以立即解决,因为有很多问题提的也不准确,有很多问题则需要长篇大论才能回复,不是一件容易的事情。
下面是我的学习笔记(还不完整,准备再改一次),可以供您参考,应该怎样学习?我学习也是要写笔记和总结的,不知道您是否如此,要知道我已经42岁,我有什么优势,没有!就是刻苦。
同时请结合我们的课件学习,课件是我们耗费六个月时间创造出来的,对初学者非常有帮助。
ARM开发调试教程

ARM开发调试教程作者:李希岗版本:1.0说明:本文是我学习ARM开发以来的一些经验总结,以自己设计的S3C44B0X板为例,给出我调试开发ARM开发板的一些最基础知识。
我只是在自己的开发板调试过并且经验有限,有些知识只能做为参考,不一定准确,就算给大家一个“例程”吧,如果大家有不同意见,希望多多指正!硬件篇(一)开发板的整体架构我设计的开发板是在三星44B0 demo板的基础上,参考网络上相关的资料,加入我的思想开发的。
以下是该开发板的整体架构:(二)开发板的焊接贴片式元器件的拆卸、焊接宜选用200~280℃调温式尖头烙铁。
贴片式电阻器、电容器的基片大多采用陶瓷材料制作,这种材料受碰撞易破裂,因此在拆卸、焊接时应掌握控温、预热、轻触等技巧。
控温是指焊接温度应控制在200~250℃左右。
预热指将待焊接的元件先放在100℃左右的环境里预热1~2分钟,防止元件突然受热膨胀损坏。
轻触是指操作时烙铁头应先对印制板的焊点或导带加热,尽量不要碰到元件。
另外还要控制每次焊接时间在3秒钟左右,焊接完毕后让电路板在常温下自然冷却。
以上方法和技巧同样适用于贴片式晶体二、三极管的焊接。
贴片式集成电路的引脚数量多、间距窄、硬度小,如果焊接温度不当,极易造成引脚焊锡短路、虚焊或印制线路铜箔脱离印制板等故障。
拆卸贴片式集成电路时,可将调温烙铁温度调至260℃左右,用烙铁头配合吸锡器将集成电路引脚焊锡全部吸除后,用尖嘴镊子轻轻插入集成电路底部,一边用烙铁加热,一边用镊子逐个轻轻提起集成电路引脚,使集成电路引脚逐渐与印制板脱离。
用镊子提起集成电路时一定要随烙铁加热的部位同步进行,防止操之过急将线路板损坏。
换入新集成电路前要将原集成电路留下的焊锡全部清除,保证焊盘的平整清洁。
然后将待焊集成电路引脚用细砂纸打磨清洁,均匀搪锡,再将待焊集成电路脚位对准印制板相应焊点,焊接时用手轻压在集成电路表面,防止集成电路移动,另一只手操作电烙铁蘸适量焊锡将集成电路四角的引脚与线路板焊接固定后,再次检查确认集成电路型号与方向,正确后正式焊接,将烙铁温度调节在250℃左右,一只手持烙铁给集成电路引脚加热,另一只手将焊锡丝送往加热引脚焊接,直至全部引脚加热焊接完毕,最后仔细检查和排除引脚短路和虚焊,待焊点自然冷却后,用毛刷蘸无水酒精再次清洁线路板和焊点,防止遗留焊渣。
ARM7TDMI

ARM7TDMI-S(Rev 4)技术参考手册第1章介绍这一章介绍ARMTDMI-S处理器包含以下小节z 关于ARM7TDMI-S 处理器z ARM7TDMI-S结构z ARM7TDMI-S模块内核和功能框图z ARM7TDMI-S指令集汇总z Rev 3a和Rev 4之间的差异1.1 关于ARM7TDMI-S处理器ARM7TDMI-S处理器是ARM通用32位微处理器家族的成员之一ARM处理器具有优异的性能但功耗却很低使用门的数量也很少ARM结构是基于精简指令集计算机(RISC)原理而设计的指令集和相关的译码机制比复杂指令集计算机要简单得多这样的简化实现了z 高的指令吞吐量z 出色的实时中断响应z 小的高性价比的处理器宏单元1.1.1指令流水线ARM7TDMI-S处理器使用流水线来增加处理器指令流的速度这样可使几个操作同时进行并使处理和存储器系统连续操作流水线使用3个阶段因此指令分3个阶段执行z 取指z 译码z 执行3阶段流水线如图1-1所示ARM ThumbPC PC 指令从存储器中取出PC-4 PC-2 对指令使用的寄存器进行译码PC-8 PC-4 从寄存器组中读出寄存器执行移位和ALU操作寄存器写回到寄存器组图1-1 指令流水线注程序计数器(PC)指向被取指的指令而不是指向正在执行的指令在正常操作过程中在执行一条指令的同时对下一条指令进行译码并将第三条指令从存储器中取出1.1.2 存储器访问ARM7TDMI-S处理器使用了冯诺依曼Von Neumann结构指令和数据共用一条32位总线只有装载存储和交换指令可以对存储器中的数据进行访问数据可以是8位字节16位半字或者32位字字必须分配为占用4字节而半字必须分配为占用2字节1.1.3 存储器接口ARM7TDMI-S处理器的存储器接口可以使潜在的性能得到实现这样减少了存储器的使用对速度有严格要求的控制信号使用流水线这样使系统控制功能以标准的低功耗逻辑实现这些控制信号使许多片内和片外存储器技术所支持的快速突发访问模式得到充分利用ARM7TDMI-S处理器的存储器周期有4种基本类型z 内部周期z 非连续的周期z 连续的周期z 协处理器寄存器传输周期1.2 ARM7TDMI-S的结构ARM7TDMI-S处理器有两个指令集z 32位ARM指令集z 16位Thumb指令集ARM7TDMI-S处理器使用了ARM结构v4T关于ARM和Thumb指令集的详细信息请参阅ARM 体系结构参考手册1.2.1 指令压缩传统的微处理器结构对于指令和数据有相同的带宽因此和16位结构相比32位结构处理32位数据具有更高的性能并且在寻址更大的地址空间时要有效得多16位结构比32位结构具有更高的代码密度并且超过32位结构50%的性能Thumb在32位结构上实现了16位的指令集这样可提供z 比16位结构更高的性能z 比32位结构更高的代码密度1.2.2 Thumb指令集Thumb指令集是最通用的ARM指令的子集Thumb指令长度为16位每条指令都对应一条32位ARM 指令它对处理器模型有相同的效果Thumb指令使用标准的ARM寄存器配置进行操作这样ARM和Thumb状态之间具有极好的互用性在执行方面Thumb具有32位内核所有的优点z 32位地址空间z 32位寄存器z 32位移位器和算术逻辑单元(ALU)z 32位存储器传输Thumb因此提供了长的分支范围强大的算术操作和巨大的地址空间Thumb代码仅为ARM代码规模的65%但其性能却相当于连接到16位存储器系统的ARM处理器性能的160%因此Thumb使ARM7TDMI-S处理器非常适用于那些只有有限的存储器带宽并且代码密度很高的嵌入式应用16位Thumb和32位ARM指令集使设计者极大的灵活性使他们可以根据各自应用的需求在子程序一级上实现对性能或者代码规模的优化例如应用中的快速中断和DSP算法可使用完全的ARM指令集编写并使用Thumb代码连接1.3 ARM7TDMI-S 模块内核和功能框图ARM7TDMI-S 处理器结构内核和功能框图见下z ARM7TDMI-S 模块见图1-2 z ARM7TDMI-S 内核见图1-3z ARM7TDMI-S 功能框图见图1-4WDATA[31:RDATA[31:图1-2 ARM7TDMI-S 模块注数据总线上没有双向路径图1-2对这些作了简化C L KC L KE N C FG B IGEND nIRQ nF IQ nRE S E T AB O R T C P CPDBG DBG TRANS[1:0]PROT[1:0]S I ZE[1:0]WRITE LOCK WDAT A[31:0]RDAT A[31:0]ADDR [31:0]态寄存器地址增加器增加器总线筒形移位器指令管线读数据寄存器图1-3 ARM7TDMI-S 内核Embe de dICE-RT图1-4 ARM7TDMI-S功能框图1.4 ARM7TDMI-S指令集汇总该节提供了ARM和Thumb指令集的汇总z ARM指令汇总z Thumb指令汇总指令集详见ARM体系结构参考手册1.5 Rev 3a和Rev 4之间的差异ARM7TDMI-S(Rev 4)的变更见下面的章节z 增加的EmbeddedICE-RT逻辑z 改进的调试通信通道(DCC)带宽z 通过JTAG对DCC进行访问z TAP控制器ID寄存器z 更加有效的多路传输1.5.1 增加的EmbeddedICE-RT逻辑EmbeddedICE-RT对ARM7TDMI-S(Rev 3)当中的EmbeddedICE逻辑作了改进EmbeddedICE-RT可以使您在监控模式下执行调试在监控模式下内核在遇到断点或观察点时执行异常处理并不像在暂停模式中那样进入调试状态如果内核在遇到断点或观察点时不进入调试状态它仍然可以像正常情况下一样响应硬件中断请求如果内核构成了机械系统反馈环的一部分那么在监控模式下进行调试非常有用因为如果停止内核会导致系统运转中断更详细的信息请查阅第5章调试您的系统节电当DBGEN被拉低时大部分的EmbeddedICE-RT逻辑都被禁止以实现最低功耗程序员模式的改变程序员模式的改变如下调试控制寄存器增加了两个新的位Bit4 监控模式使能使用该位来控制器件对断点或观察点的反应z 置位时内核执行指令或数据的异常中止z 当清零时内核进入调试状态Bit5 EmbeddedICE-RT禁止在更改观察点和断点时使用该位z 置位时该位禁止断点和观察点断点或观察点寄存器可以编程为新的值z 清零时新的断点或观察点值生效协处理器寄存器映射协处理器寄存器映射中的一个新的寄存器R2指示处理器是因为一个真实的中止还是因为断点或观察点而进入预取指或数据异常中止更详细的信息请参阅第5章的中止状态寄存器1.5.2 改进的调试通信通道(DCC)带宽在ARM7TDMI-S处理器(Rev 3)中读取DCC数据需要对扫描链2进行两次访问第一次访问状态位第二次访问数据本身为了改进DCC带宽在ARM7TDMI-S处理器(Rev 4)中读取数据和状态位只需要一次访问状态位包含在扫描链所读取的地址区域的最低位当中DCC控制寄存器中的状态位保持不变以确保向下兼容性更多信息参考第5章的调试通信通道一节1.5.3 通过JTAG访问DCCDCC控制寄存器可通过ARM7TDMI-S处理器(Rev 4)中的JTAG接口进行控制处理器写操作清零bit0数据读控制位更多信息请参考第5章的调试通信通道一节1.5.4 TAP控制器ID寄存器TAP控制器ID寄存器值为0x7F1F0F0F更多信息请参考第5章的ARM7TDMI-S器件标识(ID)代码寄存器一节第2章编程模型这一章讲述ARM7TDMI-S处理器的编程模型包含以下小节z 关于编程模型z 处理器操作状态z 存储器格式z 指令长度z 数据类型z 操作模式z 寄存器z 程序状态寄存器z 异常z 状态延迟z 复位2.1 关于编程模型ARM7TDMI-S处理器内核使用ARM v4T结构实现该结构包含32位ARM指令集和16位Thumb指令集在ARM体系结构参考手册中详细讲述了编程模型2.2 处理器操作状态ARM7TDMI-S处理器有两种操作状态ARM状态32位这种状态下执行的是字方式的ARM指令Thumb状态 16位半字方式的Thumb指令在Thumb状态中程序计数器PC使用bit1来选择切换半字注ARM和Thumb状态间的切换并不影响处理器模式或寄存器内容2.2.1 状态切换您可以使用BX指令将ARM7TDMI-S内核的操作状态在ARM状态和Thumb状态之间进行切换详见ARM体系结构参考手册所有的异常处理都在ARM状态中执行如果异常发生在Thumb状态中处理器会返回ARM状态在异常处理返回时自动切换回Thumb状态2.3 存储器格式ARM7TDMI-S处理器将存储器看作是一个从0开始的线性递增的字节集合z 字节0到3保存第1个存储的字z 字节4到7保存第2个存储的字z 字节8到11保存第3个存储的字ARM7TDMI-S处理器可以将存储器中的字以下列格式存储z 大端Big-endian格式z 小端Little-endian格式2.3.1 大端格式在大端格式中ARM7TDMI-S 处理器将最高位字节保存在最低地址字节最低位字节保存在最高地址字节因此存储器系统字节0连接到数据线3124843124231615870低地址字地址图2-1 字内字节的大端地址2.3.2 小端格式在小端格式中一个字当中最低地址的字节被看作是最低位字节最高地址字节被看作是最高位字节因此存储器系统字节0连接到数据线70如图2-2所示843124231615870低地址字地址图2-2 字内字节的小端地址2.4 指令长度指令长度为下面两种之一z 32位长度在ARM状态中z 16位长度在Thumb状态中2.5 数据类型ARM7TDMI-S处理器支持下列数据类型z 字32位z 半字16位z 字节8位您必须这样进行分配z 字量必须分配为占用4个字节z 半字量必须分配为占用2个字节z 字节量可放置在任何一个字节内2.6 操作模式ARM7TDMI-S处理器具有7种操作模式z 用户模式这是ARM程序通常执行的状态用于执行大多数应用程序z 快速中断FIQ模式支持数据传输或通道处理z 中断IRQ模式用于通用中断处理z 超级用户模式是操作系统一种受保护的模式z 中止模式在数据或指令预取指中止时进入该模式z 系统模式是操作系统一种特许的用户模式z 未定义模式当执行未定义的指令时进入该模式除了用户模式之外其它模式都被归为特权模式特权模式用于服务中断异常或者访问受保护的资源2.7 寄存器ARM7TDMI-S处理器总共有37个寄存器z 31个通用32位寄存器z 6个状态寄存器这些寄存器并不是在同一时间全都可以被访问的处理器状态和操作模式决定了程序员可以访问哪些寄存器2.7.1 ARM状态寄存器集在ARM状态中16个通用寄存器和1个或2个状态寄存器可在任何时候同时被访问在特权模式中与模式相关的分组寄存器可以被访问图2-3所示为每种模式所能访问的寄存器ARM状态寄存器集包含16个可直接访问的寄存器r0r15一个附加的寄存器当前程序状态寄存器CPSR包含条件代码标志和当前模式位寄存器r0r13为保存数据或地址值的通用寄存器寄存器r14和r15具有下面的特殊功能连接寄存器寄存器14作为一个子程序连接寄存器LR当执行连接分支BL指令时r14接收r15的备份在其它时候可将r14当成一个通用寄存器对应的分组寄存器r14_svc, r14_irq, r14_fiq, r14_abt和r14_und与之相似当发生中断和异常或者当中断或异常子程序中的BL 指令执行时用于保存r15的返回值程序计数器寄存器15用于保存程序计数器PC在ARM状态中r15中的bits[1:0]为0bits[31:2]包含PC值在Thumb状态中bit[0]为0bits[31:1]包含PC值在特权模式中另外一个寄存器被保存的程序状态寄存器SPSP可以被访问它包含了条件代码标志和作为异常的结果所保存的模式位此异常导致进入当前模式关于程序状态寄存器的描述见后面的章节分组寄存器有一个模式标识符用于指示它们被映射到哪个用户模式寄存器这些模式标识符如表2-1所示表2-1 寄存器模式标识符模式模式标识符用户 usr快速中断 fiq中断 irq超级用户 svc中止 abt系统 sys未定义 undFIQ 模式有7个分组寄存器分别映射到r8r14r8_fiqr14_fiq在ARM 状态中大多数FIQ 处理程序都不必保存任何寄存器用户IRQ 超级用户中止和未定义模式各有2个分组寄存器分别映射到r13和r14每种模式允许有一个专用的堆栈指针和LR图2-3所示为ARM状态寄存器ARM r0r1r2r3r4r5r6r7r8r9r10r11r12r13r14r15(PC)=状态通用寄存器和程序计数器系统和用户超级用户快速中断中断ARM 状态程序寄存器分组寄存器图2-3 ARM 状态中的寄存器结构2.7.2 Thumb 状态寄存器集Thumb 状态寄存器集时ARM 状态集的子集程序员可直接访问z 8个通用寄存器r0r7z PC z 堆栈指针SPz 连接寄存器LRz CPSR每个特权模式都有分组的SPLR 和SPSR该寄存器集如图2-4所示r0r1r2r3r4r5r6r7SP LR PC=状态通用寄存器和程序计数器系统和用户Thumb 状态程序寄存器分组寄存器Thumb图2-4 Thumb 状态中的寄存器结构2.7.3 ARM 状态寄存器和Thumb 状态寄存器之间的关系Thumb 状态寄存器与ARM 状态寄存器有如下的关系z Thumb 状态r0r7与ARM 状态r0r7相同z Thumb 状态CPSR 和SPSR 与ARM 状态CPSR 和SPSR 相同 z Thumb 状态SP 映射到ARM 状态r13 z Thumb 状态LR 映射到ARM 状态r14 z Thumb 状态PC 映射到ARM 状态PC(r15) 这些关系如图2-5所示图2-5 Thumb 寄存器在ARM 状态寄存器上的映射注寄存器r0r7为低寄存器寄存器r8r15为高寄存器2.7.4 在Thumb 状态中访问高寄存器在Thumb 状态中高寄存器r8r15不是标准寄存器集的一部分汇编语言程序员对它们的访问受到限制但可以将它们用于快速暂存可以使用MOV 指令的特殊变量将一个值从低寄存器r0r7转移到高寄存器或者从高寄存器到低寄存器CMP指令可用于比较高寄存器和低寄存器的值ADD 指令可用于将高寄存器的值与低寄存器的值相加详细信息请参考ARM体系结构参考手册2.8 程序状态寄存器ARM7TDMI-S 内核包含1个CPSR 和5个SPSR 供异常处理程序使用程序状态寄存器z 保持条件代码标志 z 控制中断的使能和禁止 z 设置处理器操作模式 位的分配如图2-6所示图2-6 程序状态寄存器格式注为了保持与将来的ARM 处理器兼容并且作为一种良好的习惯在更改CPSR 时我们强烈建议您使用读写修改的方法2.8.1 条件代码标志N, Z, C 和V 位都是条件代码标志可以通过算术和逻辑操作来设置这些位这些标志还可通过MSR和LDM 指令进行设置ARM7TDMI-S 处理器对这些位进行测试以决定是否执行一条指令在ARM 状态中所有指令都可按条件来执行在Thumb 状态中只有分支指令可条件执行更详细的信息请参考ARM 体系结构参考手册2.8.2 控制位PSR 的最低8位为控制位它们分别是z 中断禁止位 z T 位 z 模式位 当发生异常时控制位改变当处理器在一个特权模式下操作时可用软件操作这些位中断禁止位I 和F 位都是中断禁止位z 当I 位置位时IRQ 中断被禁止 z 当F 位置位时FIQ 中断被禁止T位T位反映了正在操作的状态z 当T位置位时处理器正在Thumb状态下运行z 当T位清零时处理器正在ARM状态下运行操作状态通过CPTBIT外部信号反映警告绝对不要强制改变CPSR寄存器中的T位如果这样做处理器会进入一个无法预知的状态模式位M4, M3, M2, M1和M0位M[4:0]都是模式位这些位决定处理器的操作模式见表2-2不是所有模式位的组合都定义了有效的处理器模式因此请小心不要使用表中所没有列出的组合表2-2 PSR模式位值M[4:0] 模式可见的Thumb状态寄存器可见的ARM状态寄存器10000 用户r0~r7, SP, LR, PC, CPSR r0~r14,PC, CPSR10001 FIQ r0~r7,SP_fiq,LR_fiq,PC,CPSR, SPSR_fiq r0~r7,r8_fiq~r14_fiq,PC,CPSR, SPSR_fiq 10010 IRQ r0~r7,SP_irq,LR_irq,PC,CPSR,SPSR_fiqr0~r12,r13_irq,r14_irq,PC,CPSR,SPSR_irq10011 超级用户 r0~r7,SP_svc,LR_svc,PC,CPSR,SPSR_svc r0~r12,r13_svc,r14_svc,PC,CPSR, SPSR_svc10111 中止 r0~r7,SP_abt,LR_abt,PC,CPSR,SPSR_abtr0~r12,r13_abt,r14_abt,PC,CPSR,SPSR_abt11011 未定义 r0~r7,SP_und,LR_und,PC,CPSR,SPSR_und r0~r12,r13_und,r14_und,PC,CPSR, SPSR_und11111 系统 r0~r7,SP,LR,PC,CPSR注如果将非法值写入M[4:0]中处理器将进入一个无法恢复的模式2.8.3 保留位PSR中的保留位被保留将来使用当改变PSR标志和控制位时请确认没有改变这些保留位另外请确保您的程序不依赖于包含特定值的保留位因为将来的处理器可能会将这些位设置为1或者02.9 异常只要正常的程序流被暂时中止处理器就进入异常模式例如响应一个来自外设的中断在处理异常之前ARM7TDMI-S内核保存当前的处理器状态这样当处理程序结束时可以恢复执行原来的程序如果同时发生两个或更多异常那么将按照固定的顺序来处理异常见异常优先级一节该节将会详细讲述ARM7TDMI-S处理器的异常处理z 异常入口/出口汇总z 进入异常z 退出异常2.9.1 异常入口/出口汇总表2-3所示为异常入口处变量r14所保存的PC值以及退出异常处理程序所推荐使用的指令表2-3 异常入口/出口异常或入口 返回指令 之前的状态ARM r14_x Thumb r14_x 备注BL MOV PC,R14PC+4PC+2 SWIMOVS PC,R14_svcPC+4 PC+2未定义的指令 MOVS PC,R14_und PC+4PC+2 预取指中止 SUBS PC,R14_abt,#4 PC+4 PC+4 此处PC 为BL, SWI, 未定义的指令取指或者预取中止指令的地址 FIQ SUBS PC,R14_fiq,#4 PC+4PC+4 IRQSUBS PC,R14_irq,#4 PC+4 PC+4 此处PC 为由于FIQ 或IRQ 占先而没有被执行的指令的地址数据中止SUBS PC,R14_abt,#4 PC+8PC+8此处PC 为产生数据中止的装载或保存指令的地址复位无复位时保存在r14_svc 中的值不可预知2.9.2 进入异常当处理异常时ARM7TDMI-S 内核会1.在适当的LR 中保存下一条指令的地址当异常入口来自ARM 状态ARM7TDMI-S 将下一条指令的地址复制到LR 中当前PC+4或PC+8取决于异常的类型Thumb状态ARM7TDMI-S 将PC 加偏移值PC+4或PC+8取决于异常的类型写入LR当进入异常时异常处理程序不必确定状态例如在SWI 情况下MOVS PC,r14_svc 总是返回到下一条指令而不管SWI 是在ARM 还是在Thumb 状态下执行2. 将CPSR 复制到适当的SPSR3. 根据异常将CPSR 模式强制设为某一值4. 强制PC 从相关的异常向量处对下一条指令取指ARM7TDMI-S 内核在中断异常时置位中断禁止标志这样可防止不受控制的异常嵌套注异常总是在ARM 状态中进行处理当处理器处于Thumb 状态时发生了异常在异常向量地址装入PC 时会自动切换到ARM 状态2.9.3 退出异常当异常结束时异常处理程序必须1. 将LR 中的值减去偏移量后移入PC 偏移量根据异常的类型而有所不同见表2-32. 将SPSR 的值复制回CPSR3. 清零在入口置位的中断禁止标志注恢复CPSR 的动作会将T, F 和I 位自动恢复为异常发生前的值2.9.4 快速中断请求快速中断请求(FIQ)异常支持数据转移或通道处理在ARM 状态中FIQ 模式有8个专用的寄存器可用来满足寄存器保护的需要这是上下文切换的最小开销将nFIQ 信号拉低可实现外部产生FIQ不管异常入口是来自ARM 状态还是Thumb 状态FIQ 处理程序都会通过执行下面的指令从中断返回 SUBS PC,R14_fiq,#4在一个特权模式中可通过置位CPSR 中的F 标志来禁止FIQ 异常当F 标志清零时ARM7TDMI-S 在每条指令结束时检测FIQ 同步器输出端的低电平2.9.5 中断请求中断请求IRQ异常是一个由nIRQ输入端的低电平所产生的正常中断IRQ的优先级低于FIQ对于FIQ序列它是被屏蔽的任何时候在一个特权模式下都可通过置位CPSR中的I 位来禁止IRQ,不管异常入口是来自ARM状态还是Thumb状态IRQ处理程序都会通过执行下面的指令从中断返回SUBS PC,R14_irq,#42.9.6 中止中止表示当前存储器访问不能被完成这是通过外部ABORT输入指示的不管异常入口是来自ARM 状态还是Thumb状态FIQ处理程序都会通过执行下面的指令从中断返回SUBS PC,R14_fiq,#4在存储器访问周期结束时检测中止异常有两种类型的中止z 预取指中止发生在指令预取指过程中z 数据中止发生在对数据访问时预取指中止当发生预取指中止时ARM7TDMI-S内核将预取的指令标记为无效但在指令到达流水线的执行阶段时才进入异常如果指令在流水线中因为发生分支而没有被执行中止将不会发生在处理中止的原因之后不管处于哪种处理器操作状态处理程序都会执行下面的指令SUBS PC,R14_abt,#4这个动作恢复了PC和CPSR并重试被中止的指令数据中止当发生数据中止时根据指令的类型产生不同的动作z 数据转移指令LDR,STR回写到被修改的基址寄存器中止处理程序必须注意这一点z 交还指令SWP中止好像没有被执行过一样中止必须发生在SWP指令进行读访问时z 块数据转移指令LDM,STM完成当回写被设置时基址寄存器被更新在指示出现中止后ARM7TDMI-S内核防止所有寄存器被覆盖这意味着ARM7TDMI-S内核总是会保护被中止的LDM指令中的r15总是最后一个被转移的寄存器中止的机制使指令分页的虚拟存储器系统能够被实现在这样一个系统中处理器允许产生仲裁地址当某一地址的数据无法访问时存储器管理单元MMU通知产生了中止中止处理程序必须找出中止的原因使请求的数据可以被访问并重新执行被中止的指令应用程序不必知道可用存储器的数量也不必知道它的被中止时所处的状态在修复产生中止的原因后不管处于哪种处理器操作状态处理程序都必须执行下面的返回指令SUBS PC,R14_abt,#8这个动作恢复了PC和CPSR并重试被中止的指令2.9.7 软件中断指令软件中断(SWI)用于进入超级用户模式通常用于请求一个特定的超级用户函数SWI处理程序通过执行下面的指令返回MOVS PC,R14_svc这个动作恢复了PC和CPSR并返回到SWI之后的指令SWI处理程序读取操作码以提取SWI函数编号2.9.8 未定义的指令当ARM7TDMI-S处理器遇到一条系统内任何协处理器都无法处理的指令时ARM7TDMI-S内核执行未定义指令陷阱软件可使用这一机制通过仿真未定义的协处理器指令来扩展ARM指令集注ARM7TDMI-S处理器完全遵循ARM结构v4T可以捕获所有分类未被定义的指令位格式在防止失败的指令后捕获处理器执行下面的指令MOVS PC,R14_und这个动作恢复了PC和CPSR并返回到未定义指令之后的指令关于未定义指令更详细的信息请参考ARM体系结构参考手册2.9.9 异常向量表2-4所示位异常向量地址在表中I和F表示先前的值表2-4 异常向量地址异常进入时的模式进入时I的状态进入时F的状态0x00000000 复位超级用户禁止禁止0x00000004 未定义指令未定义 I F 0x00000008 软件中断超级用户禁止 F 0x0000000C 中止预取指中止 I F 0x00000010 中止数据中止 I F 0x00000014 保留保留0x00000018 IRQ IRQ 禁止 F 0x0000001C FIQ FIQ 禁止禁止2.9.10 异常优先级当多个异常同时发生时一个固定的优先级系统决定它们被处理的顺序1. 复位最高优先级2. 数据中止3. FIQ4. IRQ5. 预取指中止6. 未定义指令7. SWI最低优先级有些异常不能一起发生z 未定义的指令和SWI异常互斥它们分别对应于当前指令的一个特定非重叠译码z 当FIQ使能并且在发生FIQ的同时产生了一个数据中止ARM7TDMI-S内核进入数据中止处理程序然后立即转到FIQ向量从FIQ的正常返回使数据中止处理程序恢复执行数据中止的优先级必须高于FIQ以确保数据转移错误不会被漏过必须将异常入口的时间增加到系统中最坏情况下FIQ的延迟时间2.10 中断延迟中断延迟被描述为z 最大中断延迟z 最小中断延迟2.10.1 最大中断延迟当FIQ使能时最坏情况下FIQ的延迟时间包含z Tsyncmax请求通过同步器的最长时间Tsyncmax为2个处理器周期z Tldm最长的指令执行需要的时间最长的指令是装载包括PC在内所有寄存器的LDM指令Tldm在零等待状态系统中的执行时间为20个周期z Texc数据中止入口的时间Texc为3个周期z Tfiq FIQ入口的时间Tfiq为2个周期因此总的延迟时间为27个周期在系统使用40MHz处理器时钟时略微小于0.7微妙在此时间结束后ARM7TDMI-S执行位于0x1c处的指令最大的IRQ延迟时间与之相似但必须考虑到这样一个事实即有更高优先级的FIQ可能会因为仲裁的时间而延迟IRQ处理程序的进入2.10.2 最小中断延迟最小中断延迟FIQ或IRQ的最小中断延迟是请求通过同步器的时间Tsyncmin加上Tfiq4个处理器周期2.11 复位当nRESET信号被拉低时ARM7TDMI-S处理器放弃正在执行的指令当nRESET信号再次变为高电平时nRESET处理器1. 强制M[4:0]变为b10011超级用户模式2. 置位CPSR中的I和F位3. 清零CPSR中的T位4. 强制PC从地址0x00开始对下一条指令进行取指5. 返回到ARM状态并恢复执行在复位后除PC和CPSR之外的所有寄存器的值都不确定。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
周立功ARM调试心得2008-9-11调试"SmartARM2200 V2.02实验箱"心得:1、在调试"E:\htwang\smart2200v201\ARM嵌入式系统实验教程(二)\开发板出厂编程程序\液晶显示程序\LCM_Disp"的程序时,想使用外部RAM进行仿真调试,在将ADS1.2中的"DebugInExram Settings->Arm Linker -> Output -> Equivalent Command Line"的"-info totals -entry 0x8100000 -scatter .\src\mem_b.scf"改为"-info totals -entry 0x80000000 -scatter .\src\mem_b.scf"时,编译时总是出现错误信息"Error: L6206E: Entry point(0x80000000) lies outside the images",经梁工(宝琼)提示:"这是由于程序空间超出范围,需要改一个参数。
"打开关于外部RAM调试的分散加载文件"mem_b.scf"发现所有的程序调试地址都是指向0x81000000的Flash地址空间,而不是0x80000000的RAM地址空间(此时硬件电路板上的短路片RAM接CS0、Flash接CS1),后把0x81******全部改为0x80******,编译调试都正常。
2、不正常现象:在调试"SmartARM2200 V2.02"实验箱时,每次实验箱断电或实验箱上复位按键后,H-Flash的Load操作都要重新执行一遍(或者简单一点:只要在H-Flash -> Programming -> Check 按钮上点击一下也可以),否则下载程序后实验箱运行不了。
(先是在选用DebugInExram出现这种情况,后选用RelOutChip则不会出现这种情况。
)<2008-9-12> 另外,每次重新启动H-JTAG和H-Flash后,都要将H-Flash重新设一遍。
3、现象:在调试GB_Disp工程时,程序无法正常运行。
分析:当调试的程序中包含中断时,分散加载文件"mem_*.scf"的"IRAM "项设置不能从0x40000000开始,而应该从0x40000040开始(给中断向量留下空间),否则程序无法调试。
(先是在选用RelOutChip出现这种情况,后选用DebugInExram也出现这种情况。
)< 2008-9-12 htwang注: 上面的解释并不正确,因为在调试其他中断实验的过程中,配置文件"mem_*.scf"的"IRAM "项设置成从0x40000000开始也可以正常运行。
(估计可能是存储器映射的问题)打开GB_Disp工程"target.c"文件,果然发现在函数"void TargetResetInit(void)"中将存储器映射寄存器初始化成"MEMMAP =0x2",这是选用的用户RAM模式,中断向量也从静态RAM重新映射。
如果想映射到用户外部存储器模式,应该改为"MEMMAP =0x3"(见《ARM嵌入式系统基础教程》P166 或《深入浅出ARM7-LPC2200》P119)。
按此方式更改后,实际调试也正常。
>(2008-9-12)结论:要么把该工程文件"mem_bscf"中的"IRAM "项改成从0x40000040开始;要么把该工程文件"target.c"中的存储器映射初始化为"MEMMAP =0x3"。
4、在调试中断程序时,如果使用IRQ.S中的汇编宏定义程序和"IRQ_Eint3_Handler HANDLER IRQ_Eint3"代替原来的C语言函数中断方式(当然同时将代码"VICVectAddr0 = (uint32)IRQ_Eint3;"改为"VICVectAddr0 = (uint32)IRQ_Eint3_Handler; "),则应将C语言中断函数"void __irq IRQ_Eint3(void)"改写成"void IRQ_Eint3(void)"。
否则调试是出现的情况就是程序在"IRQ_Eint3_Handler HANDLER IRQ_Eint3"和中断函数"void __irq IRQ_Eint3(void){}"里面反复执行,再也退不出来。
2008-9-12调试"SmartARM2200 V2.02实验箱"心得:5、现象:在自己编写定时器中断程序时,如果自己用工程模板"ARM Executable Image for lpc2200"建立工程并编写中断程序后,调试过程中总是不能进入中断,但是用定时中断的事例程序可以进入。
原因:经将自己建立的模板工程文件中的"Startup.s"文件和事例程序中的比较,发现在模板工程的"Startup.s"文件中的堆栈初始化代码"InitStack "中有一行语句为:;设置系统模式堆栈MSR CPSR_c, #0xdfLDR SP, =StackUsr这就将IRQ和FIQ都禁止了,需要将"MSR CPSR_c, #0xdf"改为"MSR CPSR_c, #0x5f"来打开IRQ中断才行。
6、现象:用C语言编写中断函数时,如void __irq Timer0Int(void){ },该中断函数必须放在主函数main()的上方,否则编译时会出现错误(因为主函数需要调用语句"VICVectAddr0 = (uint32)Timer0Int;"):1)Error: (Serious) C2933E: type disagreement for "Timer0Int"2) Error: C2456E: undeclared name, inventing 'extern int Timer0Int'解决方法:在主函数前面加上声明"void __irq Timer0Int(void);"(ZLG李工),此时编译应该不会再出现上述的问题,但如果此时Debug运行时不正常,需在ADS1.2(编程软件)执行操作"Project -> Remove Object Code "后,再重新编译调试。
如果把C语言编写的中断函数放到其他文件中,也是类似的处理方法,如:"extern void __irq Timer0Int(void);"7、在ADS软件中int类型占用4个字节的空间。
8、ALIGN=2 ,即定义2的n次幂对齐方式(梅工(程宇))。
(见ARM指令集ARM_zhiling.pdf)9、SvcStackSpace SPACE SVC_STACK_LEGTH * 4;其中的SPACE为字节空间定义(梅工(程宇)),并用0对之进行初始化。
(见ARM指令集ARM_zhiling.pdf)10、要想看到所有文件(函数)对FLASH和RAM的使用情况,在编译选项设置->ARM Linker -> Listings -> Listings的"Image map"和"Symbols"前面的复选框选中,编译后即可输出想要的详细信息(梅工(程宇))。
11、实验箱上的ZLG7290芯片由于内部键盘处理程序没有去抖动和防连击处理,所以用起来不太好用。
(据说ZLG7290芯片只是ZLG用一款单片机写了软件贴了个商标)2008-9-16调试"SmartARM2200 V2.02实验箱"心得:12、中断使能寄存器VICVectEnable写入1,对应通道的中断使能;写入0,无效。
如指令:VICIntEnable = 1 << 6;VICIntEnable = 1 << 4;指令这两条指令之后,通道6和通道4都被中断使能。
(课本《深入浅出ARM7--LPC2200》的P164有详细说明)13、在任务Task定义的局部变量与定义的静态局部变量功能等同,因为任务不可能返回,只能被中断(大部分是定时中断,也可能是其他中断)所打断,这时中断会保存相应的现场。
(自我理解,没有看到相关资料上如此解释)14、用typedef定义的结构体不能多次用#include 包含,否则会出现错误:Error:(Serious) C2930E: duplicate definition of ' ***'<2008-9-16 htwang注:上述结论并不正确,出现这种情况是因为一个有typedef的头文件在同一个文件中include包含了两次。
>2008-9-17调试"SmartARM2200 V2.02实验箱"心得:15、因为任务创建成功后OSTaskCreate()即进行任务的调度OS_Sched(),因而与此相关的事件创建(如消息邮箱)程序要放在先创建的任务中,而不是放在即将创建的高优先级任务中。
<2008-9-17 htwang注:上述结论不正确,因为任务创建后并不会马上运行,它创建后的切换操作总是会切换到最高优先级的任务运行,而一般我们都是用高优先级的任务进行所有低优先级任务的创建,因此任务仍然会返回起始任务继续创建其它任务。
所以与此相关的事件创建(如消息邮箱)程序必须要放在相关的即将创建的高优先级任务中。
>16、现象:在使用消息邮箱进行工程"E:\htwang\uCOS_Homework\uCOS_Homework"调试时,发现消息邮箱的指针DispMbox总是被不正常修改(因此程序也就不能正常运行)。
检查调试:经反复检查调试,发现在一个任务中使用了一个100字节的字符数组,而给这个任务分配的堆栈长度只有64个字节,分析应该是由于堆栈溢出造成的上述现象。