第七章 ARM平台仿真开发实例
ARM体系结构的处理器是32位嵌入式处理器中占有市场份额最大的一个系列,甚至占到了32位RISC微处理器75%以上的市场份额,基于ARM内核的芯片已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品。ARM体系结构的微处理器正在从各个方面渗入到我们的生活中,因此一谈到32位嵌入式系统,就不得不提到ARM体系结构的微处理器。本章将介绍基于Proteus硬件电路仿真和Realview2.2集成软件开发工具的ARM处理器的仿真实例。
7.1 ARM平台上的开发工具
Proteus硬件电路仿真工具的基本使用方法在第四章已经做了介绍,如果有读者还不太熟悉可以参考前面的相关内容,本章不再介绍Proteus的相关操作,而是主要介绍ARM处理器的集成开发工具RVDS。
7.1.1 RVDS2.2简介
Real View Development Suite(RVDS)是安谋国际科技公司继SDT与ADS1.2之后主推的新一代开发工具。RVDS集成的RVCT是业内公认的能够支持所有ARM处理器,并提供最好的执行性能的编译器。RVD是ARM系统调试方案的核心部分,支持含嵌入式操作系统的单核和多核处理器软件开发,可以同时提供相关联的系统级模型构建功能和应用级软件开发功能,为不同用户提供最为合适的调试功效。
RVDS包含有四个模块。
(1)IDE:RVDS中集成了Eclipse IDE,用于代码的编辑和管理。支持语句高亮和多颜色显示,以工程的方式管理代码,支持第三方Eclipse功能插件。
(2)RVCT:RVCT是业界最优秀的编译器,支持全系列的ARM和XSCALE架构,支持汇编、C和C++。
(3)RVD:是RVDS中的调试软件,功能强大,支持Flash烧写和多核调试,支持多种调试手段和快速错误定位。
(4)RVISS:是指令集仿真器,支持外设虚拟,可以使软件开发和硬件开发同步进行,同时可以分析代码性能,加快软件开发速度。
7.1.2 新建RVDS工程步骤
1.在RDVS-2.2下创建工程及设置
(1)在开始菜单下选择ARM-Real View Developer Suite-V2.2 CodeWarrior for RVDS。
(2)在打开的窗口下选择File-New命令,弹出窗口如图7-1所示。
图7-1 新建工程窗口
(3)在左边选择“ARM Executable Image”,在Project name栏下输入uart作为工程名,在Location栏下输入“实验二”作为路径。
(4)单击“确定”按钮,弹出工程管理窗口,即创建了“uart.mcp”工程,与该工程相关的所有文件都在该工程目录下,见图7-2。
(5)在工程管理器中更改Debug为Release,如图7-3所示。
需要说明的是,Debug版本是调试版本,生成的目标代码中包含了调试信息。Release版本是应用程序发行版本,生成代码中不包含调试信息,而且编译器还可以对速度和代码大小进行优化。
(6)在菜单中选择Edit-Release Settings命令,弹出如图7-4所示窗口,在Post-Linker下拉菜单中选择ARM Real View fromELF。
(7)在左侧表框中选择Language Settings-Real View Assembler,出现如图7-5所示界面,然后进行汇编器设置。这个汇编器是armasm,ARM体系结构选择ARM7TMDIS,即字节顺序默认为小端模式,其他设置默认即可。
图7-2 工程编辑窗口
图7-3 工程类型设置
(8)在左侧列表中选择Language Compile Realview Compiler进行编译器设置,体系结构选择ARM7TDMI-S,字节顺序为小端模式,其他设置不变,如图7-6所示。
(9)在左侧列表框中选择Linker-Realview Linker,然后在Linktype中选择scattered单选按钮并指定mem.scf文件的路径(可指定为……\UART0\mem.scf,或将该文件拷贝到UART文件夹下直接指定为……\UART\mem.scf),如图7-7所示。
(10)在右侧窗口中选择Options选项卡,出现如图7-8所示界面。在Image entry point栏中输入0x00,指定映像文件入口地址,当映像文件被加载时,会跳到该处开始执行。
(11)在左侧列表框中选择Linker Real View FromELF,在Output fromat下拉框中选择Intel 32 bit hex,在Output file name栏中输入完整的输出文件名uart.hex。
(12)其他选项使用默认选项,单击窗口中的OK按钮,保存设置。
图7-4 工程输出文件格式设置窗口
图7-5 工程目标芯片设置窗口
图7-6 工程编译参数设置窗口
图7-7 工程编译时内存配置文件设置窗口
图7-8 工程运行时入口地址设置窗口
2.在工程中添加源文件
(1)将UART0文件夹下的所有C程序、所有头文件*.h和*.s文件都拷贝到UART文件夹下,然后在菜单中的Project菜单下选择Add Files命令,将.s和.c文件都添加到工程中去,添加后的界面如图7-9所示。
图7-9 工程文件列表窗口
(2)在菜单中选择Project Make命令进行编译和链接,没有出现提示信息则说明没有错误和警告产生。注意到新加入的文件前面有红色的“√”说明文件还没编译过,如果编译了则红色“√”会自动消失。如图7-10所示。
图7-10 工程文件列表窗口
7.2 ARM平台仿真开发实例
由于很多ARM处理器出于成本和灵活性的考虑,没有在微处理器内部设计存储器,如果采用这种ARM处理器搭建一个硬件仿真电路,其电路复杂性将大大提高。本书中为了减小相应的工作量,提高系统的验证性特点,帮助读者学习ARM处理器的使用和编程,选择了飞利浦公司生产的LPC2124作为实例的核心处理器。该微处理是单片32位ARM微控制器,片内置有闪存和RAM,可以直接将程序写到处理器中,并且可以直接在片上运行,这样外围电路可大为减少。实际上,用户使用ARM处理器时很多时候并不会自己去设计处理器与存储器之间的接口,因为除了电路本身复杂外,还有电路板的设计困难和加工困难等一系列问题(往往需要6层电路板)。因此,很多时候在作系统开发时,往往采用购买核心电路板、自己设计加工外围电路的方式进行系统开发。所谓核心电路板,就是含有微处理器和程序存储器、数据存储器的电路板,该电路板通过一系列接口将用户关心的I/O信号接到外围,而不需要考虑微处理器与存储器之间的连接问题。这对于产品开发和设计具有十分现实的意义。
LPC2124是一个拥有ARM7TDMI-S核心的嵌入式微处理器,片内带有256KB的高速Flash存储器、16KB静态存储器;采用LQFP64封装,其体积仅仅只有10×10×1.4mm,集成了两个32位定时器(可实现4路捕捉和4路比较通路)、提供4路10位ADC转换速度可达2.4μs、能够支持6路PWM输出、两路串行通信接口、46个GPIO以及9个外部中断引脚,使它十分适用于工业控制、医疗系统、访问控制和电子收款机(POS)等电子产品。该器件在通信网关、协议转换器、嵌入式软件调制解调器等领域中也得到广泛应用。LPC2124功能引脚详见图7-11所示。
图7-11 LPC2124功能引脚示意图
LPC2124的主要特性包括以下方面。
(1)可加密:全球首个实现可加密的ARM微控制器。
(2)通过片内boot装载程序实现在系统编程(ISP)和在应用编程(IAP)。
(3)Embedded ICE可实现断点和观察点。当使用片内Real Monitor软件对前台任务进行调试时,中断服务程序可继续运行。
(4)嵌入式跟踪宏单元(ETM)支持对执行代码进行无干扰的高速实时跟踪。
(5)4路10位A/D转换器,转换时间低至2.44μs。
(6)两个32位定时器(带4路捕获和4路比较通道)、PWM单元(6路输出)、实时时钟和看门狗;多个串行接口,包括两个16C550工业标准UART、高速I2C接口(400 k Hz)和两个SPI接口;通过片内PLL可实现最大为60MHz的CPU操作频率。
(7)向量中断控制器。可配置优先级和向量地址,多达46个通用I/O口(可承受5V电压)、9个边沿或电平触发的外部中断引脚。
(8)片内晶振频率范围:10~25MHz。
(9)两种低功耗模式:空闲和掉电。
(10)通过外部中断将处理器从掉电模式中唤醒。
—CPU操作电压范围为1.65~1.95V(1.8V±0.15V);
—I/O操作电压范围为3.0~3.6V(3.0V±10%),可承受5V电压。(参考ZLG LPC2114/2124/2212/2214使用指南)
7.2.1 LPC2124的中断编程
1.LPC2124内存空间和引脚配置介绍
LPC2124的地址空间分布如图7-12所示。
图7-12 LPC2124地址空间分配示意图
在这个地址空间中,片内程序存储器占用了最低端的256KB空间,RAM占用了从1G地址开始的16KB空间,另外,还有一个重映射区位于2G地址以下的16K地址空间。在我们的实例中,内存配置文件mem.scf文件中的地址配置应与该地址空间配置一致。本实例中的地址配置如下:
ROM_LOAD 0x00000000
{ROM_EXEC 0x00000000//代码存放起始地址
{Startup.o(vectors,+First)
LPC2124可提供的I/O引脚由PO口和P1口组成,每个端口包括32位引脚,但在2124中,P1口的0~15号引脚并没有开放,在芯片上也没有标出,只能使用16~31号引脚。在PO口和P1口的这48个引脚中,P0口的32个引脚均可以通过设置特殊功能寄存器来改变引脚的功能,P1口的低16个引脚也可以设置为通用I/O或调试/跟踪引脚使用。配置用的特殊功能寄存器为PINSEL0~PINSEL2,其配置的基本方式如下:
PINSEL0、PINSEL1用于对PORT0端口的32位引脚进行设置,PINSEL0、PINSEL1寄存器每个寄存器有32位,两个寄存器加起来共64位。这64位由低至高每两位对应P0口的一个引脚,这两位的变化将引起P0的引脚功能的变化。
寄存器具体对应的引脚功能变化如下:
PINSEL0[31:0]对应P0.15~P0.0;PINSEL1[31:0]对应P0.31~P0.16。具体的设置值和引脚的对应关系请参考该芯片的数据手册。
PINSEL2寄存器则与P1口的低16位引脚功能设置对应,这16位引脚按功能被分为两组,一组是P1.16~P1.25,可作为通用I/O或跟踪端口使用;另一组是P1.26~P1.31,可作为通用I/O或调试端口使用。其设置关系如表7-1所示。
表7-1 PINSEL2对P1端口的设置
LPC2124的引脚输出值的控制由以下寄存器控制。
(1)GPIO管脚值寄存器(IO0PIN-0x E0028000,IO1PIN-0x E0028010)。
该寄存器提供GPIO管脚的值,它反映了外部环境对管脚的影响。
(2)输出置位寄存器(IO0SET-0x E0028004,IO1SET-0x E0028014)。
当管脚配置为GPIO输出模式时,可使用该寄存器从管脚输出高电平。写入1使对应管脚输出高电平,写入0无效。如果一个管脚被配置为输入或第二功能,写IOSET无效。读IOSET寄存器返回GPIO输出寄存器中的值。该值由前一次对IOSET 和IOCLR(或前面提到的IOPIN)的写操作决定。该值不反映任何外部环境对管脚的影响。
(3)GPIO输出清零寄存器(IO0CLR-0x E002800C,IO1CLR-0x E002801C)。
当管脚配置为GPIO输出模式时,可使用该寄存器从管脚输出低电平。写入1使对应管脚输出低电平并清零IOSET寄存器中相应的位,写入0无效。如果一个管脚被配置为输入或第二功能,写IOCLR无效。
(4)GPIO方向寄存器(IO0DIR-0x E0028008,IO1DIR-0x E0028018)。
当管脚配置为GPIO模式时,可使用该寄存器控制管脚的方向。任意管脚的方向位的设置必须与管脚功能一致。=0时表示输入,=1时表示输出。
有一点需要大家注意,在使用带有方向寄存器的单片机中,如果把一个通用IO引脚设置为输入,并且需要判断该引脚的状态时,应使用对应的管脚值寄存器,而不是输出寄存器。否则无法正确获取引脚上的状态。
2.LPC2124中断及相关寄存器
LPC2124共有19个中断源,其中有4个是外部中断,对于外部中断的管理主要有4个相关的寄存器。EXTINT寄存器包含中断标志。EXTWAKEUP寄存器包含使能唤醒位,可使能独立的外部中断输入将处理器从掉电模式唤醒。
EXTMODE和EXTPOLAR寄存器用来指定管脚使用电平或边沿激活方式,具体功能如下。
(1)外部中断标志寄存器(EXTINT-0x E01FC140)
当一个管脚选择使用外部中断功能时,对应在EXTPOLAR和EXTMODE寄存器中的位选择的电平或边沿信号,将置位EXTINT寄存器中的中断标志。这样就对向量中断控制器提出中断请求,如果管脚中断使能,则产生中断。
通过向EXTINT寄存器的位EINT0~位EINT3写入1来将其清零。电平触发方式下,该操作只有在管脚处于无效状态时才有效。
(2)外部中断唤醒寄存器(EXTWAKE-0x E01FC144)
EXTWAKE寄存器中的使能位允许外部中断将处理器从掉电模式唤醒。相关的EINTn功能必须映射到管脚才能实现掉电唤醒,但中断并不是要为了实现唤醒操作而在向量中断控制器中被使能。这样做的好处是允许外部中断输入将处理器从掉电模式唤醒,但不产生中断(只是简单地恢复操作),或者在掉电模式下使能中断而不会将处理器唤醒(这样,当应用中并不需要唤醒特性时,也不必关闭中断)。
(3)外部中断方式寄存器(EXTMODE-0x E01FC148)
EXTMODE寄存器中的位用来选择每个EINT脚是电平或边沿触发。只有选择用作EINT功能并已通过VICIntEnable使能的管脚才能产生外部中断功能的中断(当然,如果管脚选择用作其他功能,则产生其它功能的中断)。
当某个中断在VICIntEnable中被禁能时,软件应该只改变EXTMODE寄存器中相应位的值。中断重新使能前,软件向EXTINT写入1来清除EXTINT位,EXTINT位可通过改变触发方式来置位。
(4)外部中断极性寄存器(EXTPOLAR-0x E01FC14C)
在电平激活方式中,EXTPOLAR寄存器用来选择相应管脚是高电平或低电平有效。在边沿触发方式中,EXTPOLAR寄存器用来选择管脚上升沿或下降沿有效。只有选择用作EINT功能并已通过VICInt Enable使能的管脚才能产生外部中断功能的中断(当然,如果管脚选择用作其他功能,则产生其它功能的中断)。
中断与其中断处理程序之间的关系通常可以通过中断向量的方式来联系。但是在LPC2124中,中断与中断向量之间的关系却不是固定的,可以通过用户设定某个中断的中断向量号,以调整其中在向量中的中断优先级。在LPC2124中有一个向量中断控制器,可以控制16个中断向量与中断处理程序,每个中断向量与哪一个中断相关联可以编程设定。也就是说,每个中断到底使用哪一个中断向量可以由用户自己设定。LPC2124涉及与中断向量相关特殊功能寄存器有以下几种。
(1)软件中断寄存器(VICSoftInt-0x FFFFF018,读/写)。对该寄存器的操作可以用软件产生中断,当某位写为1时,将使该位对应中断被触发。
(2)软件中断清零寄存器(VICSoftIntClear-0x FFFFF01C,只写)。通过将某位写入1,清除对应软件中断寄存器的中断标志。
(3)所有中断状态寄存器(VICRawIntr-0x FFFFF008,只读)。每一位用于描述1个中断源的中断是否产生,当某变为1时,表示对应中断产生。
(4)中断使能寄存器(VICIntEnable-0x FFFFF010,读/写)。当读取该寄存器时,1表示中断请求使能为FIQ或IRQ。当写该寄存器时,1使能中断请求或软件中断,0无效。
(5)中断使能清零寄存器(VICIntEnClear-0x FFFFF014,只写)。用于清除并禁止某1个或两个中断。操作方式是将待清除和禁止的中断对应位写入1。写入0的位将不会影响到中断使能寄存器中的状态。
(6)中断选择寄存器(VICIntSelect-0x FFFFF00C,读/写)。该寄存器的每1位对应一个中断源的中断方式,当某位设置为1时表示其对应的中断为快速中断,设置为0时表示该中断处于IRQ状态。
(7)IRQ状态寄存器(VICIRQStatus-0x FFFFF000,只读)。当某位为1时,表示哪些中断源产生中断,为0的位表示该中断源未产生IRQ中断。
(8)FIQ状态寄存器(VICFIQStatus-0x FFFFF004,只读)。当某位为1时,表示哪些中断源产生FIQ中断,为0的位表示该中断源未产生FIQ中断。
(9)向量控制寄存器0~15(VICVectCntl0~15-0x FFFFF200-23C,读/写)。该寄存器共有16个,分别控制0~15的中断向量,当寄存器的第5位为1时表示该中断向量使能,可以转入中断处理程序。其低5位即0~4位用于表示与该中断向量相匹配的中断源编号,也就是说,任意一个中断源可以使用任意一个中断向量。但是,应注意不要将一个中断源分配两个中断向量,否则可能产生多次中断处理。
(10)向量地址寄存器0~15(VICVect Addr0~15-0x FFFFF100-13C,读/写)。该寄存器与向量控制寄存器配套使用,用于存放与中断向量号对应的中断处理程序的入口地址。中断优先级按编号从小到大的顺序排列,即中断向量号越小的优先级越高。
(11)默认向量地址寄存器(VICDef Vect Addr-0x FFFFF034,读/写)。该寄存器存放了一个默认的中断处理程序入口地址,当中断向量中没有中断发生,但是又有程序试图读取向量地址寄存器VICVect Addr时,将该地址作为默认地址传给读取者。
(12)向量地址寄存器(VICVect Addr-0x FFFFF030,读/写)。该寄存器用于存放当前中断向量中优先级最高的中断处理程序入口地址。该地址通过优先级比较后从VICVect Addr0~15中获得。
(13)保护使能寄存器(VICProtection-0x FFFFF020,读/写)。该寄存器的最低位为1时,表示中断向量寄存器只能在特权模式下访问。当最低位为0时,中断向量寄存器可在用户模式或特权模式下访问。
接下来将介绍一个基于中断编程的实例。在本例中将使用中断向量控制器的向量IRQ功能实现EINT1的中断处理,利用中断处理程序点亮一个发光二极管。读者可以通过该实例学习LPC2124的中断使用和编程方法。
3.硬件电路说明(www.xing528.com)
在Proteus下完成以下电路图的设计,如图7-13所示。关于Proteus的绘制过程可以参考第四章的相关内容,这里就不再重复。电路完成后保存到“EINT1”文件夹下。
4.程序代码分析与介绍
程序的流程图如图7-14所示。
程序采用了基于简单循环的设计思想,主程序在初始化端口和中断相关寄存器后,将进入一个死循环,这个死循环中不做任务操作,只用于等待外部中断的发生。
RVDS中对于中断处理程序向中断向量的注册不是由编译器自动完成的,而是在程序中由程序员编程将中断向量寄存器指向特定中断处理程序的方式来实现的。读者
可以根据前面关于RVDS的介绍,创建一个LPC2124的工程,并创建对应的内存配置文件mem.scf和程序文件EINT1.C完成整个实例。完成程序并编译通过后,将程序放到Proteus的电路中进行仿真运行,可以看到每按一下开关,将使LED状态发生一次变化。当LED被点亮时,按下开关,将关闭该LED;再次按下开关,又将点亮LED。在窗口左边的“Files”栏中双击main.c,该程序是下载到仿真电路中的软件主程序,
理解以下代码功能。
图7-13 外部中断实例电路图
图7-14 外部中断实例流程图
通过本实例,读者可以更准确地理解LPC2124的中断使用和编程的方法,并在本实例的基础上完成进一步的学习。
7.2.2 异步串口功能实例
1.LPC2124异步串口介绍
串口是单片机与外界交换数据的重要接口,同时也是软件开发重要的调试手段。使用好串口对于嵌入式系统开发具有十分重要的现实意义。
LPC2124可以支持各种串口,包括常用的异步串行口UART、同步串行口I2C、SPI等。作为外部连接的接口,UART是使用最为广泛和频繁的一种接口。在第五章8位单片机开发实例中也有介绍。本实例将介绍在ARM处理器中如何使用异步串行通信口进行通信编程。
在LPC2124中,异步串行通信的主要设置参数包括串口功能与I/O引脚配置、传输速率设置、数据格式设置及其他参数设置等方面。
(1)在使用异步串行通信口时需要将可用作UART的引脚设置为对应的功能。在LPC2124中,如果使用UART0则可以通过设置PINSEL0寄存器,将其1∶0,3∶2均设置为01。这样就可以将P0口的引脚0和1,分别与UART的Tx D和Rx D相联。
(2)串口数据格式设置。LPC2124的每个串口都有一个控制寄存器,串口的数据格式由该配置寄存器完成。对于UART0,其控制寄存器是U0LCR各位描述如表7-2所示。
表7-2 UART0线控制寄存器说明(U0LCR-0x E000C00C)
(3)波特率设置。LPC2124的串口波特率是由波特率时钟和除数锁存器共同决定的。除数锁存是波特率发生器的一部分,它保存了用于产生波特率时钟的VPB时钟(pclk)分频值,波特率时钟必须是波特率的16倍。U0DLL和U0DLM寄存器一起构成一个16位除数,U0DLL包含除数的低8位,U0DLM包含除数的高8位。值0X00被看做是0X01,因为除数不允许为0。当访问UART0除数锁存器时,除数锁存器访问位(DLAB)必须为1。
波特率计算公式为:波特率=单片机主频/16/分频值。
(4)数据发送与接收设置。U0THR是UART0发送缓冲器的最高字节,它包含了发送缓冲器中最新的字符,可通过总线接口写入。LSB代表最先发送的位。如果要访问U0THR,U0LCR的除数锁存访问位(DLAB)必须为0,U0THR为写寄存器。
(5)串口状态寄存器。在使用串口的过程,了解串口状态是最常用的操作之一,单片机中通过一个特定的状态寄存器提供对串口状态的描述。UART0的状态寄存器是U0LSR。THRE(发送保持寄存器空)当检测到UART0 THR空时,THRE置位,U0THR写操作清零该位。TEMT(发送器空)当U0THR和U0thr TSR都为空时,TEMT置位。当U0TSR或U0THR包含有效数据时,TEMT清零。状态寄存器各位功能详见表7-3所示。
表7-3 状态寄存器各位功能介绍(U0LSR-0x E000C014,只读)
接下来的实例将介绍一个简单程序,完成从单片机的UART0接口向虚拟终端发送字符串的程序,以帮助读者掌握如何设置和使用LPC2124的串行通信端口。
2.硬件电路说明
本实例的仿真电路如图7-15所示。图中仅使用了一个LPC2124的单片机和一个Protues仿真软件中的一个虚拟终端工具。在放置好LPC2124及各电源后,将其工作频率设置为11.0592MHZ,然后放置虚拟终端。虚拟终端使用的具体操作方法如下:
图7-15 串行通信实例电路图
在Protues的ISIS软件主界面中选择左侧工具按钮“”,将弹出可使用的虚拟设备窗口,选择虚拟终端VIRTUAL TERMINAL放置到图形设计窗口中,在该终端上单击鼠标左键,打开设置窗口将其速率设为9600,8位数据,无奇偶校验,1位停止。
根据波特率的计算方法,可以算得LPC2124的通信速率为11059200/16/72=9600。110592是一个常用的晶振频率,因为它是9600波特率的整数倍,这样的频率分频后在串口产生错误的可能性会降低。类似的晶振频率还有7.3728 MHz、14.7456 MHz等。
7.2.3 同步串口功能实例
1.LPC2124同步串口介绍
LPC具有两个完全独立的SPI控制器,遵循串行外设接口(SPI)规范,可以实现同步、串行、全双工通信,最大数据位速率可达输入时钟速率的1/8。
SPI0和SPI1是一个全双工的串行接口。它们设计成可以处理在一个给定总线上多个互连的主机和从机。在一定的数据传输过程中,接口上只能有一个主机和一个从机能够通信。在一次数据传输中,主机总是向从机发送一个字节数据,而从机也总是向主机发送一个字节数据。
SPI串口需要区分主机和从机。LPC配置在不同方式下,其引脚功能会有所不同。在SPI同步通信方式下,需要由主机提供SPI通信双方的同步时钟。所以,当LPC2124配置为主机时,需要设置其时钟计时器参数,而作为从机时则不需要设置该值,只需要考虑主机方的时钟是否小于本机主频的1/8即可。
另外,在同步传输时还会有一些异常情况的处理,具体包括以下几个方面。
(1)读溢出。当SPI模块内部的读缓冲区包含没有读出的数据,而新的传输已经完成,那么这时候就会发生读溢出。SPIF位置位,表示读缓冲区包含了有效数据。当一次传输结束时,SPI模块需要将接收到的数据移到读缓冲区。如果SPIF位置位(读缓冲区已满),新接收到的数据将会丢失,而状态寄存器的读溢出(ROVR)位将置位。
(2)写冲突。我们在前面提到过,在SPI总线接口与内部移位寄存器之间没有写缓冲区。这样,在SPI数据传输过程当中不应向SPI数据寄存器写入数据。不能向SPI数据寄存器写入数据的时间从传输启动时开始,直到SPIF置位时读取状态寄存器为止。如果在这段时间内写SPI数据寄存器,写入的数据将会丢失,状态寄存器中的写冲突位(WCOL)置位。
(3)模式错误。SSEL信号在SPI模块为主机时必须无效。当SPI模块为主机时,如果SSEL信号被激活,表示有另外一个主机将该器件选择为从机。这种状态称为模式错误。当检测到一个模式错误时,状态寄存器的模式错误位(MODF)位置位,SPI信号驱动器关闭,而SPI模式转换为从模式。
(4)从机中止。如果SSEL信号在传输结束之前变为高电平,从传输将被认为中止。此时,正在处理的发送或接收数据都将丢失,状态寄存器的从机中止(ABRT)位置位。
每个SPI接口有5个特殊功能寄存器用于控制,这5个寄存器长度均为8位。各寄存器的功能描述如下。
(1)SPI控制寄存器(S0SPCR-0x E0020000,S1SPCR-0x E0030000)
SPCR寄存器根据每个配置位的设定来控制SPI的操作。其功能详见表7-4。
表7-4 控制寄存器功能描述
(2)状态寄存器(S0SPSR-0x E0020004,S1SPSR-0x E0030004)
SPSR寄存器用于描述,当前SPI接口的状态,以确定当前的通信是否正确执行。其功能详见表7-5。
表7-5 状态寄存器功能描述
(3)SPI数据寄存器(S0SPDR-0x E0020008,S1SPDR-0x E0030008)
双向数据寄存器为SPI提供数据的发送和接收。发送数据通过将数据写入该寄存器来实现,SPI接收的数据可从该寄存器中读出。处于主模式时,写该寄存器将启动SPI数据传输。从数据传输开始到完成标志置位,且还没有读取状态寄存器的这段时间内不能对该寄存器执行写操作。该寄存器只有低8位有效。
(4)SPI时钟计数寄存器(S0SPCCR-0x E002000C,S1SPCCR-0x E003000C)
该寄存器控制主机SCK的频率。寄存器的值表示将单片机主频分频的比例,从而提供SPI时钟。该寄存器的值必须为偶数,因此bit0必须为0。该寄存器的值还必须大于或等于8。如果寄存器的值不符合上述条件,可能导致产生不可预测的动作。
(5)SPI中断寄存器(S0SPINT-0x E002001C,S1SPINT-0x E003001C)
该寄存器包含SPI接口的中断标志,SPINT的最低位为1时表示发生SPI中断,通过向该位写1清除其值。
2.硬件电路说明
本实例中,使用SPI接口控制一个移位寄存器,输出一个数值到8段数据管上显示。利用SPI接口,可以十分方便地实现对多位8段数码值的显示等操作。详见图7-16所示。
图7-16 SPI接口电路原理图
该程序将实现循环往复地在数码管上显示0~F的符号。在实际工程中,这种方式可以方便地对数码进行控制,是一种十分简单的数据通信方法。有兴趣的读者可以将多个595串联起来,实现多个数码管的显示控制。当然,也可以用另一片LPC2124作为从机进行数据交互操作的实践,以更好地掌握SPI接口的功能和使用方法。
7.2.4 定时器控制实例
1.LPC2124定时器介绍
LPC2124具有两个32位可编程定时/计数器,均具有4路捕获、4路比较匹配并输出电路。定时器对外设时钟(pclk)周期进行计数,可选择产生中断或根据4个匹配寄存器的设定,在到达指定的定时值时执行其他动作。其捕获功能,可以在特定引脚信号发生跳变时捕获定时器的定时值。与定时器控制相关的特殊功能寄存器如下。
(1)中断寄存器(IR:定时器0-T0IR:0x E00040000;定时器1-T1IR:0x E0008000)
中断寄存器包含4个位用于匹配中断、4个位用于捕获中断。如果有中断产生,IR中的对应位会置位,否则为0。向IR某位写入1可以复位相应中断,写入0无效。
(2)定时器控制寄存器(TCR:定时器0-T0TCR:0x E0004004;定时器1-T1TCR:0x E0008004)
定时器控制寄存器TCR用于控制定时器计数器的操作,只有最低两位有效。当最低位为0时表示对应定时/计数器被关闭,为1时该定时/计数器使能;次低位为1时将定时/计数器复位。
(3)定时器计数器(TC:定时器0-T0TC:0x E0004008;定时器1-T1TC:0x E0008008)
当预分频计数器到达计数的上限时,32位定时器计数器加1。如果TC在到达计数上限之前没有被复位,它将一直计数到0x FFFFFFFF然后翻转到0x00000000。该事件不会产生中断。如果需要,可用匹配寄存器检测溢出。
(4)预分频寄存器(PR:定时器0-T0PR:0xE000400C;定时器1-T1PR:0xE000800C)
32位预分频寄存器指到预分频计数器的最大值,可以设定对单片机主频的预分频值。
(5)预分频计数器寄存器(PC:定时器0-T0PC:0x E0004010;定时器1-T1PC:0x E0008010)
该寄存器用于预分频计数,程序设计者一般不需要读取其数值。预分频计数器每个pclk周期加1。当其到达预分频寄存器中保存的值时,定时器计数器加1,预分频计数器在下个pclk周期复位。这样,当PR=0时,定时器计数器每个pclk周期加1;当PR =1时,定时器计数器每2个pclk周期加1。
(6)匹配寄存器(MR0-MR3)
匹配寄存器共有4个,每个匹配寄存器中设置一个初始,当该值与定时器计数值相同时,自动触发相应动作。这些动作包括产生中断、复位定时器计数器或停止定时器,所执行的动作由MCR寄存器控制。
(7)匹配控制寄存器(MCR:定时器0-T0MCR:0x E0004014;定时器1-T1MCR:0x E00080014)
匹配控制寄存器用于控制在发生匹配时所执行的操作。每个位的功能见表7-6所示。
表7-6 匹配控制寄存器功能描述
(8)捕获寄存器(CR0-CR3)
捕获寄存器共有4个,每个捕获寄存器都与一个器件管脚相关联。当管脚发生特定的事件时,可将定时器计数值装入该寄存器。捕获控制寄存器的设定决定捕获功能是否使能以及捕获事件在管脚的上升沿、下降沿或是双边沿发生。
(9)捕获控制寄存器(CCR:定时器0-T0CCR:0x E0004028;定时器1-T1CCR:0x E0008028)
当发生捕获事件时,捕获控制寄存器用于控制将定时器计数值是否装入4个捕获寄存器中的一个以及是否产生中断。同时设置上升沿和下降沿位也是有效的配置,这样就会在双边沿触发捕获事件。
(10)外部匹配寄存器(EMR:定时器0-T0EMR:0x E000403C;定时器1-T1EMR:0x E0008003C)
外部匹配寄存器提供外部匹配管脚M(0~3)的控制和状态,每个定时器都可以与4个外部状态变化时产生一个匹配动作,决定在匹配时动作的输出行为。该寄存器的描述如表7-7和表7-8所示。
表7-7 外部匹配寄存器功能描述
表7-8 外部匹配控制描述
除了定时/计数器以外,LPC还带有一个实时时钟系统,可以通过对实时时钟系统的操作获取相关的信息和参数。读者有兴趣可以自己查阅相关资料,了解使用细节。
2.硬件电路说明
在proteus仿真工具软件下,使用LPC2124和二极管、电阻等搭建如图7-17所示电路,并设置好相关电源和工作频率等参数。这里的工作频率可设为11.0592MHz,以确保与程序中的定时/计数器参数一致。
该电路将使用LPC2124的P0.13作为普通输出引脚,在0号定时器的中断处理程序控制下控制发光二极管D2以0.5秒的周期亮灭;P0.12作为时间定时器1的0号匹配输出引脚,在定时器1定时作用下控制发光二极管D1以0.1秒的周期亮灭。
图7-17 定时器实例电路图
7.2.5 LPC2124片上A/D转换编程实例
1.LPC2124片上A/D
A/D转换在控制领域是一个十分重要的功能,因此很多单片机都将A/D转换集成在片上。LPC2124集成了4个位逐次逼近式模数转换器,其电压测量范围为0~3V,每次10位数据转换时间>=2.44μs,支持一个或多个输入的突发转换模式。转换器还可选择由输入跳变或定时器匹配信号来触发转换动作。
A/D转换器的基本时钟由系统分频后的时钟提供。可编程分频器可将时钟调整至逐步逼近转换所需的4.5MHz(最大)。每次转换如果要达到10bit的转换精度要求,需要11个转换时钟脉冲。
与A/D转换直接相关的特殊功能寄存器包括A/D转换控制寄存器ADCR和A/D转换数据寄存器ADDR。它们各位功能描述如表7-9和表7-10所示。
表7-9 A D转换控制寄存器ADCR
表7-10 A/D转换数据寄存器功能描述
转换时,通常将A/D转换器与一个基准电压作比较,以得到转换结果。在LPC2124中这个基准为片上的Vdd A引脚,其最高电压为3V。转换结果将以1023为最大值,对应3V电压;0为最小值,对应0V电压。因此,可以通过简单的转换将ADDR的值转换成对应的电压值。
2.硬件电路说明
在本电路中使用了两个A/D转换通道,每个通道都使用了一个滑动变阻器提供待转换电压,通过改变滑动点,可以改变输入引脚上的电压。经LPC2124完成转换后,转换成数值通过串口送到虚拟终端显示出来。详见图7-18。
图7-18 A/D转换电路原理图
通过该实例,读者可以对LPC2124的片上A/D转换功能使用和编程有一个比较直接的了解和认识。有兴趣的读者也可以将触发式的A/D转换和软件读取式的A/D转换功能作一个尝试,以提高实际应用的能力。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。