




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、寄存器和工作模式: 7 种工作模式: fiq/irq/abt/und/sys/usr/svc。通过 MSR cpsr_c,#0 xdx 切换。上电时进入svc 模式。 svc 和 usr 的区别是:svc 可以通过 MSR cpsr_c,#0 xdx 自由切换到其它任何模式,但是 usr 不可以。 各模式下有自己的堆栈。要在程序启动后依次进入各个模式分别设置自己的堆栈,最后进入 usr 模式。 好多个寄存器: r0 - r7 (a1 - a4 / v1 - v4),r15(pc) 在所有模式下都可见。 r8(v5),r9(sb,v6),r10(sl,v7),r11(fp,v8),r12(ip)
2、 fiq 模式下有一组独立的映射。 r13(sp)/R14(lr) 在 usr 和 sys 模式下用同一组映射,其它模式下各有自己的映射。 cpsr 在所有模式下可见。 spsr 在 usr 和 sys 模式下没有映射。 cpsr 是一个最特殊的寄存器,结构如下: 31 30 29 28 278 7 6 5 4 3 2 1 0 N Z C V 保留 I F T M4 M3 M2 M1 M0 其中,N/Z/C/V 分别为负/零/进位/溢出的标志位。在所有模式下都可以进行读操作。 I/F 为中断/快中断禁止位,M4M0 是工作模式控制位,它们在 USR 模式下都不可操作。 T 为 Thum/ARM
3、 模式位,在所有模式下不可直接操作,否则会天下大乱,预取址错误中断可以捕获这种乱局。只能用 BX 指令进行 Thum/ARM 的状态切换。 总之,USR 模式很不方便。在该模式下只可以通过软中断控制 I/F 位。cpsr 只能够用 MSR/MRS 指令来操作。 各工作模式下的 spsr: 在由突发事件引起的模式切换发生时,新模式的spsr 自动保存 cpsr 的值,以备该模式退出时还原 cpsr。在程序的控制下进入某模式时,cpsr 不会自动保存到相应的 spsr。 Prefetch Abort 和 Data Abort 模式: Prefetch Abort 通常会发生在自修改指令之后。而 D
4、ata Abort 发生于向无效内存中取操作数时,通常是数据指针越过边界了。如果在 scatter 文件中不指定边界,若编译时内存分配超过了实际物理内存,一定会有 Data Abort 或 Prefetch Abort 发生。 对特殊功能寄存器的操作: 通常都有两个寄存器操作同一个特殊功能。一个是负责置位,另一个是负责清除。如 VICIntEnable 和 VICIntEnClr, IOxSET 和 IOxCLR 等。这样就使得单独操作某一位或某几位变得非常容易,如:IO0SET = 0 x00001100;IO0CLR = 0 x00000011 等,只变动特定的位,而不影响其他位。当然也可
5、以用IO0PIN = 0 x00001100 直接设置所有的位。 - 存储器映射: 0-1G(0 x0000,0000 - 0 x3fff,ffff): 片内 Flash. 1-2G(0 x4000,0000 - 0 x7fff,ffff): 片内 RAM. 2-3.5G(0 x8000,0000 - 0 xbfff,ffff - 0 xdfff,ffff): 片外存储器。 3.5G - 3.75G(0 xe000,0000 - 0 xefff,ffff): VPB 外设。 3.75G - 4G(0 xf000,0000 - 0 xffff,ffff): AHB 外设。 虽然 ARM7 的寻址
6、空间为 4G,但是 LPC2200 系列只提供 A0A23 总共16M 的地址。片选信号 CS0 - CS3 是 A24 和 A25 的译码输出,将片外存储区 0 x8000,0000 - 0 x83ff,ffff 划分为 bank0 - bank3,共 16M*4=64M. 这 4 个 bank 可以被分别配置为 8/16/32 位总线宽度。复位时,bank0 的总线宽度由 Boot1:0 引脚决定, bank1 为 32 位,bank2 为 16 位,bank3 为8 位。 字节定位信号(BLS0 - BLS3)协调总线宽度和外存芯片数据线宽度。 当 Memory 由“字节宽度器件” (如
7、 62256)或者“未按照字节区分的多字节器件”组成时,应将 RBLE 设置为 0。此时,读访问时 EMC 将BLS0BLS3 拉高。 当 Memory 由“含有字节选择输入的 16 位或 32 位器件”组成时,应将RBLE 设置为 1。此时,读访问时 EMC 将 BLS0BLS3 拉低。 所以,当 Memory 由 62256 组成时,由于不需要“片内字节选择输入” ,故令 RBLE = 0,则 BLS0BLS3 只会与 nWR 同步,可以代替 nWR 使用。 但是,当 Memory 由 IS61LV25616AL 组成时,由于该芯片有 nLB 和nUB 控制低/高 8 位的输入,故令 RB
8、LE = 1,则 BLS0BLS3 与 nRD和 nWR 都会同步,此时,不可以使用 BLS0BLS3 代替 nWR 信号。 地址数据总线:D0 - D31, A0 - A23, OE, WE, CS0 - CS3, BLS0 - BLS3 启动后由 P2.7/P2.6 控制引导方式,然后由程序设置 MEMMAP 决定中断向量的映射。 BCFG0 - BCFG3 控制读写延时和总线宽度。注意复位后的默认值。 PINSEL2 控制引脚功能。 Boot Block LPC2114/2214 的 BootBlock 被固化在最高的 Flash 块中,运行时被映射到 0 x7FFF,E000 - 0
9、x7FFFF,FFFF 的区域。而 LPC2210 没有片内 Flash,但它有 8K 片内 ROM 存储了 BootBlock,也被映射到 0 x7FFF,E000 处。 - VPB 只是 ARM 内部使用的总线,它通过桥与 AHB 总线连接,对用户透明。所以,不必考虑它的存在,只要知道 0 xe000 - 0 xffff,ffff 是外设控制器的地址就可以了。 - VIC: ARM 有 19 个中断源,为其分配了 0 - 18 号 VIC 通道。 向量控制寄存器 VICVectCntl0-15 记录了各个通道号及其使能位。 当中断发生时,VICVectAddr0-15 中的一个值会被 co
10、py 到 VICVectAddr. 如果是非向量中断则 VICdefaultAddr 被 copy 到 VICVectAddr. 程序跳转到 VICVectorAddr 指向的地址。 中断返回时,写 0 x00 到 VICVectAddr. 非向量中断是指那些虽然已经打开(允许) ,但是没有在相应的VICVectorCntl015 和 VICVectorAddr015 中设置的中断。 关于中断设置: 1、首先,硬复位后所有的 Special Function Registor 都有默认值。不必考虑设置的顺序问题。可以先设置好中断,再开通模块功能。 2、软中断(SWI)与非向量中断不同,它的入口
11、是 0 x0000,0008。进入软中断后,系统变为管理模式。而非向量中断入口是 0 x0000,0018。它引导系统进入 fiq/irq 模式。 3、VIC 设置实例: VICIntSelect = 0 x00000000; /所有中断都是 IRQ VICVectCntl0 = 0 x20 | 15; /EINT1 为向量中断,使用 Slot0 VICVectAddr0 = (uint32)EINT1_Exception; /EINT1 中断地址 VICDefVectAddr = (uint32)Default_Entry; /非向量中断地址 VICIntEnable = 0 x000180
12、00; /使能 EINT1 和 EINT2 由于在管理向量中断的 VICVectCntl015 和 VICVectAddr015 中只设置了 EINT1,故 EINT2 中断发生时,要进入非向量中断处理程序Default_Entry。 关于优先级: 在调试 C 语言的多中断程序时,在中断中设断点,调了几个循环就全乱了。开始时怀疑编译器有问题,后来发现是 Debugger 不够好。 测试如下: 1、修改 C Compiler 的优化级别为最低。重新编译。 2、令 Timer0 定时 0.25 秒中断,在中断中将 Test+。 令 EINT3(外部 RTC)1 秒中断,在中断中用 LCD 显示 T
13、est 的值并将一个 LED 取反。然后再用软件延时,占据 CPU0.9 秒或 0.5 秒后才退出中断。 3、令 Timer0 的优先级小于 EINT3。LED 为 1 秒断续,LCD 显示的Test 值一秒加一。 4、令 Timer0 的优先级大于 EINT3。LED 为 1 秒断续,LCD 显示的Test 值一秒加一或加二或加四。 结论:Timer0 中 Test 加一/加二/加四是在 EINT3 退出后的间隙中完成的。所以,IRQ 中可能没有传说中的优先级机制。 关于 Spurious Interrupts: 见 http:/ 的介绍。其中Solution1、2、3 皆可行。当然,最好的
14、办法是不要老是关中断。 在 18App 的主循环中不断关闭/开启 UART 的中断以读取其缓冲区的长度及数据,出现以下现象:程序经常走进 VICDefaultAddress! 解释:当 UART 中断产生时,Core latches the IRQ status,此时,UART的中断被关闭。然后,Core loads IRQ Address from VIC. the VIC will not be able to clearly identify the interrupt that generated the interrupt request, and as a result the V
15、IC will return the default interrupt VICDefVectAddr. - 关于周立功 EasyJTAG 设置: 计算机并口要设为 SPP 模式。 弹出 Fatal Axd Error 时,点击 Connect mode.选择 ATTACH.然后Restart 即可。 - 编译和调试: Project-Remove Object Code.删除当前运行代码,然后可以重新编译。 Axd Debugger 运行时会产生 C:documents and settings%usernamedefault-1-2-0-0.sec.如果在打开 Axd Debugger 时
16、不能自动调入 Image, 可以删除此文件,重新打开 Axd Debugger, 然后调入 Image 即可。 单步执行时对特殊功能寄存器的监视: 要监视 Timer0 寄存器组,从 0 xE000,4000 开始。打开 Processor View-Memory 定位在 0 xE0004000。刚开始运行时监测结果正常,几个循环后,0 xE0004000(T0PR)开始不断变化,而这个寄存器除了初始化时,不应该变化的。本应该变化的寄存器如 0 xE0004008(T0TC)反而不变了。于是打开 Processor Views-Watch,在里面加入 *(unsigned long*)0 xE
17、0004000)至 *(unsigned long*)0 xE000403C)进行观察。发现 Watch 窗口的内容与Memory 中的不同,似乎是 Memory 中的内容与其对应的地址产生了 4个字节的错位。因为 Memory 中 0 xE000400C 的内容总是与 Watch 中0 xE0004008 的内容相近,两者的差别大概是 JTAG 两次读 RAM 的时间差。另外,RAM 的 0 xE000401C 与 Watch 中 0 xE0004018 内容相同。所以,Watch 窗口的内容是正确的。 Debug: Axd 的 Disassembly 窗口:有单三角箭头的两个按钮,用于在小
18、范围内(页内)滚动汇编程序。也有双三角箭头的两个按钮,用于在整个汇编程序的范围内移动。 Axd 的 Low level symbles 窗口可用于观察各变量的地址,此窗口在辅助阅读 Disassembly 时有用。 - 分散加载描述文件.scf 的设置 Metrowerks Code Warrior V1.2 的 Edit-Debug In ExRAM Settings,然后在 Linker-ARM Linker 的 Output 页中,选中 Scatter 选项。在 Scatter的编辑框中选择写好的.scf 文件。(Scatter-Loading description file). 简单
19、应用时可以不写.scf 文件。而在 Output 页中选择 Simple.然后填写RO Base 和 RW Base 的起始地址。在 Lay Out 页中,填写Object/Symble: Startup.o, Section: Start.编写启动文件:Startup.s. 在 Option 页里的 Image Entry Point 填入起始地址。 - Scatter-Load Description File 的结构: .scf 文件中的+RW 对应.s 源文件中的 READWRITE. .scf 文件中的+ZI 对应.s 源文件中的 NOINIT. .scf 文件中的+RO 对应.s
20、源文件中的 READONLY. 在.s 源文件中有: AREA area_name CODE/DATA,READONLY/NOINIT/READWRITE END .scf 的例子: 内容 注解 ROM_LOAD 0 x80000000 Name of Load Region, Start Address for Load Region and Maximum size of Load Region(省略了) ROM_EXEC 0 x80000000 0 x20000 片外存储区,从 0 x80000000 开始,最多 0 x20000 字节。 Startup.o(Vector,+First)
21、 Startup 模块的 Vector 段放在最前面。注 1 *(+RO) 其他所有模块中的所有代码和只读的数据放在这里。 IRAM 0 x40000000 0 x00004000 片内 RAM 区,从 0 x40000000 开始,最多 0 x4000 字节 Startup.o(MyStacks,+first) 指定 Startup.o 中 MyStacks 放在最前面。 Startup.o(+RW,+ZI) Startup.o 中的其他+RW/+ZI 段。注 1 os_cpu_a.o(+RW,+ZI) STACKS 0 x40004000 UNINIT 片内 16K RAM 的顶端,存放不
22、需要被 C library 初始化的段。 Stack.o(+ZI) 注 2 ERAM 0 x80040000 *(+RW,+ZI) HEAP +0 UNINIT +0 表示接着上一段 ERAM 的结尾,继续安排存储区。 Heap.o(+ZI) 注 3 下面是在 scf 文件中引用过的源文件示意: Startup.s code 32 area Vectors,CODE,READONLY entry . end 注 1:在 Startup.o 里面会生成名为 Vectors 的段,段的属性为READONLY Stack.s area Stacks, DATA, NOINIT export Stac
23、kUsr StackUsr SPACE 1 end 注 2: 在 Stack.o 里面会生成名为 Stacks 的段,段的属性为NOINIT,该属性对应 scf 文件中的+ZI. 该段不需要初始化或者可以被初始化为 0. Heap.s area Heap,DATA,NOINIT export bottom_of_heap bottom_of_heap SPACE 1 end 注 3: Heap.o 里面名为 Heap 的段。 在 Scatter 文件中最好每一个 Region 都加一个 Maximum 参数,这样当编译时如果实际使用的空间大于 Maximum Size,会有 Error:162
24、20E: Excution region xxx size (xxx bytes) exceeds limit (xx bytes)。如果地址有重复,会有 Error: 16221E: Excution region xxx overlaps with excution region xxx。前一个 Region 的首地址 + Maximum 后一个 Region 的首地址时不一定有 Error。只有当一分配的内存出现覆盖时才会有 Error。 Region 的 UNINIT 之类的参数要放在 Maximum size 参数之前。 在一个 Region 中,RAM 的分配不是按照罗列的顺序来的
25、。要想让汇编中使用的变量有固定的位置,可以把所有汇编文件产生的.o 放在同一个Region 中。如: IRAM1 0 x40000000 startup.o(+RW,+ZI) ASMSourceCode1.o(+RW,+ZI) ASMSourceCode2.o(+RW,+ZI) IRAM2 +0 CSourceCode1.o(+RW,+ZI) CSourceCode2.o(+RW,+ZI) 这样,所有汇编中定义的变量地址就相对集中了。 如果只有一个汇编文件如 startup.s,也可以这样: IRAM 0 x40002000 0 x1000 startup.o (Mystack,+first)
26、 *(+RW,+ZI) 用一个+first 强行将 startup.s 中的 Mystack 放在 0 x40002000 位置。 在 Edit - DebugRel Settings.-ARM Linker 中选中 Image map。编译后在 Error & Warnings 窗口会显示出详细的内存分配情况。如果在 List file name 中指定一个输出文件名,该祥单会直接存在制定文件中以供多次研究。 - 关于 JTAG 接口: P1.20/TRACESYNC 应该加上拉电阻以禁止 TRACE 功能。PINSEL2 一定要在程序开始时初始化一下。 LPC2210 JTAG 注 1,2
27、/VDD3.3V P1.31/nTRST, input 3/nTRST, output EasyJTAG 中有上拉电阻。 P1.28/TDI, input 5/TDI, output EasyJTAG 中有上拉电阻。 P1.30/TMS, input 7/TMS,output EasyJTAG 中有上拉电阻。 P1.29/TCK, input/output 9/TCK, input/output EasyJTAG 中有上拉电阻。 P1.26/RTCK, input 11/RTCK, output P1.26 外接下拉电阻。 P1.26 有内部上拉电阻,故测量时该引脚会呈现高电平。但是在复位时,
28、它的上拉电阻不起作用,只有外部的下拉电阻起作用,P1.26 = 0V, 所以上电后 PINSEL2 的 D3D0 会是 0 x04(B0100),JTAG 有效。 若将 P1.26 接到 3.3V 再复位,此时 PINSEL2 的 D3D0 将会是0 x00,JTAG 无效。 P1.27/TDO, output 13/TDO, input EasyJTAG 中有上拉电阻。 nRESET, input 15/nRST, output EasyJTAG 中有上拉电阻。 4,6,8,10,12,14,16,18,20/GND 17,19/NC G18 控制板采用 LPC2114,每次运行 Axd 都
29、不会正确调入程序。原因如下: 有一次是因为已经有一个 Axd 在运行了,打开第二个 Axd, 当然不会正确调入程序。 还有一次是重新编译了一下,就好了。 以上两次都不奇怪,奇怪的是下面几次: 在 Config Target - Config - Easy JTag Setup 随便点两下 Halt Mode中的选项,然后一路点击 OK,会出现 Reload the last Image?,点击Yes。有时会有正确的程序被调入,但有时候不成功。要检验是不是已经成功调入了,只要按下 Ctrl-D 显示 Disassembly 窗口,即可看到芯片中的程序是否正确。 在 Option - Config
30、 Interface - Session File - Session file Options 中选择 Reload Images,之后每次启动 Axd 都会提示 The processor ARM_1 already has image(s) loaded. Continue the operation will replace the currently loaded images(s). Do you wish to continue? 选择 Yes, 有时候也可以成功调入程序。 当然,在 Easy JTag Setup - Aux Option 中要选中 Erase Flash wh
31、en need. 固化的程序中有禁止 JTag 调试端口的语句(操作 PINSEL2 的语句),连不上时用 LPC2000 Flash Utility 擦除了 Flash。偶尔可行。 注意使用 LPC2000 Flash Utility 时要先将电路复位,再点 OK. 当然最根本的解决办法是将计算机并口设置为 EPP 模式。其他地方都按照 Default 就可以了。 - 有效用户代码: ARM 把“向量表所有 32 位数据累加和为 0”作为有效用户代码的条件,只适用于使用片内程序存储器的时候,片外程序存储器无此限制。 C 语言程序通常需要一段用于初始化的汇编代码,通常存储为 Startup.s
32、,它实现的任务通常是: 1、做好中断向量表 2、初始化外部总线控制器/堆栈/目标板基本模块。 3、给库函数使用的_user_inital_stackheap。 4、除数为零时的死循环_rt_div0: B _rt_div0。 5、支持加密功能的语句。 6、定义堆栈空间:AREA MyStacks, DATA,NOINIT,ALIGN = 2 要定义栈的起始地址:IrqStackSpace SPACE . 和栈的头部:StackIrq DCD IrqStackSpace + Length*4。因为栈是向下生长的。 与目标板有关的初始化程序可以放在一个名为 Target.c 的文件里。 1、定义中断处理入口:void IRQ_Exception(void), void FIQ_Exception(void), void Timer0_Exception(void)。 2、向量中断控制器初始化。 3、remap,系统时钟,实时时钟,存储器加速。 - C 语言中的延时: _asm nop; nop; 即可。 关注 C 编译器:=的优先级确实比&的高,所以,凡牵扯到逻辑的东西,用()确认优先级,以避免出现低级错误。 - 对定时器
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能化车间厂房建设施工合同规范文本
- 七年级英语下学期期末重难点必刷卷(八)(解析版)
- 湖北省问津联盟2024-2025学年高一下学期5月月考生物试题(含答案)
- 中医养生与慢性病
- 仓储物流设备采购代理服务协议
- 茶叶线上线下营销推广合同书
- 《几种常见的磁场》优教导学案
- 重点练-《地球的自转》
- 财务外包与财务共享中心建设与运营合同
- 主题公园场地租赁与合作经营合同(BF)
- 2025电子产品供销合同
- 安全月考试试题及答案
- java高级程序员面试题及答案
- T/BCEA 003-2022数字工程装配式混凝土结构智慧工地建设导则
- 纳米技术在靶向药物delivery中的创新应用-洞察阐释
- 2025-2030中国反刍饲料行业市场现状分析及竞争格局与投资发展研究报告
- 四川省绵阳市三台县2023-2024学年八年级下学期语文期末试卷(含答案)
- GA/T 594-2006保安服务操作规程与质量控制
- 26个英语字母书写标准练习A4打印
- 教学课件 金属学与热处理-崔忠圻
- (高职)统计学原理(第七版)电子课件教学PPT(完整版)
评论
0/150
提交评论