990 likes | 1.17k Views
嵌入式系统设计与实例开发 —— ARM 与 C/OS-Ⅱ 第六讲 基于 ARM 的嵌入式硬件结构设计. 本节提要. 1. 基于 ARM 的硬件系统体系结构. 存储器接口设计. 2. 3. I/O 接口设计. 人机交互接口设计. 4. 5. 网络接口设计. 6. 其它通讯接口设计. 基于 ARM 的硬件设计. 主要介绍基于 ARM7 的嵌入式硬件开发平台的设计方法,包括结构、主要接口、存储器选用方案以及外设、显示等方面的内容。 嵌入式硬件开发平台的体系结构 外围存储器接口设计方法 键盘、 LCD 等人机交互接口的设计 触摸屏的设计 以太网设计
E N D
嵌入式系统设计与实例开发 ——ARM与C/OS-Ⅱ 第六讲 基于ARM的嵌入式硬件结构设计
本节提要 1 基于ARM的硬件系统体系结构 存储器接口设计 2 3 I/O接口设计 人机交互接口设计 4 5 网络接口设计 6 其它通讯接口设计
基于ARM的硬件设计 主要介绍基于ARM7的嵌入式硬件开发平台的设计方法,包括结构、主要接口、存储器选用方案以及外设、显示等方面的内容。 • 嵌入式硬件开发平台的体系结构 • 外围存储器接口设计方法 • 键盘、LCD等人机交互接口的设计 • 触摸屏的设计 • 以太网设计 • CAN总线设计
Samsung S3C44B0X • Samsung S3C44B0X微处理器是三星公司专为手持设备和一般应用提供的高性价比和高性能的微控制器解决方案,它使用ARM7TDMI核,工作在66MHZ。为了降低系统总成本和减少外围器件,这款芯片中还集成了下列部件: • 8KB Cache、外部存储器控制器、LCD控制器、4个DMA通道、2通道UART、1个多主I2C总线控制器、1个IIS总线控制器,5通道PWM定时器及一个内部定时器、71个通用I/O口、8个外部中断源、实时时钟、8通道10位ADC等。
S3C44B0X存储系统的特征 • 支持数据存储的大/小端选择(通过外部引脚进行选择) • 地址空间:具有8个存储体,每个存储体可达32Mb,总共可达256Mb。 • 对所有存储体的访问大小均可进行改变(8位/16位/32位) • 8个存储体中,Bank0-Bank5可支持ROM、SRAM;Bank6、Bank7可支持ROM、SRAM和FP/EDO/SDRAM等。 • 7个存储体的起始地址固定,1个存储体的起始地址可变。
系统的存储空间分配 • Bank0:两片512KFlash,放置系统引导程序,系统上电复位后,PC指针自动指向Bank0的第一个单元,进行系统自举。。 • Bank1:K9F2808(三星 16Mbyte Flash),非线性寻址。具体的时序可以参考K9F2808的datasheet • Bank2:USBN9603。USB设备端接口芯片,占用系统外部中断0。8位数据总线。 • Bank3、Bank4未接设备。可以供扩展使用 • Bank5:RTL8019AS,ISA总线兼容的10M以太网(PHY+MAC层)控制芯片。占用系统外部中断1,16位数据总线
Bank6:SDRAM,起始地址为0xC000000。在SDRAM中,前512Kbyte的空间划分出来,作为系统的LCD显示缓冲区使用(更新其中的数据,就可以更新LCD的显示)。系统的程序存储空间从0xC080000开始。也就是,引导系统的时候,需要把system.bin文件复制到0xC080000开始的地址空间,把PC指针指向0xC080000。Bank6:SDRAM,起始地址为0xC000000。在SDRAM中,前512Kbyte的空间划分出来,作为系统的LCD显示缓冲区使用(更新其中的数据,就可以更新LCD的显示)。系统的程序存储空间从0xC080000开始。也就是,引导系统的时候,需要把system.bin文件复制到0xC080000开始的地址空间,把PC指针指向0xC080000。 • Bank7:未使用。可以扩展另一片SDRAM,或者其他的外设。 • 系统的同步串行口(SIO),连接着触摸屏控制芯片FM7843(与ADS7843完全兼容)。在同步串行口上,还可以扩展其他的芯片。靠IO口控制设备的片选信号(CS)来防止设备的冲突。 • 注:系统的扩展接口上,A0的标号,连接在S3C44B0X的ADDR1上,后面的地址依次向后错位。
本节提要 1 基于ARM的硬件系统体系结构 存储器接口设计 2 3 I/O接口设计 人机交互接口设计 4 5 网络接口设计 6 其它通讯接口设计
存储器接口设计 • 使用Bank0上的两片512Kb×2来放置系统BIOS,系统上电以后,PC指针自动指向Bank0的第一个单元,开始进行系统自举。系统自举完成以后,便从硬盘中将系统文件和用户应用程序复制到SDRAM内存中执行。 • Bank1上接16M非线性Flash,当做系统硬盘使用,可以构造文件系统,存放海量数据。 • 用SDRAM当作系统内存,只有Bank6/Bank7能支持SDRAM,所以将SDRAM接在Bank6上。如果同时使用Bank6/Bank7,则要求连接相同容量的存储器,而且其地址空间在物理上是连续的。
关于BOOT ROM • Bank0:系统的启动ROM(Flash Rom)。在系统复位的时候,处理器的PC(程序计数器)指针指向0x0地址。在Bank0的起始地址的程序,就是系统的初始化程序。此程序的主要任务是: 1、管理处理器的中断服务程序 • 处理器的中断是从0x0地址开始,引导ROM负责把这一部分的中断映射到另一个区域,以便系统处理。具体的做法,可以参考44binit.s里面的代码。(这部分代码是三星主页可以提供,它把系统的中断,映射到了不同的指针所指向的地址空间(主要就是系统RAM的空间))。
2、初始化硬件平台,配置其他的Bank • S3C44B0X的Bank0是通过外部的一个管脚提供的上拉、下拉电阻来配置的。主要包括:数据位数(8位、16位、32位),数据格式(大端、小端)。而其他的Bank的配置,以及读写周期等信息是靠Bank0内部的代码配置相应的寄存器来实现的。同时,系统的引导Rom也负责配置系统的其他的一些寄存器,比如,系统的PLL(锁频环)配置,系统的IO口等一些端口功能的配置等等。
3、系统自动检测 • 引导Rom负责检测系统的启动所必须的外设是否正常。主要是系统的SDRAM的检测。 4、系统的软件设置,更新系统(system.bin) • 用户可以在系统启动的时候,按任意键,进入系统的软件设置状态。通过引导Rom设置或者查看系统的一些软件信息。包括:通过开启USB端口;更新系统文件system.bin;LCD显示测试;演示程序的装载测试;键盘测试;触摸屏的坐标校准;触摸屏测试;以太网地址的设置等
本节提要 1 基于ARM的硬件系统体系结构 存储器接口设计 2 3 I/O接口设计 人机交互接口设计 4 5 网络接口设计 6 其它通讯接口设计
嵌入式开发板与PC机的串行通讯 嵌入式开发板和PC机的通讯电缆可以按照如图所示的方式连接。
I/O接口设计 I/O接口电路也简称接口电路。它是主机和外围设备之间交换信息的连接部件(电路)。它在主机和外围设备之间的信息交换中起着桥梁和纽带作用。设置接口电路的必要性: a)解决CPU和外围设备之间的时序配合和通信联络问题。 b)解决CPU和外围设备之间的数据格式转换和匹配问题。 c)解决CPU的负载能力和外围设备端口选择问题。
I/O接口的编址方式 1)I/O接口独立编址: • 这种编址方式是将存储器地址空间和I/O接口地址空间分开设置,互不影响。设有专门的输入指令(IN)和输出指令(OUT)来完成I/O操作。 2)I/O接口与存储器统一编址方式: • 这种编址方式不区分存储器地址空间和I/O接口地址空间,把所有的I/O接口的端口都当作是存储器的一个单元对待,每个接口芯片都安排一个或几个与存储器统一编号的地址号。也不设专门的输入/输出指令,所有传送和访问存储器的指令都可用来对I/O接口操作。
两种编址方式有各自的优缺点 1)独立编址方式: • 主要优点:内存地址空间与I/O接口地址空间分开,互不影响,译码电路较简单,并设有专门的I/O指令,所以编程序易于区分,且执行时间短,快速性好。 • 缺点:只用I/O指令访问I/O端口,功能有限且要采用专用I/O周期和专用I/O控制线,使微处理器复杂化。 2)统一编址方式 • 主要优点:访问内存的指令都可用于I/O操作,数据处理功能强;同时I/O接口可与存储器部分共用译码和控制电路。 • 缺点:一是I/O接口要占用存储器地址空间的一部分;二是因不用专门的I/O指令,程序中较难区分I/O操作。
S3C44B0X的I/O接口 • ARM系统完成I/O功能的标准方法是使用存储器映射I/O。这种方法使用特定的存储器地址。当从这些地址加载或向这些地址存储时,它们提供I/O功能。典型情况下,从存储器映射I/O地址加载用于输入,而向存储器映射I/O地址存储用于输出。 • S3C44B0X有71 个多功能输入\输出管脚,构成了7个I/O接口: • 两个9位的输入/输出接口(E和F) • 两个8位的输入/输出接口(D和G) • 一个16位的输入/输出接口(C) • 一个10位的输出接口(A) • 一个11位的输出接口(B)
本节提要 1 基于ARM的硬件系统体系结构 存储器接口设计 2 3 I/O接口设计 人机交互接口设计 4 5 网络接口设计 6 其它通讯接口设计
键盘接口设计 • 键盘模块键盘可能用来输入数字型数据或者选择控制设备的操作模式。 • 键盘有两种方案:一是采用现有的一些芯片实现键盘扫描;再就是用软件实现键盘扫描。嵌入式控制器的功能很强,可能允分利用这一资源。
键盘扫描阵列 一个瞬时接触开关(按钮)放置在每一行与线一列的交叉点。矩阵所需的键的数目显然根据应用程序而不同。每一行由一个输出端口的一位驱动,而每一列由一个电阻器上拉且供给输入端口一位。
一个瞬时接触开关(按钮)放置在每一行与线一列的交叉点。矩阵所需的键的数目显然根据应用程序而不同。每一行由一个输出端口的一位驱动,而每一列由一个电阻器上拉且供给输入端口一位。一个瞬时接触开关(按钮)放置在每一行与线一列的交叉点。矩阵所需的键的数目显然根据应用程序而不同。每一行由一个输出端口的一位驱动,而每一列由一个电阻器上拉且供给输入端口一位。
键盘扫描过程就是让微处理器按有规律的时间间隔查看键盘矩阵,以确定是否有键被按下。每个键被分配一个称为扫描码的唯一标识符。应用程序利用该扫描码,根据按下的键来判定应该采取什么行动。键盘扫描过程就是让微处理器按有规律的时间间隔查看键盘矩阵,以确定是否有键被按下。每个键被分配一个称为扫描码的唯一标识符。应用程序利用该扫描码,根据按下的键来判定应该采取什么行动。 • 消抖算法: • 组合键处理
键盘扫描程序 //得到按键的扫描码,格式为0xXYZW U16 GetScanKey() { U16 key; U8 i,temp; for(i=1;i<0x10;i<<=1){ //I/O口送出数据 rPDATD|=0xf; rPDATD&=~i; key<<=4; OSTimeDly(1);//操作系统延时 temp=rPDATD; key|=(temp>>4); } return key;}
编写键盘扫描函数,//得到按键的扫描码,格式为0xXYZW编写键盘扫描函数,//得到按键的扫描码,格式为0xXYZW unsigned short MyGetScanKey() • { • unsigned short key; • unsigned int i,temp; • for(i=1;i<0x10;i<<=1) • { • rPDATE|=0xf0;初始化端口 • rPDATE&=~(i<<4); //向列所在端口分别发送1110,1101, 1011,0111 • key <<=4;//左移四位 • Delay(10);//延时,等待响应 • temp=rPDATC;//读各行状态值 • key|=(temp&0xf);//将四次所得结果保存起来 • } • return key; • }
unsigned int MyGetKey() • { int i; • unsigned short key,tempkey=1; • static unsigned short oldkey=0xffff; • static unsigned char keystatus=0; • unsigned char keycnt=0; • while(1){ key=0xffff; • while(1){ • key=MyGetScanKey(); • if(key!=0xffff)//有键按下 • break; • OSTimeDly(20); • oldkey=0xffff; } • OSTimeDly(50); //去抖动 • if(key!=MyGetScanKey()) • continue;//如果两次的键值不同,重新扫描 • if(oldkey!=key) • keystatus=0;
if(keystatus==0) //第一次按下此键 • { keycnt=0; • keystatus=1; } • else if(keystatus==1) //第二次重复此键 • { • keycnt++; • if(keycnt==20) • keystatus=2; • else • continue; • } • oldkey=key; • break; • }
for(i=0;i<16;i++)//查找按键,不包括功能键 • { if((key&tempkey)==0) • break; • tempkey<<=1; } • return MykeyBoard_KeyMap[i]; • } • 函数中定义键盘映射: • Unsigned char MykeyBoard_KeyMap[]={1,4,7,10,2,5,8,0,3,6,9,11,12,13,14,15}; //10-退格,11-*/.,12-↑,13-↓,14-确定,15-取消
编写主程序(无操作系统),将得到的键值转化为ASCII码发送到串口。编写主程序(无操作系统),将得到的键值转化为ASCII码发送到串口。 • int Main(int argc, char **argv) • { unsigned int key; • unsigned int tempkey=0; • Uart_SendByte(0,0xa); //向串口发送0xa,表示换行 • Uart_SendByte(0,0xd); //回车 • for (;;) • { key=MyGetKey(); • key&=0x000f; • if(key>9) • { Uart_SendByte(0,0x31); • tempkey=key-10; • Uart_SendByte(0,tempkey|=0x0030); } • else • Uart_SendByte(0,key|0x0030); • Uart_SendByte(0,0x2c); } //送“ ,”号 • return 0; }
定义键盘响应函数,将得到的键值在液晶屏上显示。定义键盘响应函数,将得到的键值在液晶屏上显示。 • void onKey(int nkey, int fnkey)//键盘响应函数 • { char temp[3];//转换成ASC-II的键值数组 • if(nkey>9) • { temp[0]=0x31; • temp[1]=(nkey-10)|0x30; • temp[2]=0; } //字符串结束标志 • else • { temp[0]=nkey+0x30; • temp[1]=0; } • LCD_printf(temp);//在液晶屏上显示键值 • LCD_printf("\n"); }
void Main_Task(void *Id) //Main_Test_Task • { POSMSG pMsg=0; • LCD_ChangeMode(DspTxtMode); //Lcd进入文本模式 • LCD_Cls(); //清屏 • for(;;){ • pMsg=WaitMessage(0); //等待消息 • switch(pMsg->Message){ • case OSM_KEY: //键盘消息 • onKey(pMsg->WParam,pMsg->LParam); //键盘响应函数 • break; • Delay(200); • } • DeleteMessage(pMsg);//删除消息,释放资源 • } }
void My_Key_Scan_Task(void *Id) //键盘扫描任务 • { U32 key; • u32 tempkey=0; • POSMSG pmsg; //创建消息 • Uart_Printf("begin key task \n"); • for (;;) { • key=MyGetKey(); • key&=0x000f; • if(key>9) • { Uart_SendByte(0,0x31); • tempkey=key-10; • Uart_SendByte(0,tempkey|=0x0030); } • else • Uart_SendByte(0,key|0x0030); • Uart_Printf(","); • pmsg=OSCreateMessage(NULL, OSM_KEY,key,key); //创建键盘消息 • if(pmsg) • SendMessage(pmsg);} //发送键盘消息 • }
LCD接口设计 LCD显示模块 液晶显示是一种被动的显示,它不能发光,只能使用周围环境的光。它显示图案或字符只需很小能量。液晶显示所用的液晶材料是一种兼有液态和固体双重性质的有机物,它的棒状结构在液晶盒内一般平行排列,但在电场作用下能改变其排列方向。 LCD的背光: • EL(场致发光):2000-3000小时 • 和LED光源:字符模式,50000小时
LCD的显示方式 • 反射型LCD:底偏光片后面加了一块反射板,它一般在户外和光线良好的办公室使用。 • 透射型LCD:底偏光片是透射偏光片,它需要连续使用背光源,一般在光线差的环境使用。 • 透反射型LCD:是处于以上两者之间,底偏光片能部分反光,一般也带背光源,光线好的时候,可关掉背光源;光线差时,可点亮背光源使用LCD。
LCD的驱动方式 • LCD通常由两种方式,一种是带有驱动芯片的LCD模块,基本上属于半成品 • 如果有需要,也可以直接使用芯片上的内置LCD控制器来构造显示模块,它可以支持彩色/灰度/单色三种模式,灰度模式下可支持4级灰度和16级灰度,彩色模式下最多支持256色,LCD的实际尺寸可支持到320X240。
嵌入式处理器与LCD的连接 嵌入式处理器 数据总线 LCD模块 寄存器选择 使能信号
LCD的显示控制 从系统结构上来讲,由于显示器模块中已经有显示存储器。显存中的每一个单元对应LCD上的一个点,只要显存中的内容改变,显示结果便进行刷新。于是便存在两种刷新: 1.直接根据系统要求对显存进行修改,一种是只需修改相应的局部就可以,不需要判断覆盖等;另一种就是有覆盖问题,计算起来比较复杂,而且每做一点小的屏幕改变就进行刷新,将增加系统负担。 2 .专门开辟显示内存,在需要刷新时候由程序进行显示更新。这样,不但可以减轻总线负荷,而且也比较合理,在有需要的时候进行统一的显示更新,界面也可以比较美观,不致由于无法预料的刷新动作导致显示界面闪烁。
与LCD有关的函数: • void LCD_Cls(); //文本模式下清除屏幕 • void LCD_ChangeMode(U8 mode); //在图形模式和字符模式下切换 • void LCD_Refresh(); //图形刷新显示 • void LCD_Init(); //初始化LCD控制寄存器 • void LCD_printf(const char *format,...); //输入格式化字符到LCD • void LCD_txtRefresh(); //字符显示刷新 • void LCDBkLight(U8 isOpen); //打开/关闭LCD背光 • void LCDDisplayOpen(U8 isOpen); //打开/关闭LCD显示
触摸屏接口设计 触摸屏的分类 • 电阻式触摸屏 • 表面声波触摸屏 • 红外式触摸屏 • 电容式触摸屏
电阻式触摸屏 • 分为四线电阻和五线电阻触摸屏 • 电阻技术触摸屏是一种对外界完全隔离的工作环境,故不怕灰尘、水汽和油污,可以用任何物体来触摸,比较适合工业控制领域及办公室内有限人的使用。
测量原理 Y • 在触摸点X、Y坐标的测量过程中,测量电压与测量点的等效电路图所示,图中P为测量点 Y V X