图2-8 K60 JTAG电路
2.5.3 Kinetis写入器与K60核心板
1. Kinetis微控制器写入器
开发人员可以通过10芯标准JTAG接口对K60目标板中的Flash进行擦除、写入等操作。通过写入器将机器码下载到Flash后,可以执行程序并调试。图2-9给出了写入器电路板及实物图。使用该写入器时,一端连接PC的USB接口,一端连接目标板的JTAG接口。
图2-9 Kinetis写入器
2. K60硬件核心板
K60核心板如图2-10所示,该核心板上搭载的K60芯片使用144引脚的MAPBGA封装,电源可通过USB mini 口、JTAG接口或扩展板引入。
K60核心板上提供了1个JTAG接口、4个可编程的LED指示灯、2个TTL电平的UART接口(UART_3和UART_5)和1个miniUSB接口,单独使用K60核心板可进行指示灯、串口通信(TTL电平)、USB通信和Flash在线编程等实验。除此之外,K60核心板还设计了与苏州大学飞思卡尔嵌入式中心设计制作的SD-ExtBoard-D型扩展板的接口,配合扩展板还可完成LED数码管显示、液晶显示、4x4键盘、蜂鸣器、A/D转换、继电器控制、CAN总线通信、I2C总线通信和PWM 输出等实验,并提供了丰富的接口供再次扩展。同时在K60 核心板外侧还设计了与扩展板引脚相同的并行扩展测试端 口,供扩展或测试使用。
2.5.4 硬件最小系统测试方法
前面介绍了硬件最小系统的设计,给出了硬件最小系统元件的参考值。硬件最小系统的详细电路原理图参见网上光盘。
根据原理图制作了印刷电路板后,就开始硬件电路板的焊接和测试了。由于主芯片是MAPBGA 封装,手工无法焊接,所以最小系统可交由工厂焊接。最小系统的测试步骤如下。 (1)在确保电源和地未短路的情况下接通电源,测量电压是否正常,检查按下复位按钮是否能够复位(观察复位指示灯)。
(2)将写入器与电路板连接,启动开发环境对目标MCU进行擦除,如果成功则说明最小系统工作正常。
(3)将第一个样例程序下载到Flash屮,观察小灯闪烁情况。
(4)若自己学习之用,硬件最小系统测试通过以后就可以进行其他模块的焊接。正确的做法是,焊完一个模块后,应紧接着测试该模块工作是否正常,切忌焊接多个模块后再进行测试,因为一旦出现问题,就很难定位具体是哪个模块的问题。
2.6 ARM Cortex-M4的寄存器及指令简介
本节将简要介绍ARM Cortex-M4的寄存器及指令系统,网上光盘提供了指令系统的简明电子文档。
2.6.1 ARM Cortex-M4的寄存器简介
ARM Cortex-M4处理器的寄存器有:R0?R15,如图2-11所示。其中R13作为堆栈指针SP。SP实质上有两个,但在同一时刻只能有一个可以看到,这也就是所谓的“banked”寄存器。特殊功能寄存器有预定义的功能,而且必须通过专用的指令来访问。
图2-11 ARM Cortex-M4处理器的寄存器组
1. 通用寄存器R0?R12
R0?R12是最具“通用目的”的32位通用寄存器,用于数据操作。32位的Thumb-2指令则可以访问所有通用寄存器。但请注意:绝大多数16位Thumb指令只能访问R0?R7。因而R0?R7又被称为低组寄存器。所有指令都能访问它们。它们的字长全是32位,复位后的初始值是不可预料的。R8?R12也被称为高组寄存器。这是因为只有很少的16位Thumb指令能访问它们,32位的指令则不受限制。它们也是32位字长,且复位后的初始值是不可预料的。
2.堆栈指针R13
R13是堆栈指针。在ARM Cortex-M4处理器内核中共有两个堆栈指针,于是也就支持两个堆栈。当引用R13(或写做SP)时,用户用到其中一个的话,另一个必须用特殊的指令来
访问(MRS、 MSR指令),因此任一时刻只能使用其中的一个。这两个堆栈指针分別为
?主堆栈指针(MSP),或写做SP_main,主堆栈指针是复位后缺省使用的堆桟指针,它由OS内核、中断服务例程以及所有需要特权访问的应用程序代码来使用;
?进程堆栈指针(PSP),或写做sp_process,用于常规的应用程序代码(不处于中断服务例程中时),该堆栈一般供用户的应用程序代码使用。
需要注意的是,并不是每个应用都用到这两个堆栈指针。简单的应用程序只用MSP就够了。 堆栈指针用于访问堆栈,并且PUSH指令和POP指令默认使用SP。另外,堆栈指针的最低两位永远是0,这意味着堆栈总是4字节对齐的。在ARM编程领域中,凡是打断程序顺序执行的事件,都被称为异常(Exception)。除了外部中断外,当有指令执行了 “非法操作”,或者访问被禁的内存区间,或者不可屏蔽中断发生时,都会打断程序的执行,这些情况统称为异常。在不严格的上下文中,异常与中断也可以混用。另外,程序代码也可以主动请求进入异常状态的(常用于系统调用)。
3. 连接寄存器R14 (LR)
当调用一个子程序时,由R14存储返回地址。不像大多数其他处理器,ARM为了减少访问 内存的次数(访问内存的操作往往要3个以上指令周期,带MMU和Cache的就更加不确定了),把返回地址直接存储在寄存器中。这样足以使很多只有1级子程序调用的代码无须访问内存(堆栈内存),从而提高了子程序调用的效率。如果多于1级,则需要把前一级的R14值压到堆栈里。在ARM上编程时,应尽量只使用寄存器保存中间结果。在RISC处理器中,为了强调访问操作越过了处理器的界线,并且带来了对性能的不利影响,给它取了一个专业的术语——溅出(Spill)。
4. 程序计数寄存器R15 R15是程序计数器,指向当前的程序地址。如果修改它的值,就能改变程序的执行流(很多高 级技巧隐藏其中)。在汇编代码中也可以使用名字“PC”来访问它。因为ARM Cortex-M4内部使用 了指令流水线,读PC时返回的值是当前指令的地址+4。例如,“0x1000: MOV R0 ; PC R0=0xl004”, 如果向PC中写数据,就会引起一次程序的分支(但是不更新LR寄存器)。ARM Cortex-M4中的指令至少是半字对齐的,所以PC的LSB总是读回0。然而,在分支时,无论是直接写PC的值还是使用分支指令,都必须保证加载到PC的数值是奇数(即LSB=1),用以表明这是在Thumb 状态下执行。倘若写了 0,则视为企图转入ARM模式,ARMCortex-M4将产生一个异常。
图2-12 ARM Cortex-M4中的特殊功能寄存器
5.特殊功能寄存器
ARM Cortex-M4还在内核水平上搭载了 若干特殊功能寄存器(如图2-12所示),包括
程序状态字寄存器组(PSRs或xPSR)、屮断屏蔽寄存器组(PRIMASK、FAULTMASK和 BASEPRI)和控制寄存器(CONTROL),它们 只能由专用的MSR和MRS指令访问,而且它 们也没有存储器地址。
1)程序状态字寄存器(PSRs或xPSR )
程序状态字寄存器在其内部又被分为三个子状态寄存器(如图2-13和图2-14所示):应用程序PSR (APSR)、中断号PSR (IPSR)和执行PSR (EPSR)。通过MRS或MSR指令,这3个PSR既可以单独访问,也可以组合访问(2个组合或3个组合都可以)。当使用三合一的方式访问时,应使用名字“xPSR”或者“PSR”。
2)中断寄存器(PRIMASK、FAULTMASK 和 BASEPRI)
这三个寄存器用于控制异常的使能和禁用。只有在特权级下,才允许访问这3个寄存器,如表2-9所示。
图2-13 ARM Cortex-M4中的程序状态寄存器(xPSR)
图2-14 合成后的程序状态寄存器(xPSR) 表2-9 ARM Cortex-M4中的屏蔽寄存器组
对于时间-关键任务而言,PRIMASK和BASEPR1对于哲时关闭中断是非常重要的。而FAULT- MASK则可以被操作系统用于哲时关闭“错误”处理机能,这种处理在某个任务崩溃时可能需要。 冈为在任务崩溃时,常常伴随着大量的错误。在系统处理这些事物时,通常+再需要响应这些错 误。总之FAULTMASK就是专门留给操作系统用的。
3)控制寄存器(CONTROL )
控制寄存器用于定义特权级别,主要用于选杼当前使用哪个堆栈指针,如表2-10所示。
表 2-10 ARM Cortex-M4 的 CONTROL 寄存器