摘要本课程是针对嵌入式系统开设的一门综合性、实践性课程。
通过本课程的课堂学习、设计和设计,使选修学生了解嵌入式系统的开发环境和软硬件设计与调试方法,熟悉嵌入式系统的开发流程,了解常见的通信接口的工作方式,掌握嵌入式系统的软硬件基本调试工具和手段,具备嵌入式计算机系统设计与实现的基本能力。
本课程利用PowerQUICC和NetARM等嵌入式通信处理机平台,设计内容软件和硬件相结合。
目录一.设计目的 (1)二.设计仪器及设备 (1)三. 设计内容 (1)四.设计过程 (3)五.结果及问题分析 (11)六.设计总结 (12)七.参考文献 (13)一.设计目的1.熟悉ARM(LPC2131)&ADS V1.2 的环境。
2.了解LPC2131 Demo Board 资源、环境;掌握ADS工具使用。
3.熟练掌握ADS工具的使用,掌握ARM C程序设计、调试技术。
4.理解ARM 芯片引脚功能选择,理解GPIO的使用设置、输入驱动方法。
5.理解UART串行通信原理,学习ARM UART资源的驱动编程。
二.设计仪器及设备EasyARM2131开发设计板。
TKStudio IDE集成开发环境三. 设计内容内容1:ARM(LPC2131)&ADS V1.2环境熟悉LPC2131 硬件环境介绍;ADS 工具简介;要求:了解LPC2131 Demo Board 资源、环境;掌握ADS工具使用。
内容2:ADS 模板工具& ARM C语言程序设计ADS环境中编程模板的理解与使用;使用ADS工具,基于LPC2131进行简单的C程序设计;要求:熟练掌握ADS工具的使用,掌握ARM C程序设计、调试技术;内容3:GPIO Output(LED、Beep)设计理解ARM 芯片引脚功能选择;理解GPIO的使用设置、输出驱动方法;熟练掌握ADS工具,基于LPC2131进行简单的C程序设计;要求:实现一个秒闪航标灯和蜂鸣。
内容4:GPIO Input(Key Input)设计理解ARM 芯片引脚功能选择;理解GPIO的使用设置、输入驱动方法;熟练掌握ADS工具,基于LPC2131进行简单的C程序设计;要求:实现一个秒闪航标灯和可按键控制的蜂鸣器。
内容5:Eint VIC设计理解ARM 芯片引脚功能选择;理解外中断的含义与应用;熟练掌握ADS工具,基于LPC2131进行简单的C程序设计;要求:实现一个秒闪航标灯和可按键控制的蜂鸣器(用外中断方式实现)。
内容6:定时器理解ARM 芯片引脚功能选择;理解GPIO的使用设置、输入/输出驱动方法;熟练掌握AD定S工具,基于LPC2131进行简单的C程序设计;要求:基于ucosII的GPIO、时器、RTC、串口等综合设计。
内容7:异步串行口UART理解ARM 芯片引脚功能选择;理解GPIO的使用设置、输入/输出驱动方法;熟练掌握ADS工具,基于LPC2131进行简单的C程序设计;要求:结合前边内容,实现LPC2131和PC端串行传输数据信息。
四.设计过程1)设计方案用LED灯显示当前电梯的起始楼层和目标楼层用数码管显示电梯当前所在的楼层当电梯到达目标楼层时,用蜂鸣器发出蜂鸣,提示已经到达通过UART来控制输入楼层,中断控制2)流程图开始楼层信号正常吗?Y停车.报警N楼层等待有无呼叫?NY开/关门定向起动运行到站N上/下行控制呼叫.内选记忆Y蜂鸣器提示3)电路图按键输入检测电路图8路LED控制电路图UART0数码管4)程序源代码a.定义模块:#include "config.h"#define BEEP 1 << 7 // P0.7控制蜂鸣器,低电平蜂鸣/* LED8~LED1 8个LED分别由P1.25~P1.18控制 */const uint32 LEDS8 = (0xFF << 18); // P1[25:18]控制LED8~LED1,低电平点亮#define HC595_CS (1 << 29) // P0.29口为74HC595的片选typedef struct Node{uint8 floor;struct Node *next;}Node,*LinkList;/* 定义串口模式设置数据结构 */typedef struct UartMode{uint8 datab; // 字长度,5/6/7/8可选uint8 stopb; // 停止位,1/2可选uint8 parity; // 奇偶校验位,0-无校验,1-奇校验,2-偶校验}UARTMODE;LinkList L;uint8 up,down,keep,stop; // UART0数据接收缓冲区volatile uint8 rcv_new; // 接收新数据标志/* 流水灯花样,低电平点亮,注意调用时候用了取反操作 */const uint32 LED_TBL[] = {//0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, // 依次逐个叠加0x01,0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, // 依次逐个点亮};/* 此表为LED0~F以及L、P的字模 */uint8 const DISP_TAB[] = {// 0 1 2 3 4 5 6 7 8 90xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90};** 函数名称:DelayNS()** 函数功能:长软件延时** 入口参数:dly 延时参数,值越大,延时越久** 出口参数:无** 函数名称:MSPI_Init()** 函数功能:初始化SPI接口,设置为主机。
** 入口参数:无** 出口参数:无** 函数名称:MSPI_SendData()** 函数功能:向SPI总线发送数据。
** 入口参数:data 待发送的数据** 出口参数:返回值为读取的数据b.接收输出模块:** 函数名称:IRQ_UART0()** 函数功能:串口0接收中断服务程序** 入口参数:无** 出口参数:无void __irq IRQ_UART0 (void){Node *p;if ((U0IIR & 0x0F)==0x04){ p=(Node*)malloc(sizeof(Node));rcv_new = 1; // 设置接收到新的数据标志p->floor= U0RBR; // 读取FIFO的数据,并清除中断if ((p->floor-48)>0&&(p->floor-48)<9){p->next=L->next;L->next=p;VICVectAddr = 0x00; // 中断处理结束}else{rcv_new = 0; // 设置接收到新的数据标志VICVectAddr = 0x00; // 中断处理结束}}}** 函数名称:UART0_SendByte()** 函数功能:向串口0发送1字节数据** 入口参数:dat 要发送的数据** 出口参数:无void UART0_SendByte (uint8 dat){U0THR = dat; // 要发送的数据}** 函数名称:UART0_SendBuf()** 函数功能:向串口发送8字节数据** 入口参数:无** 出口参数:无void UART0_SendBuf (void){uint8 i;//for (i=0; i<8; i++)UART0_SendByte(L->next->floor);while ((U0LSR & 0x20) == 0); // 等待数据发送完毕}c.主程序模块:** 函数名称:main()** 函数功能:从串口UART0接收字符串"ABCDEFGH",并发送回上位机显示。
** 调试说明:需要PC串口显示终端软件如EasyARM.exe。
uint8 rcv_data;int main (void){Node *p;uint8 start,end;uint8 i,j, sum = 0,k;uint32 temp;L=(LinkList)malloc(sizeof(Node));L->next=NULL;UARTMODE set;start = 1;set.datab = 8;set.stopb = 1;set.parity = 0;rcv_new = 0;loop:PINSEL0 = 0x00005505; // 设置I/O连接到UART0PINSEL1 = 0x00000000;IODIR = HC595_CS;PINSEL2 = PINSEL2 & (~0x08);// P1[25:16]连接GPIOIO1DIR = LEDS8; // 设置LED1控制口为输出MSPI_Init(); // 初始化SPI接口UART0_Init(115200, set); // 串口初始化U0FCR = 0x01; // 使能FIFO,并设置触发点为8字节U0IER = 0x01; // 允许RBR中断,即接收中断IRQEnable(); // 使能IRQ中断/* 使能UART0中断 */VICIntSelect = 0x00000000; // 设置所有的通道为IRQ中断VICVectCntl0 = 0x20 | 0x06; // UART0分配到IRQ slot0,即最高优先级VICVectAddr0 = (uint32)IRQ_UART0; // 设置UART0向量地址VICIntEnable = 1 << 0x06; // 使能UART0中断p=L->next;while (1){if (rcv_new == 1){rcv_new =0;end = rcv_buf[0]-48;UART0_SendByte(p->floor);//UART0_SendBuf();if(start < end){for(i=start; i<=end; i++){for(j=start; j<=end; j++){sum += LED_TBL[j];IO1SET = ~((sum) << 18);DelayNS(20);IO1CLR = ((sum) << 18);DelayNS(20);}rcv_data = MSPI_SendData(DISP_TAB[i]);// 发送显示数据sum =0;}}else {for(i=start; i>=end; i--){for(j=start; j>=end; j--){sum += LED_TBL[j];IO1SET = ~((sum) << 18);DelayNS(20);IO1CLR = ((sum) << 18);DelayNS(20);}rcv_data = MSPI_SendData(DISP_TAB[i]); // 发送显示数据//DelayNS(20); // 延时sum =0;}}for(k=0;k<4;k++){PINSEL0 = 0x00000000; // 设置管脚连接GPIIO0DIR = BEEP; // 设置BEEP控制口为输出IO0SET = BEEP; // BEEP停止蜂鸣DelayNS(20);IO0CLR = BEEP; // BEEP 蜂鸣DelayNS(20);IO0SET = BEEP;}start = end;goto loop;// rcv_data = MSPI_SendData(DISP_TAB[end-48]); // 发送显示数据// DelayNS(40); // 延时}}return 0;}五.结果及问题分析遇到的问题遇到的问题1:当输入的楼层有多个时,因为缓存数组只有八个,所以会有丢失数据的现象。