基于单片机的大程序和数据空间的设计和实现

发布者:科技独行者最新更新时间:2013-01-23 来源: dzsc关键字:单片机  大程序  数据空间 手机看文章 扫描二维码
随时随地手机看文章
  单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。

  MCS51系列单片机是目前应用非常广泛的8位MCU.MCS5l系列单片机的地址总线为16位,不作扩展的情况下其最大的程序和数据地址空间为64 KB.但是随着控制领域的不断智能化、复杂化,程序代码或数据空间的大小可能远远大于64 KB.结合相应的硬件地址扩展,使用KeilC5l的Blank Switch技术可生成代码长度和数据空间大于64 KB的目标程序。

  1 Blank Switch技术介绍

  具体实现Blank Switch技术的是KeilC5l中的分组连接定位器BL5l.Keil C5l语言源程序经过C5l编译器编译后,生成浮动地址的目标代码文件。这种浮动地址的目标代码必须经过连接定位器BL5l的连接和定位,生成具有绝对地址的目标代码,才能写入程序存储器正常运行。

  BL51支持分组连接定位,允许生成代码大于64 KB的目标程序,可以在具有适当硬件扩展逻辑的系统中进行代码组之间的切换,以达到正常运行的目的。

  在Keil C5l开发工具的快速更新过程中,LX51成为功能更为完善的连接定位器,使用它替代BL51能够增加更多的连接定位功能。笔者使用LX5l可以更加方便程序的开发。

  2 系统硬件的设计

  在采用BL5l对目标程序进行分组连接定位时,要求系统具有相应的硬件分组扩展逻辑。BL5l默认的分组方式是采用MCU的P1端口作硬件扩展地址线。采用l条Pl引脚时,分组数为2,采用6条P1引脚时,最多可分为64个代码组,剩余的Pl口线也可做其他用途。

  在系统中,以Pl端口作硬件扩展地址线,使用了4条Pl引脚(P1.4~P1.7)。主控部分硬件基本原理图如图1所示。在这里,去除了外围控制接口(如串口)与其他CPU的互联等电路,主要突出如何实现使用Pl端口作硬件扩展来增加程序空间和数据空间。笔者使用Flash29C040作为程序存储器,由于程控交换机中有很多参数和设置数据需要断电保存,所以使用了另一Flash29CO4O作为扩展的外部数据存储器。

主控部分硬件基本原理图

  在和数据存储器的连接中,增加了P1.O和P2.7组合对数据Flash 29C040的片选,主要是考虑可以增加主控芯片对外围器件的控制。例如,当设置P1.0为0,地址为高32KB时,可以扩展增加访问串口或其他器件。在本文就不再对该部分内容详细描述了。同时,需要注意安排好变量的存储地址,这一点将在下文中详细描述。

  在程序设计过程中,P1扩展地址线对程序员而言是不可见的。由BL5l产生的代码来控制硬件的扩展引脚和代码组的切换,这使程序员只需要将精力花费在代码编写和代码组的安排上,大大提高了程序设计效率和稳定性。

  3 KeilC51的环境设置

  除需要正确设计硬件电路,同时还要对Keil C5l提供的文件和环境进行正确设置才能真正实现地址的扩展。下面是需要进行相关配置的几项。

  在菜单Project选择中选择OpTION for Target“Tar-get”选择项,按图2所示进行项目配置。

项目配置

  ◆由于使用4个Pl引脚进行硬件的扩展,所以在Banks选择中使用16个物理页。

  ◆使用32KB作为一个分页的空间大小,所以在Bank Area中写入地址范围为0x8000~0xffff.

  ◆由于使用了扩展的数据存储空间,所以选择支持使用“far”变量类型,这样就能方便地使用FARRAY、FVAR等宏和指针来访问扩展的空间地址。

  在菜单Project选择中选择Option for Target“Output”选择项,按图3所示进行项目配置。

项目配置[page]

在输出的文件格式上使用HEX-386的文件格式。这是使用LX51连接定位器时产生的一种扩展型的HEX文件类型。

  在工程窗体中,对工程中的每个源程序合理安排分组的位置,有以下几点需要特别注意:

  ◆复位和中断向量、代码常数、C51中断函数、组切跳转表、库函数这些代码必须安排在公共代码区域。

  ◆代码组切换需要大约50个机器周期和2字节的堆栈空间。因此应当仔细安排程序结构以尽量减少代码之间的切换。被整个程序经常调用的函数应当安排在公共代码区域。同时,同一功能模块的函数大多相互调用,所以应当安排在同一代码组,以减少代码组的切换,提高系统运行效率。

  ◆L5l_BANK.A51必须安排在公共代码区域。令Common代码组和BankO代码组在物理上实际是同一个代码组,所以不要使用Bank0代码组来给源程序分配空间。在L51_BANK.A5l文件中需根据硬件的具体情况配置修改以下代码。

  ◆B_NBAbIKS EQU 16 //定义最大分组(o~64),可为2、4、8、16、32、64.

  ◆B_MoDE EQU 0 //O:通过8051单片机的I/0口进行分组切换,l:通过XDATA存储器单元进行分组切换。

  ◆B_RTX EQU O //0;不使用Keil的实时操作系统

  ◆B_VAR_BANKINGEQU l //l;支持变量分页(数据空间扩展)

  ◆B_FIRSTBIT EQU 4 //对应最低位的Pl位

  在这里需要注意的是,要根据自己系统的实际情况来安排硬件设计和软件配置。例如,如果系统中使用了RTX-5l实时操作系统,那么在L51_BANK.A5l文件中B_RTX应当改写为l.

  在keil中printf 默认是向串口中发送数据的,所以,如果应用该函数,必须先初始化串口,否则可能引起死机的情况,并且在printf之前应该先将TI置位,摘抄原因如下:

  1.printf函数是调用putchar函数输入的,而putchar应该是先判断ti是否为1,不为1则等待为1. 如果为1则清0,然后送出一个字符。因此你如果直接使用printf函数,你的程序就会在putchar函数中等待ti为1.这时你的程序就相当于直接死掉了。你可以通过改写putchar函数实现自己的目的。TI相当于是初始化~不给赋初值就不干活

  2.Keil的串口处理比较巧妙的,我的分析如下:

  putchar.c里面,是先检测TI再发送。这样做的目的是把尽可能多的时间留给2次串口操作之间的程序,而不是把等待字节发送的时间白白空等待浪费掉。所以,在系统初始化的时候,一定要令TI=1; 就可以顺畅的使用printf函数了。搂主sbuf=“ ”的办法,其实就是令TI=1.   另外要特别注意,printf函数执行完毕后,最后一个字节并未发送完毕,例如在485通讯中,此时如果切换为收模式,会丢失最后一字节。

  3.一般串口发送都是等TI(字节发送完标志)为1就马上发送下一字节,由于不管是中断还是查询TI标志的方法,都会检测TI,因此首次发送必须置位TI标志,使串口开始发送你的“在程序的初始化部分往串口数据寄存器SBUF里放一个字符来起用终端显示;”方法最终作用也就是把TI置1,改成TI=1;来启动发送也是一样的(当然,不会发出那个‘ ’字符了)。

  4.中定义,调用底层的putchar()来实现。底层发送数据到串口时,先查TI=1是否成立,死等直到TI=1时将新数据写入SBUF,函数返回,所以要先将TI置1,启动第一次传输操作。可查看反汇编相关代码理解其工作机理!

  5.自己理解:在多机通讯中,应该也要形成像 putchar()函数的机理,要有串口中断服务程序,并且是在该程序中判断TI,根据TI是不是该发送下一组数据~同样对于接收的一方

  4 程序设计的相关问题

  源程序通过对上文中环境和L5l_BAl7K.A5l文件的设置后,连接定位器,自行安排目标代码的程序空间和控制代码组程序切换。一般情况下,不需要程序员作更细微的安排,但是变量空间的安排需要根据实际系统作出合理分配。

  从硬件设计中可知,当CPU的地址线最高位P2.7为0时,不论P1扩展地址是多少,访问的数据空间是62256.在P2.7为l时,并且P1.0为1时,访问的数据空间是数据Flash 29C040.在系统中,数据存储器访问地址对应的Flash 29C020实际地址如表l所列。

数据存储器访问地址对应的Flash 29C020实际地址

  在实践过程中,使用FARRAY、FVAR等宏设置绝对地址来访问扩展的数据存储器Flash 29C040取得很理想的效果。FARRAV宏实现对扩展空间以数组方式的访问,FVAR宏实现对扩展空间以单个变量方式的访问。

  例如,在头文件中设置了如下两个宏:

  #define FAExt FARRAY(unsigned int,0x18800)//0x18800-0xlSfff 2Byte*1024

  #define FVHcad FARRAY(1ong,Oxl9000)//Oxl9000 4 Byte

  通过宏FAExtHot可以unsigned int类型数组访问29C040.通过宏FVHcad可以long类型的变量访问29C040(占用其0x9000开始的4个字节)。

  下面是读取数据的例子。

  unsisned int SingleExt;

  long Head Comp;

  SingeExt=FAExt[1];//读取数组中的第二个数据

  HeadComp=0x559;

  FVHead=HeadComp;//写入数据到29C040

  需要注意的是:

  ◆应当合理安排数组大小,不要造成存储空间的重复使用。例如这个数组的大小是1024,那么在安排后面的宏FVHead时,其地址应当在0x18fff之后。

  ◆由于使用的扩展数据存储器是Flash,所以应当注意Flash的写入是以页的方式进行的,写入数据时不要将奉页的其他数据擦除掉。

  ◆由于系统的实际需要,使用Flash做扩展数据存储器,如果应用中对RAM的空间需求很大,也可以使用2 Mb空间RAM和2Mb空间Flash的组合来进行扩展。

  ◆也可以使用far类型的变量来访问扩展的数据空间,在此不详细描述。

  结 语

  采用Keil C5l的BankSwitch技术扩展5l系列单片机程序和数据空间,在硬件修改很少的情况下,便可以实现运行大于64KB的程序,访问大于64 KB的数据,充分扩展了5l系列单片机的应用空间。

参考文献:

[1]. ROM datasheet http://www.dzsc.com/datasheet/ROM_1188413.html.
[2]. far datasheet http://www.dzsc.com/datasheet/far_1888220.html.

关键字:单片机  大程序  数据空间 引用地址:基于单片机的大程序和数据空间的设计和实现

上一篇:基于单片机的秒,分,时可调时钟的设计
下一篇:智能机器人迷宫车控制系统设计方案

推荐阅读最新更新时间:2024-03-16 13:17

MSP430单片机对片内FLASH的读写操作程序范例
MSP430 单片机对片内 FLASH 的读写操作程序范例 // 参数: wAddr 为地址 , 范围 0x1000~0xFFFF void ReadFlash(U16 wAddr,U8 *bBuf,U8 bLen) { while (bLen--) *bBuf++=*(U8 *)wAddr++; return; } void WriteFlash(U16 wAddr,U8 *bBuf,U8 bLen) { U8 reg1,reg2; reg1=_BIC_SR(GIE); reg2=IE1;IE1=0; // 保护原来中断标志,并关闭有关中断。 // 写一个字节数据到指定 flash 地址 while (bLen--) { whi
[单片机]
[单片机框架][bsp层][AT32F415][bsp_uart] uart配置和使用
14 通用同步异步收发器(USART) 14.1 USART介绍 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准 NRZ 异步串行数据格式的外部设备之间进行全双工数据交换。USART 利用分数波特率发生器提供宽范围的波特率选择。 它支持同步单向通信和半双工单线通信,也支持 LIN(局部互连网) ,智能卡协议和 IrDA(红外数据组织)SIRENDEC 规范,以及 CTS/RTS(Clear To Send/Request To Send)硬件流操作。它还允许多处理器通信。 使用多缓冲器配置的 DMA 方式,可以实现高速数据通信。 14.2 USART主要特性 全双工异步通信 单线半双工通信 NRZ 标准
[单片机]
如何在通用微控制器中集成多种功能,最大程度简化设计
我们一直在通过减少元器件的数量和节约印刷电路板的尺寸来追求系统设计的最优化。 增添小型、低成本的微控制器(MCU)以实现简单的辅助处理功能,可以对许多电路的设计产生助益。该通用MCU并非系统中主要的处理器,但它可处理一些必不可少的系统级功能,如LED控制或输入/输出扩展。本文中,我将说明如何在系统中集成多功能通用处理MCU来缩减物料清单(BOM)成本,节省电路板空间,并最大程度地简化设计。 例如,假如您要创建一个具有以下功能的新设计: · LED控制 · I/O扩展 · 带电可擦可编程存储器(EEPROM) · 外部看门狗时钟 您可使用分立元器件来实现所有功能。也可以考虑在通用MCU上执行软件实现同样的
[半导体设计/制造]
如何在通用<font color='red'>微控制器</font>中集成多种功能,最大程度简化设计
STC单片机专用的自动下载系统
引言 STC单片机是我国宏晶公司研制的一系列51单片机。STC单片机以传统的8051单片机为基础,经过技术改进和资源扩展,具有片内资源丰富、运算速度快、价格低等优点。STC单片机下载程序不需要编程器烧写,可以通过串口下载。美中不足的是,STC单片机下载时必须进行冷启动,即下载信号加到单片机串口以后必须对单片机断电再上电,这给用户带来了一些不便。尤其是反复调试程序需要多次下载时,显得更加繁琐。 为了解决这一问题,有必要研制一种STC单片机专用的自动下载系统,使系统接收到上位机发往单片机的下载信号后,自动冷启动STC单片机,完成下载任务。 1 原理分析 STC单片机下载时,需要使用宏晶公司提供的STCIS
[单片机]
STC<font color='red'>单片机</font>专用的自动下载系统
51单片机(STC89C52RC)小综合实验(续2)
  在上一次实验后的电路,拿到实际当中去测试,发现还是出现问题的,主要是电压的回落时间变得很慢,仔细检查电路发现,原因主要是由于变更了电容的容量大小,原来的采用了10uf的滤波电容,变更后采用了3300uf的滤波电容,按理来说滤波电容大点也是没有问题的.更有助于平滑波形不是吗?可是在这个电路当中,主要是希望lm393的电压变化作为信号,在上次实验的时候,采用的是初始电压为0,也就是相当于能够关闭供电电压的,实际是持续供给,初始电压不为0,于是采用大电容后,放电时间延迟严重.   得到的教训:滤波电容并不是越大越好的,需要根据电路的需求进行相应的调整.
[单片机]
单片机实现通用存贮器IC卡的读写
    摘要: 本文对AT24系列存贮器和AT89系列单片机的特征及总线状态作为介绍,并以AT24C01与AT89C2051为例详细描述了通用存贮器IC卡的工作原理及用单片机对其进行读写操作的基本电路连接和软件编程方法。     关键词: E2PROM I2C总线 FLASH ROM IC卡 AT24C01 AT89C2051 1 概述 通用存贮器IC卡是由通用存贮器芯片封装而成的,由于它的结构和功能简单,生产成本低,使用方便,因此在各领域都得到了广泛的应用。目前用于IC卡的通用存贮器芯片多为E2PROM,其常用的协议主要有两线串行连接协议(I2C)和三线串行链接协议,其中比较常用的是ATMEL公司生产的
[工业控制]
Microchip推出两大全新单片机系列
无论是用于入门级嵌入式开发,用作连接应用的主控制器,还是充当附加组件以减轻大型系统负荷,8位单片机(MCU)的作用都在不断扩大。虽然从本质上讲,诸如独立于内核的外设(CIP)、智能模拟以及MPLAB®代码配置器等硬件和软件工具并不深奥也不难实现,但其作用不可忽视,它们可以提高处理能力,同时减少代码量、功耗以及快速上市所需的设计工作量。有鉴于此,整合单片机、混合信号、模拟器件和闪存专利解决方案的供应商——Microchip Technology Inc.(美国微芯科技公司)推出了以客户创新为宗旨而设计的两大全新单片机系列:PIC16F18446系列和ATmega4809。 全新推出的PIC16F18446系列单片机是用于传感器节
[半导体设计/制造]
基于C8051F016单片机和功率放大器实现程控三相交流功率源的设计
前言 程控三相交流功率源的应用十分广泛,它被大量应用于冶金、通信、化工、电力及军工等诸多行业。用于交流调压、调功、调光及电机软启动等工业自动化控制领域,还可以用于计量以及产品的性能试验等方面。用于计量和产品试验等领域的功率源对于其输出波形要求较高,要求功率源输出完整的正弦波信号,对于正弦波的失真度有一定的限制。目前此类交流功率源的实际输出功率都很小,它们一般只强调单项指标,即电流或电压输出。而用于电能表计量时,其功率源输出的不是真实的功率,而是利用产生“虚功率”的方法来实现电能的计量。在某些产品的性能试验或计量过程中需要产生实际的交流功率,且要求其任意相的电流、电压、相位都能够独立调节。目前的交流功率源都无法满足要求,本文介绍的三
[单片机]
基于C8051F016<font color='red'>单片机</font>和功率放大器实现程控三相交流功率源的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved