基于K60单片机的SDRAM控制模型设计及实现

2019-10-03 版权声明 举报文章

摘 要:本文阐述了无SDRAM控制器环境中使用单片机K60的GPIO口驱动SDRAM的硬件组成和软件设计,并测试了该系统的主要性能,给出了该系统的应用举例,具有低功耗、功能齐全、人机界面友好等优点。

关键词:SDRAM;单片机;MK60DN512ZVLQ10;存储管理;控制程序

中图文分类号:TP368

随着集成电路技术与工艺的发展进步,单片机应用领域也逐渐扩广,进入到社会生产生活的方方面面。在某些成本敏感的应用场合迫切需要具有速度高、容量大的深度嵌入式系统,技术的进步,使得以低廉的价格获得高性能,低功耗单片机成为可能。借助极高的接口速度,我们就可以使用普通GPIO口在没有SDRAM控制器的廉价单片机上实现软件驱动SDRAM。

1 硬件介绍

1.1 单片机

Kinetis系列是飞思卡尔(Freescale)公司于2010年下半年推出的业内首款基于ARM Cortex.M4内核的微控制器,K60系列是Kinetis系列的第一阶段产品之一[1]。K60具有丰富的外设接口:(1)高速16位模数转换器;(2)12位数模转换器,带有片上模拟电压参考;(3)多个高速比较器和可编程增益放大器;(4)低功耗触摸感应功能,通过触摸能将器件从低功耗状态唤醒;(5)多个串行接口,包括UART;(6)强大灵活的定时器;(7)片外系统扩展和数据存储选项。

1.2 SDRAM

本文选用Hynix的H57V2562GTR-60C 256Mb SDRAM,其为4M x 4Bank x16bit组织结构。操作SDRAM的主要命令[2]有:

MRS (Mode Register Set,模式寄存器设置),

NOP (No Operation,空操作),BA(Bank Active,存储器激活),RD(Read,读,可设置是否自动预充电),WR(Write,写,可设置是否自动预充电),PB(Precharge Bank,预充电存储器,可设置全部/选定Bank),BS(Burst stop,停止突发传输),DQM(DQM,数据掩码),AR(Auto Refresh,自动刷新),BRSW(Burst-Read Single-Write,突发读单一写),SR(Self Refresh,自刷新,进入/退出),PPD(Precharge Power Down,掉电预充电,可设置进入/退出),CSS(Clock Suspend,时钟挂起可设置进入/退出)。

1.3 显示器LCD及摄像头Ov7725

本文选用2.4英寸240*320像素LCD作为显示器,摄像头采用Ov7725。

2 硬件连接

2.1 MCU与SDRAM接口

SDRAM需要一组16位宽的接口进行数据传输,13位宽的接口进行地址设定,两根Bank选择线,CS,CLK,CKE,WE,CAS,RAS,LDQM,UDQM各一根。K60的C口和E口均为完整16位口,可以用作地址线和数据线接口,剩余控制线使用单片机未用接口即可。

2.2 MCU与LCD接口

该LCD控制器一共需要13根控制线,其数据线需要一个完整的8位口,接在K60的口8至15位,剩余控制线使用单片机未用接口即可。

2.3 MCU与Ov7725接口

Ov7725[3]是一片CMOS的集成图像传感器,一共需要13根控制线,其数据线需要一个完整的8位口,接在K60的B口0至7位,剩余控制线使用单片机未用接口即可。

3 软件设计

3.1 SDRAM底层驱动构件

本层构件的功能是以软件方式实现基本的内存命令,为上层软件提供服务。主要函数原型和说明如下所述:

GPIO_Initial()初始化驱动SDRAM的GPIO口;MRS(u16 mode)设置模式寄存器,参数mode为模式寄存器控制字;BA(u8 bank,u16 addr)激活BANK,发送行地址,参数bakn为BANK编号,address为行地址;RD(u8 bank,u16 addr,u8 AutoPreCharge)读取指定地址处数据,参数bank为BANK编号,addr为列地址,AutoPreCharge表示是否自动预充电;WR(u8 bank,u16 addr,u8 AutoPreCharge)在指定地址处写入,参数bank为BANK编号,addr为列地址,AutoPreCharge表示是否自动预充电;PBAll()给所有BANK预充电;PBOne(u8 bank)给选定BANK预充电,参数bank为BANK编号

AR()自动刷新;SREntry()自刷新进入;SRExit()自刷新退出;NOP()空操作;CLK_Count(u16 total),参数total是向SDRAM传送的有效时钟数;Initial()SDRAM初始化函数;NOP_Read()空操作读;NOP_Write()空操作写;NOP_Burst()空操作突发读写。

其中,NOP_Write函数在给SDRAM产生有效时钟信号的同时自动将缓冲区第一个字放到数据线上;NOP_Read函数在给SDRAM产生有效时钟信号的同时自动将地址线上的一个字取回放到缓冲区。NOP_Burst函数根据突发读写标识(Burst Flag),为1时,从缓冲区第二个字开始依次将余下的字放到地址线上,为0时,从地址线上取回指定字数存放到缓冲区从第二个字开始处,并给SDRAM产生有效时钟信号。其执行方式如图1所示。

3.2 SDRAM中间级基本读写功能构件设计

本层构件的功能是实现SDRAM单个字(WORD)读写,以及突发读写功能,能够将SDRAM的物理地址转换为线性逻辑地址,并完成定时自动刷新。为实现以上功能,定义一些全局变量,下面将说明。Buffer类型为unsigned short int*,长度16字节,在内存读写时作为数据交换区域。BurstFlag类型为Unsigned char,长度1字节,其值0为突发读,1为突发写。BurstLength类型为Unsigned char,长度1字节,指明突发长度。

首先为保持SDRAM内数据不丢失,必须在64ms以内进行一次刷新操作。在K60的中断定时器(PIT)中开启一个周期中断通道,设置其周期小于64ms即可,在其终端服务函数中调用自动刷新函数AR,然后再调用CLK_Count以产生数个自动刷新节拍,这样自动刷新功能就完成了。

单个字读、写(函数名定义为Read_Word和Write_Word)实现过程类似。由于系统中存在周期中断,并且该中断同是对SDRAM进行操作的,所以在进行读写之前,必须先关闭周期中断,以保证操作进行的正确性。紧接着便可以执行相应读取或写入操作。

当为读取操作时,先调用Bank激活命令BA同时传入相应Bank编号和行地址;然后调用CLK_Count,给SDRAM发送几个有效时钟,具体有效时钟数量,视存储器芯片和设定的RCD周期而定,完成行选通到列选通延迟;然后调用RD读函数,并传入相应的列地址;然后调用CLK_Count,给SDRAM发送几个有效时钟,具体有效时钟数量,视存储器芯片和CL周期而定,这段时间为读取潜伏期;之后便可以调用NOP_Read,将数据线上的一个字取回缓冲区,开启周期中断后就可以返回给主函数调用者了。

当为写入操作时,先从缓冲区取出欲写入的一个字放到数据线上,然后调用Bank激活命令BA同时传入相应Bank编号和行地址;然后调用CLK_Count,给SDRAM发送几个有效时钟,具体有效时钟数量,视存储器芯片和设定的RCD周期而定,完成行选通到列选通延迟;然后调用WR读函数。需要注意的是,这里与读取操作不同,并不存在潜伏期,也就是说此时欲写入的数据已经在SDRAM里等待被写入了,只需要短暂的写回延时即可。为与读操作函数对称,使程序结构易于被程序员读懂,本文仍以NOP_Write函数形式实现写回延时。至此写入操作便完成,将周期中断打开即可。图2是单个字读写函数的流程图,右为写,左为读。

对于突发读和突发写,只要在进行读写前设置突发读写标识BurstFlag为突发读(值为0)、突发写(值为1),将单个字读写函数中相应的NOP_Read、NOP_Write更改为NOP_Burst,并计算好NOP_Burst的数量即可。

3.3 SDRAM内存管理模型设计

本文使用链表式的内存管理算法[4]来管理系统上挂载的容量为32M字节SDRAM存储器。该SDRAM的组织结构为4Bank×213行×29列×16位,因此本文将动态内存块大小设置为1K字节,刚好是一行中所有存储体的总容量。这样就32M字节存储器将被划分为131072个存储块。显然即便是每个存储块只用一个字节记录相关信息,对于单片机来说开销也是巨大的,K60DN512单片机配备了128KB的SRAM,尽管在深度嵌入领域这个容量已经相当大,也是不够用的。因此需要设计一种算法用来动态创建和删除链表中的节点,控制链表中节点的数量,来完成SDRAM存储管理。

每一个内存(指系统挂载的SDRAM存储器,下同)块对应一个节点,该节点的结构定义如下:

typedef struct BlockNode

{ unsigned long int BlockAddr; unsigned char State;

struct BlockNode *left;

struct BlockNode *right;

} BNode, *pBNode;

BlockAddr存储该内存块的首地址,State标记该内存块是否被分配,值为0未被分配,其他值已被分配,left存储左边一个节点指针,right存储右边一个节点指针。

该结构体占据13个字节存储量,若在单片机上用13KB存储器来存储该链表则可以方便管理1MB的SDRAM存储器,还是非常划算的。

本文采用就大法分[5]配动态分配内存块。其算法流程图3所示。

回收内存的算法相对简单,只需要根据需要回收的内存块首址删除掉相应节点即可。

3.4 系统整体设计

在完成了所有基本构件的设计以后,便可以进行系统整体设计了。这只需要调用基本构件初始化函数,按照一定时序建立服务函数即可,系统启动流程如图4所示。

4 系统性能测试

本文以多种方式测试了该系统对SDRAM读写数据的能力,测试结果如表1所示。

由实际测试数据可知,突发传输可得大大提高SDRAM的读写速度。

5 应用举例

在深度嵌入的单片机上实现高速图像采集、存储、处理、显示是比较困难的,其原因在于MCU运算速度有限,存储容量有限。该系统采用的K60单片机已经具有DSP处理器,可以实现对大量数据的高速处理。

在场终端到来时设置行计数为0并打开场中断,在行中断到来时开启DMA,跟随PCLK时钟采集640字节数据,DMA操作结束后对行计数执行加1操作,判断行计数有没有达到240,如果达到240,关闭行中断并设置行计数为0,否则跳过此步骤继续执行将640字节数据存入SDRAM。在主函数中读取SDRAM中存储的数据发送到LCD上显示便实现了动态显示。主函数中也可以对SDRAM中存储的数据进行处理变换后再重组发送到显示器或作他用。

6 结语

在深度嵌入的现代生活中,单片机的速度越来越快,人们对存储容量的需求也越来越大,相对于花费大量资金购买一块昂贵的带有SDRAM控制器的MCU,本文介绍的GPIO口控制和管理SDRAM具有设备简单,技术门槛低,开发周期短的优点。系统有待改进的地方在于可移植性不够强,通用性不够好,从编程角度看,最基本的指针访问内存的方式必须以函数代替,这样无法实现某些算法。该系统适合数据量大,对数据存取速度要求高,频繁改写数据的系统,比如在图像采集系、处理等系统。

参考文献:

[1]王宜怀,吴瑾,蒋银珍.嵌入式系统原理与实践[M].北京:电子工业出版社,2012:22-35.

[2]金新强,白雪飞,张璠.一种DDRSDRAM控制器的设计[J].微型机与应用,2013,32(8):23-25.

[3]任志敏.一种基于OV7725的图像实时显示系统设计[J].福建电脑.2013,29(1):128-130.

[4]张荣华,田泽,韩炜.基于链表的动态存储器管理设计与实现[J].计算机技术与发展.2011,21(7):250-253.

[5]何煦岚,何晓岚.基于多链表结构的嵌入式系统内存管理[J].计算机应用与软件.2008,25(4):58-59,81.

作者简介:周成龙(1992-),男,山东临沭,中国矿业大学,本科,电气工程与自动化。

注:本文为网友上传,不代表本站观点,与本站立场无关。举报文章

0

好文章需要你的鼓励

上一篇:基于CSS视觉分块的Web碎片信息抽取算法 下一篇:发电企业高性能计算中心的建设与实践

你需要文秘服务吗?

提供一对一文秘服务,获得独家原创范文

了解详情
期刊发表服务,轻松见刊

提供论文发表指导服务,1~3月即可见刊

了解详情

被举报文档标题:基于K60单片机的SDRAM控制模型设计及实现

被举报文档地址:

https://wenmi.com/article/pys5a202gzpm.html
我确定以上信息无误

举报类型:

非法(文档涉及政治、宗教、色情或其他违反国家法律法规的内容)

侵权

其他

验证码:

点击换图

举报理由:
   (必填)

发表评论  快捷匿名评论,或 登录 后评论
评论