1、目 录一、 设计目的3二、 设计原理1、GPIO流水灯 32、SPI 73、定时器10 4、实时时钟12三、 所用仪器18四、EasyARM2131开发套件功能介绍 18五、设计内容:万年历-定时器-流水灯-SPI1、功能描述212、流程图223、程序设计22六、心得体会28七、参考文献29一、设计目的1、根据要求,复习巩固ARM的基础知识。2、掌握ARM系统的设计方法,特别是熟悉模块化的设计思想。3、熟练掌握ARM软件和2131开发板的使用。4、提高综合运用所学的理论知识独立分析和解决问题的能力;二、设计原理 1、GPIO流水灯(1)LPC2131具有多达47个通用I/O 口(GPIO,Ge
2、neral Purpose I/O ports),分别为P031:0、 P131:16,其中,P0.24未用,P0.31仅为输出口。由于口线与其它功能复用,因而需要进行相关的管脚连接模块(PINSEL0、PINSEL1、PINSEL2)选择连接GPIO,然后通过IODIR进行输入/输出属性设置后才能操作。 当管脚选择 GPIO 功能时,有IOSET、IOCLR和IOPIN 3 个寄存器用于控制 GPIO 的使用。IOSET 用于口线置位,而IOCLR 则用于口线清零,IOPIN 则反映当前IO口的状态,读回IOSET 则反映当前IO口设定状态。(2)GPIO的特性和应用特性:单个位的方向控制;
3、 单独控制输出的置位和清零; 所有I/O口在复位后默认为输入。 应用:通用I/O口 驱动LED或 其它指示器 控制片外器件 检测数字输入(3)GPIO引脚描述GPIO管脚描述见表4.1。 表4.1 GPIO 管脚描述 管脚连接设置 将相应管脚的PINSELn 位设置为00 ,即选择GPIO 功能;大部分管脚复位后默认为GPIO。3、 GPIO寄存器LPC2138有2个32 位的通用I/O 口。PORT0 使用了30个管脚,PORT1 有多达16个管脚可用GPIO功能。PORT0和PORT1由2 组(4个)寄存器控制,如表4.2 所示。 表4.2 GPIO寄存器映射4. GPIO输出实验流水灯实
4、验 EasyARM2131 开发板上的 8 路LED(LED8LED1)分别可选择P125:18进行控制,电路如图1所示。 图1当跳线JP12 全部选择LED8LED1 后,P1.25P1.18 分别控制这 8 路LED,就可以进行流水灯实验。流水灯显示花样可以通过数组人为定义,亦可通过一定的算法计算,流程图如图2所示。图2 流水灯程序:/#include config.h/* LED8LED1 8个LED分别由P1.25P1.18控制 */const uint32 LEDS8 = (0xFF 0; dly-)for (i=0; i100000; i+);/* 函数名称 :main()* 函数
5、功能 :流水灯显示实验。* 调试说明 :连接跳线JP12至LED8LED1。*/* 流水灯花样,低电平点亮,注意调用时候用了取反操作 */const uint32 LED_TBL = 0x00, 0xFF,/ 全部熄灭后,再全部点亮0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,/ 依次逐个点亮0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF,/ 依次逐个叠加0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01,/ 依次逐个递减0x81, 0x42, 0x24, 0
6、x18, 0x18, 0x24, 0x42, 0x81,/ 两个靠拢后分开0xA0, 0x50, 0x7e, 0x28, 0x14, 0x0A, 0x05, 0x82,0x81, 0xC3, 0xE7, 0xFF, 0xFF, 0xE7, 0xC3, 0x81/ 从两边叠加后递减;int main (void)uint8 i;/PINSEL1 = 0x00000000;/ 设置管脚连接GPIOPINSEL2 = PINSEL2 & (0x08);/ P125:16连接GPIOIO1DIR = LEDS8;/ 设置LED1控制口为输出while (1)for (i=0; i42; i+)/* 流
7、水灯花样显示 */IO1SET = (LED_TBLi) 18);DelayNS(20);IO1CLR = (LED_TBLi) 0; dly-) for(i=0; i50000; i+); void SSP_Init(void) SSPCR0 = (0x01 8) | / SCR 设置SPI时钟分频 (0x00 7) | / CPHA 时钟输出相位,仅SPI模式有效 (0x01 6) | / CPOL 时钟输出极性,仅SPI模式有效 (0x00 4) | / FRF 帧格式 00=SPI,01=SSI,10=Microwire,11=保留 (0x07 0); / DSS 数据长度,0000-
8、0010=保留,0011=4位,0111=8位,1111=16位 SSPCR1 = (0x00 3) | / SOD 从机输出禁能,1=禁止,0=允许 (0x00 2) | / MS 主从选择,0=主机,1=从机 (0x01 1) | / SSE SSP使能,1=允许SSP与其它设备通信 (0x00 0); / LBM 回写模式 SSPCPSR = 0x52; / PCLK分频值 / SSPIMSC = 0x07; / 中断屏蔽寄存器 SSPICR = 0x03; / 中断清除寄存器uint8 SSP_SendData(uint8 data) / IOCLR = SLAVE_CS; / 选择从
9、机 SSPDR = data; while( (SSPSR & 0x01) = 0 ); / 等待TFE置位,即发送FIFO空 / IOSET = SLAVE_CS; return(SSPDR);uint8 const DISP_TAB16 = / 0 1 2 3 4 5 6 7 8 9 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,/ A b C d E F0x88, 0x83, 0xC6, 0xA1,0x86, 0x8E;volatile uint8 rcv;int main(void) uint8 i; PCONP |= 110;
10、/ PINSEL1 = 0x000002A8; / 设置SSP管脚连接 /PINSEL1 = 0xAA 2; PINSEL1 = (PINSEL1 & (0xFF 2) | (0xAA 2);/ IO0DIR = SLAVE_CS;/ IO0SET = SLAVE_CS; SSP_Init(); / 初始化SSP接口 while(1) for(i=0; i16; i+) rcv = SSP_SendData(DISP_TABi); / 发送显示数据 DelayNS(80); / 延时 return(0);3、定时器(1)LPC2131 具有2 个32 位可编程定时/计数器,均具有4 路捕获、
11、比较路匹配并输出电 路。 定时器对外设时钟(pclk )周期进行计数,可选择产生中断或根据4 个匹配寄存器的设定,在到达指定的定时值时执行其它动作(输出高/低电平、翻转或者无动作)。它还包括4个捕获输入,用于在输入信号发生跳变时捕获定时器值,并可选择产生中断。 可用于对内部事件进行计数的间隔定时器,或者通过捕获输入实现脉宽调制,亦可作为 自由运行的定时器。 定时器0 和定时器 1 除了外设基地址以外,其它都相同。(2)定时器0定时实验查询方式用定时器0实验0.5秒定时,查询标志位等待定时时间到达,对蜂鸣器进行控制,让蜂鸣器每秒钟响一次。程序在T0MR0中设定定时常数,在T0MCR中设置定时器0
12、匹配后复位TC并产生中断标志,接下来程序查询等待中断标志置位。若定时时间到,先清除Timer0中断标志,然后取反BEEP控制口的输出状态,流程图如图5所示。 图5定时器0定时实验流程图定时器程序:/#include config.h#define BEEP 1 115200)return (0);if (set.datab 8)return (0);if (0 = set.stopb) | (set.stopb 2) return (0);if (set.parity 4)return (0);/ 设置串口波特率U0LCR = 0x80;/ DLAB=1bak = (Fpclk 4) / ba
13、ud;U0DLM = bak 8;U0DLL = bak & 0xff;/ 设置串口模式bak = set.datab - 5;if (2 = set.stopb)bak |= 0x04;if (0 != set.parity)set.parity = set.parity - 1;bak |= 0x08;bak |= set.parity 16) & 0xfff;/ 获取 年PC_DispChar(0, SHOWTABLEbak / 1000);bak = bak % 1000;PC_DispChar(1, SHOWTABLEbak / 100);bak = bak % 100;PC_Dis
14、pChar(2, SHOWTABLEbak / 10);PC_DispChar(3, SHOWTABLEbak % 10);bak = (datas 8) & 0x0f;/ 获取 月PC_DispChar(4, SHOWTABLEbak / 10);PC_DispChar(5, SHOWTABLEbak % 10);bak = datas & 0x1f;/ 获取 日PC_DispChar(6, SHOWTABLEbak / 10);PC_DispChar(7, SHOWTABLEbak % 10);bak = (times 24) & 0x07;/ 获取 星期PC_DispChar(8, SH
15、OWTABLEbak);bak = (times 16) & 0x1f;/ 获取 小时PC_DispChar(9, SHOWTABLEbak / 10);PC_DispChar(10, SHOWTABLEbak % 10);bak = (times 8) & 0x3f;/ 获取 分钟PC_DispChar(11, SHOWTABLEbak / 10);PC_DispChar(12, SHOWTABLEbak % 10);bak = times & 0x3f;/ 获取 秒钟PC_DispChar(13, SHOWTABLEbak / 10);PC_DispChar(14, SHOWTABLEba
16、k % 10);void RTCInit (void)PREINT = Fpclk / 32768 - 1;/ 设置基准时钟分频器PREFRAC = Fpclk - (Fpclk / 32768) * 32768;CCR = 0x00;/ 禁止时间计数器YEAR = 2005;MONTH = 01;DOM = 10;DOW = 4;HOUR = 8;MIN = 30;SEC = 59;CIIR = 0x01;/ 设置秒值的增量产生1次中断CCR = 0x01;/ 启动RTCint main (void)UARTMODE uart0_set;PINSEL0 = 0x00000005;/ 连接IO
17、到UART0PINSEL1 = 0x00000000;uart0_set.datab = 8;uart0_set.stopb = 1;uart0_set.parity = 0;UART0_Init(115200, uart0_set);U0FCR = 0x01;/ FIFO使能RTCInit();while (1)while (0 = (ILR & 0x01);/ 等待RTC增量中断ILR = 0x01;/ 清除中断标志SendTimeRtc();return (0);三、实验仪器1、2138开发板 2、ARM软件 3、微型计算机四、EasyARM2131开发套件功能介绍 定位 选用LPC21
18、3x系列ARM开发产品的工程师; 组建嵌入式系统教学与开发实验室; 有购买能力的个人。 概述 EasyARM2131开发板是广州周立功公司设计的EasyARM系列开发套件之一,采用了PHILIPS公司基于ARM7TDMI-S 核、单电源供电、LQFP64封装的LPC2131,具有JTAG仿真调试、ISP编程等功能。 开发板上提供了一些键盘、LED、蜂鸣器等常用功能部件,还具有RS232接口电路、I2C存储器电路。另外,用户也可以更换兼容的CPU进行仿真调试,如LPC2132、LPC2138、LPC2142等。灵活的跳线组合(开发板内使用的所有I/O均可断开连接),还有用户I/O接口,极大地方便
19、了用户进行32位ARM嵌入式系统的开发实验。 参考照片EasyARM2131实验板功能特点 完全自主设计的软硬件、拥有自主版权的JTAG仿真技术; 支持ADS1.2集成开发环境及其PHILIPS所有型号ARM微控制器的仿真与开发; 采用“主板CPU PACK适配器SD卡适配器(标准配置)多种可选配置适配器” 的形式构成EasyARM2131开发套件,标准配置的CPU PACK主芯片为LPC2131FBD; 板上的功能部件与CPU之间,可以使用跳线器选择连接; 全面支持9种型号的64 PIN小管脚ARM7微控制器: LPC213x(LPC2131/2132/2134/2136/2138) 内置U
20、SB接口的LPC214x(LPC2142/2144/2146/2148) 多种免费商业化软件包及其详细的开发文档: * 移植C/OSII到ARM7软件包 * 数据队列软件包 * 串口驱动软件包 * MODEM接口软件包 * SPI总线软件包 * IC总线软件包 * ZLG/FS V1.0版本文件管理系统软件包 * ZLG/GUI图形用户界面软件包 * ZLG/SD卡读写软件包 * ZLG/USB固件程序及其驱动程序软件包 多种可选配置适配器: 各种型号的CPU PACK,用户可按需求和喜好配置主ARM芯片 MG12864点阵图型液晶模块 所有I/O口全部引出,方便用户连接外部电路的开发与使用;
21、 可进行GPIO的控制实验,如键盘输入、蜂鸣器控制、模拟SPI等; 6个独立按键(可用于外部中断、定时器捕获输入),8个LED指示灯; 具有RS232转换电路,可与上位机进行通讯,完成UART通讯实验; 可以与标准串行modem直接接口,方便远程通讯; 具有IC接口和SPI/SSP接口输出; 提供基于PC的人机界面,方便调试实时时钟、串口通信等功能; 可进行外部中断实验,学习向量中断控制器(VIC); 定时器控制实验,如定时控制LED、定时器捕获等; 使用板内的CAT1025(内含复位功能),完成IC总线的实验; 使用74HC595芯片,实现SPI接口数据发送、接收实验; A/D转换实验;DA
22、C转换实验(更换CPU为LPC2132及以上);实时时钟控制实验; WDT及低功耗控制实验; 54个基础实验及其大量的中间件软件包,完整地验证了几乎所有的硬件功能资源; 详细的配套资料(深入浅出ARM7LPC213x/214x(上/下册),北航出版社,中上册为标准配置)。 EasyJTAG仿真器性能介绍和特性 EasyJTAG是一款高性能/低价格的ARM内核仿真器,内部采用了最新Flash更新技术,可以使EasyJTAG不断支持新的ARM内核仿真。EasyJTAG采用ARM公司的业界仿真通讯接口协议RDI 1.51,可以方便的同任何采用RDI接口的IDE调试环境无缝嵌接,是目前国内性能最稳定,
23、功能最强,支持芯片最多(陆续支持)的低价格ARM内核仿真器。 特性: 最新Flash更新技术,方便用户在线升级; 采用RDI通讯接口,无缝嵌接ADS1.2和其它采用RDI接口的IDE调试环境; 高达1M速率的JTAG时钟驱动; 采用同步Flash刷新技术(synFLASH),同步下载用户代码到Flash中,即下即调; 采用同步时序控制技术(synTIME),仿真可靠稳定; 支持Thumb指令和32位ARM指令集的调试; 影射寄存器窗口,方便用户查看/修改寄存器数值; 微型体积设计,方便用户灵活使用; 支持LPC2104/LPC2105/LPC2106、LPC2114/LPC2124/LPC21
24、19/LPC2129/ LPC2194、LPC2210/LPC2212/LPC2214/LPC2290/LPC2292/LPC2294 ARM微控制器。 在上述的特性中,“RDI标准接口/同步Flash刷新技术/影射寄存器窗口”3项技术是国内ARM仿真器设计最领先的3种技术,采用这3种技术的ARM仿真器将给用户带来如下激动人心的性能: RDI接口 是ARM公司提出的调试接口标准,主要用于ARM芯片的JTAG仿真。由于各个IDE厂商使用的调试接口各自独立,硬件无法进行跨平台的调试。现在众多的IDE厂家都逐步采用标准RDI作为ARM仿真器的调试接口,因此使跨平台的硬件调试成为可能。EasyJTAG
25、由于使用标准RDI调试接口,因此在任何使用标准RDI接口的IDE调试环境中都可以使用,例如ARM公司的ADS1.2/IAR公司的EWARM 3.30 。 注意:对于使用RDI接口的调试环境出现的问题,EasyJTAG的技术支持只负责ADS1.2出现的问题。对于其它IDE出现的RDI兼容性/稳定性/速度等方面的问题,EasyJTAG不负责技术支持且并不承当任何责任。同步Flash刷新技术(synFLASH) 是我们最先提出并应用于ARM仿真器的使用上。EasyARM2131开发板功能框图 五、设计内容:万年历-定时器-流水灯-SPI1、功能描述利用定时器控制流水灯和SPI,使流水灯闪烁的步调与万
26、年历秒指示一致,SPI显示倒计时并且与万年历秒指示相一致。2、流程图 3、程序设计#include config.h#define HC595_CS (1 29) / P0.29口为74HC595的片选const uint32 LEDS8 = (0xFF 115200)return (0);if (set.datab 8)return (0);if (0 = set.stopb) | (set.stopb 2) return (0);if (set.parity 4)return (0);/ 设置串口波特率U0LCR = 0x80;/ DLAB=1bak = (Fpclk 4) / baud;
27、U0DLM = bak 8;U0DLL = bak & 0xff;/ 设置串口模式bak = set.datab - 5;if (2 = set.stopb)bak |= 0x04;if (0 != set.parity)set.parity = set.parity - 1;bak |= 0x08;bak |= set.parity 0; dly-)for (i=0; i300; i+);void SendByte (uint8 data)U0THR = data;while (U0LSR & 0X20) = 0);/ 等待数据发送void MSPI_Init(void) /PINSEL0 = (PINSEL0 & 0xFFFF00FF)