嵌入式系统课程设计报告2Word文档格式.docx
- 文档编号:21821698
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:47
- 大小:487.33KB
嵌入式系统课程设计报告2Word文档格式.docx
《嵌入式系统课程设计报告2Word文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式系统课程设计报告2Word文档格式.docx(47页珍藏版)》请在冰豆网上搜索。
●两种不同的读协议
●可编程的等待周期产生器
●外部等待请求
●可编程的数据线浮空时间
外围地址由相应的片选寄存器状态决定。
在使用它们之前,应先对他们进行重映射。
表1.1显示了一些外围进行重映射之后的地址分配。
表1.1地址重映射之后地址分配
外围
片选信号
片选寄存器
寄存器状态举例
地址空间
Flash
NCS0
EBI_CSR0
0x01002529
0x01000000~0x011fffff
SRAM
NCS1
EBI_CSR1
0x02003121
0x02000000~0x0207ffff
LCD
NCS2
EBI_CSR2
0x0300232e
0x03000000~0x03000001
片选寄存器为8个32位寄存器(EBI_CSR0~EBI_CSR7)。
这些寄存器的基地址是0xFFE00000。
Flash的片选信号为NCS0,所以它对应的片选寄存器为EBI_CSR0。
高8位设为0x01,即基地址为0x01000000。
由于开发板上有2MB的Flash,所以地址空间为0x01000000~0x011FFFFF。
SRAM的基地址设置为0x02000000,所以地址空间为0x02000000~0x0207ffff(512KB)。
LCD的基地址由NCS2控制。
基地址为0x03000000,地址空间为0x03000000~0x03000001。
下面介绍Flash存储器接口。
Flash存储器作为一种安全、快速的存储体,具有体积小、容量大、成本低、掉电数据不丢失等一系列优点。
目前已经逐步取代其它半导体存储元件,成为嵌入式系统中主要数据和程序载体。
T49BV1614是ATMEL公司生产的16兆位Flash存储器,主要作用是固化程序和保存历史数据,也就是开机后执行闪存的程序,并在程序执行的过程中实时地保存或修改其内部的数据单元。
下面首先介绍AT49BV1614的特点和操作。
AT49BV1614是采用2.7V~3.3V电源供电的可编程只读存储器,是一种电可擦除与重新编程的器件。
该器件由8个独立的8K字节块,2个32K字节块,30个64K字节块,具有40个扇区的16Mbit的存储器。
访问速度为90ns。
片内的状态机编程和擦除器件、嵌入式字节编程与区段/芯片擦除功能是全自动的,引脚描述如下。
A0~A19:
地址线。
I/O0~I/O14:
数据输入/输出。
在读周期输出数据;
I/O15(A-1):
I/O15时是数据输入/输出端,字模式;
A-1时是低8位输入端,字节模式;
CE:
输入,芯片使能,低电平时选中该器件。
OE:
输入,输出使能,低电平时打开数据输出缓冲区,允许读操作。
WE:
输入,写使能,低电平时允许写操作。
BYTE:
输入,选择字节或字模式。
VCCQ为3.3V电源。
Vss为地。
下面以命令表的编程命令为例。
简要介绍字节编程。
表1.2所列命令是一个6总线周期指令。
表1.2软件命令简表
命令
第一
周期
第二
第三
第四
第五
第六
读
地址
数据
芯片擦除
5555
AA
2AAA
55
80
10
扇区擦除
30
字
节
/
单
脉
冲
扇
区
锁
定
40
对于芯片擦除功能,自动地提供编程和电擦除之前,校验所有存储单元所需的电压和时序,然后自动擦除并校验单元界限。
利用数据轮询(datapolling)特性,可以监视自动芯片擦除操作期间器件的状态,以检验操作是否完成。
程序如下:
constFlashDef*flash_identify(flash_word*load_addr)
{flash_wordmanuf_code;
flash_worddevice_code;
constFlashDef*flash_pt;
flash_word*base_addr;
intexit=FALSE;
flash_pt=FlashTable;
while(exit==FALSE)
{base_addr=(flash_word*)((int)load_addr&
~(flash_pt->
flash_mask));
//LCD_printf16((int)base_addr,3,1);
LCD_printf16(flash_pt->
flash_name,5,1);
*(base_addr+FLASH_SEQ_ADD1)=FLASH_CODE1;
*(base_addr+FLASH_SEQ_ADD2)=FLASH_CODE2;
*(base_addr+FLASH_SEQ_ADD1)=ID_IN_CODE;
//*ReadManufactureranddevicecodefromthedevice
manuf_code=*base_addr;
device_code=*(base_addr+1);
//*ExitSoftwareProductIdentificationMode
*(base_addr+FLASH_SEQ_ADD1)=ID_OUT_CODE;
//*Ifbothmanufactureranddevicecodescorresponds
if((flash_pt->
flash_id==device_code)&
&
(flash_pt->
flash_manuf_id==manuf_code))
{exit=TRUE;
}
else
{//*NextFlash,Ifendoftable
if(++flash_pt>
=FlashTable+
NB_FLASH_SUPPORTED)
{//*Return0,DisplayErrorandExitloop
flash_pt=(constFlashDef*)0;
LCD_printf16
(&
manuf_code,7,1);
//device_code
exit=TRUE;
return(flash_pt);
}
当上述程序所得结果是00C0H(AT49BV1614代码)时,才可以对FLASH进行擦除或编程。
在对Flash编程之前,应对Flash进行擦除,使其每个数据位都恢复为1状态,即全FF状态。
对Flash的擦除操作需要6个总线周期。
下面是简要的程序代码:
interase_sector(flash_word*base_addr,flash_word
*sector_addr,
intsize,intsector_id)
{inttrial=0;
//*Whileflashisnoterasedortoomucherasingperformed
while((check_sector_erased(sector_addr,size,
sector_id)==FALSE)&
(trial++<
NB_TRIAL_ERASE))
{//printf("
ErasingSector%d\n"
sector_id);
*(base_addr+FLASH_SEQ_ADD1)=ERASE_SECTOR_CODE1;
*sector_addr=ERASE_SECTOR_CODE2;
if(wait_flash_ready(sector_addr,
(flash_word)0xFFFF)==FALSE)
{LCD_printf16("
Timeoutwhileerasing\n"
4,1);
return(TRUE);
程序擦除完毕后,就可以对FLASH进行编程了。
时序遵循表2,以下是其源代码。
intwrite_flash(flash_word*base_addr,
flash_word*load_addr,
flash_worddata)
{flash_wordread_data;
*(base_addr+FLASH_SEQ_ADD1)=FLASH_CODE1;
*(base_addr+FLASH_SEQ_ADD2)=FLASH_CODE2;
*(base_addr+FLASH_SEQ_ADD1)=WRITE_CODE;
*load_addr=data;
if(wait_flash_ready(load_addr,data)!
=TRUE)
Timeoutwhileprogramming\n"
7,1);
return(FALSE);
if((read_data=*load_addr)!
=data)
ProgramError\n"
7,10);
//printf("
Address0x%08x/Data0x%04x/0x%04x\n"
//(int)load_addr,data,read_data);
return(FALSE);
}
1.2系统接口
1.2.1JTAG接口
JTAG(JointTestActionGroup)是1985年制定的检测PCB和IC芯片的一个标准,1990年被修改后成为IEEE的一个标准,即IEEE1149.1-1999。
通过这个标准,可对具有JTAG口芯片的硬件电路进行边界扫描和故障检测,JTAG连接图如图3.2。
具有JTAG口的芯片都有如下JTAG引脚定义:
TCK-测试时钟输入;
TDI-测试数据输入,数据通过TDI输入JTAG;
TDO-测试数据输出,数据通过TDO从JTAG口输出;
TMS-测试模式选择,TMS用来设置JTAG口处于某种特定的测试模式;
可选引脚TSRT-测试复位,输入引脚,低电平有效。
图1.2JTAG连接图
JTAG仿真器比较便宜,连接比较方便。
它可以通过现有的JTAG边界扫描与ARMCPU核进行通信,属于完全非插入式(不占用片上资源)调试。
它无需目标存储器,不占用目标系统的任何端口,而这些是普通的驻留监控软件所必需的。
另外,JTAG调试的目标程序是目标板上执行,仿真更接近于目标硬件,因此,仿真结果与真实的运行环境更为接近,所以逐渐成为目前采用最多的一种调试方式。
1.2.2USART接口
目前RS-232是PC机与通信工业中应用最广泛的一种串行接口。
RS-232被定义为一种在低速率串行通信中增加通信距离的单端标准。
RS-232遵循S-232-C标准,美国电子工业协会(ElectronicIndustriesAssociation,EIA)把RS-232-C定义为:
“在数据终端设备和数据通信设备之间使用串行二进制数据交换的接口”。
RS-232-C通信端口一般包括UART、EIA驱动程序/接口程序。
在实际应用中,利用RS-232-C的通信通常只使用其中的3根线,即RXD、TXD和GND。
AT91M55800A微控制器集成了三个完全相同的全双工通用同步/异步收发器(USART)。
每个USART都具有自己的波特率发生器和两个专用的数据控制器PDC通道。
USART接到APB并与外围数据控制器PDC连接。
数据格式包括1个起始位、高达8个数据位,1个可选的可编程奇偶位,以及最多2个停止位。
此外,每个USART还具有接收超时寄存器,在带PDC工作时方便了可变长度数据帧的接收;
还有1个时间确保寄存器以方便与慢速远端设备的连接。
USART的主要特点为:
●可编程的波特率发生器。
●奇偶、帧和过速检测。
●线上Break信号的产生和检测。
●自动回送,本地环路和远程环路模式。
●多机模式:
地址检测和产生。
●中断产生。
●两个PDC通道。
●5,6,7,8和9位字符长度。
串行口USART的结构如图1.3所示:
图1.3USART方框图
每个口具有如表1.3所列的外部信号:
表1.3USART通道的外部信号
名称
描述
SCK
USART串行时钟可配置为输入或输出;
如果选择了外部时钟SCK为输入;
如果没有选择外部时钟,且时钟输出使能,则SCK为输出。
TXD
串行数据发送端,输出。
RXD
串行数据接收端,输入。
开发板上的串行口使用的是AT91M55800A上的UART接口,通过电平转换芯片(如Max232),把3.3V的逻辑电平转换为RS-232-C的逻辑电平,进行传输。
词串行接口使用了RS-232-C的3根线进行通信。
接口为D型的9针阳性的插头,其各个管脚的定义如表1.4。
表1.4RS232管脚定义
管脚号
定义
英文缩写
方向
2
数据接收
输入
3
数据发送
输出
5
地线
GND
按照上述管脚定义,嵌入式开发板和PC机的通信电缆可以按照如图1.4所示的方式连接。
图1.4嵌入式开发板和PC机的通信
1.3人机交互接口
为了使嵌入式系统具有友好的人机接口,需要给嵌入式系统配置显示装置,LCD显示器.另外,要进行人机交互,还得有输入装置,使用户可以对嵌入式控制器发出命令,或输入必要的控制参数等。
1.3.1LCD显示模块
LCD通常有两种方式,一种是带有驱动芯片的LCD模块,基本上属于半成品,因此,一般选用这样的显示模块。
从系统结构来讲,由于显示器模块中已经有显示存储器。
现存中的每一个单元对应LCD上的一个点,只要显存中的内容改变,显示结果中的内容改变,显示结果进行刷新。
于是便存在两种刷新方式:
(1)直接根据系统要求对现存进行修改。
这里存在两种情况,一种是只须作局部修改,不需要判断覆盖等问题;
另一种是有覆盖问题,计算起来比较复杂,而且每做一点小的屏幕改变就进行刷新,将增加系统负担。
(2)专门开辟显示内存,在需要刷新的时候由程序进行显示更新。
这样,不但可以减轻总线负荷,而且也比较合理,在有需要的时候进行统一的显示更新,界面可以比较美观,不至于因为无法预料的刷新动作导致显示界面闪烁。
采用前后台双重显示缓存的显示模块结构图如图1.5所示:
图1.5前后台双重显示缓存的显示模块结构
1.3.2键盘模块
键盘是标准的输入设备,嵌入式设备具有强大的功能,所以有能力处理用户所输入的信息,并结合各具特色的嵌入式应用软件,可以将嵌入式控制器的功能发挥至更大。
实现键盘有两种方案:
一是采用现有的一些芯片实现键盘扫描;
在就是用软件实现键盘扫描。
作为嵌入式系统设计人员,总是会关心产品成本。
目前有很多芯片可以用来实现键盘扫描。
键盘扫描的软件实现方法有助于缩减一个系统的重复开发成本,只需要很少的CPU开销。
嵌入式控制器的功能很强,可以充分利用这一资源。
所以,就用矩阵键盘扫描的方法来实现软键盘。
矩阵键盘扫描算法如图1.6。
图1.6矩阵键盘
在初始化阶段,所有的行(输出端口)被强行设置为低电平,在没有任何键按下时,所有的列(输入端口)将读到高电平。
任何键的闭合将造成其中的一列变为低电平。
为了查看是否有一个键已经被按下,微处理器仅需要查看任一列的值是否变成低电平。
一旦微处理器检测到有键被按下,就需要找出是哪一个键。
过程很简单,微处理器只需在其中一列上输出一个低电平。
如果它在输入端口上发现一个0值,该微处理器就知道在所选择行上产生了键的闭合。
相反,如果输入端口全是高电平,则被按下的键就不在那一行,微处理器将选择下一行,并重复该过程直到它发现了该行为止。
一旦该行被识别出来,则被按下键的具体列可以通过锁定输入端口上唯一的低电位来确定。
微处理器执行这些步骤所需要的时间与最小的状态闭合时间相比是非常短的,因此它假设该键在这个时间间隔中将维持按下的状态。
例如,当发现某列变为低电平时,此时,微处理器仅在某一行上输出低电平再查看列的状态,如果此时在输入端口上发现了一个0,则就可以断定此行上的键被按下了;
反之,如果输入端口上全为1,则就不是这一行上按下了建。
根据第一步和第二步中得到的值,便可以得到相应的扫描码。
下面是4×
4键矩阵扫描程序的源代码。
按照以上思路,编写键盘扫描函数,如下:
U16GetScanKey()
{
U16key;
U16i,temp,mask;
for(i=0x1;
i<
0x10;
<
=1)
{
mask=0x0f&
(~i);
at91_pio_write(&
PIOB_DESC,mask,
PIO_SET_OUT);
/*sethigh*/at91_pio_write
(&
PIOB_DESC,i,PIO_CLEAR_OUT);
/*setlow*/
key<
=4;
temp=at91_pio_read(&
PIOB_DESC);
key|=(temp&
0x00f000)>
>
12;
returnkey;
此函数分四次向I/O口送出二进制数据1110,1101,1011,0111,然后依次从I/O口中读取数据。
每次扫描读到的数据都存放在变量key中。
这样就得到了键盘扫描码key。
可见,key中可以包含4×
4键矩阵的所有的键盘组合。
1.3.3A/D数据采集
1.CS553X概述
图1.7CS553X系列ADC内部结构图
CS553X可提供2通道(CS5531/32)或4通道(CS5533/34),它们均包含一个低噪声载波稳定可变增益测量放大器(PGIA)(6nV/Hz@0.1Hz),可选增益为1X,2X,4X,8X,16X,32X,64X。
ADC内部还有一个4阶的Σ−∆调制器,一个数字滤波器,它能提供10种可供选择的字输出速率:
7.5Hz、15Hz、30Hz、60Hz、120Hz、240Hz、480Hz、960Hz、1.92KHz、3.84KHz(XIN=4.9152MHz)。
图1.7中描述了CS553X系列ADC的结构。
在芯片的前端有一个多路复用器、一个但增益的coarse/fine电荷输入缓冲器和一个载波稳定可变增益放大器。
单增益放大器设计为轨-轨信号输入,其共模信号范围为VA~VA+,用于模数转换的增益为1X的情况,可变增益放大器用于模数转换的增益被设定为大于1X的情况。
为减轻ADC与微处理器(MCU)之间的通讯负担,它还有一个与SPITM和MicrowireTM兼容的三线串行接口,在串行时钟口(SCLK)处有一个施密特触发器。
电源配置方案:
VA+=+5V;
VA-=0V;
VD+=+3Vto+5V
VA+=+2.5V;
VA-=-2.5V;
VA+=+3V;
VA-=-3V;
VD+=+3V
高动态范围、可编程输出速率和灵活的电源模式等特点,使得CS553X系列ACD成为用于称重仪和过程控制的理想部件。
1.寄存器介绍
CS553XADC有一个片内控制器,含有大量用户可访问的寄存器,用以保存偏移量、增益校验结果、指令
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 课程设计 报告