RAM

RAM是计算机中的一种重要内部存储设备,全称为“随机存取存储器”(Random Access Memory)。RAM用于临时存储计算机正在运行的程序和数据,以便CPU能够快速访问和处理它们。

其实,单片机就是个小计算机。大计算机少不了的数据存储系统,单片机一样有,而且往往和CPU集成在一起,显得更加小巧灵活。

直到90年代初,国内容易得到的单片机是8031:不带存储器的芯片,要想工作,必须外加RAM和ROM,于是单片机成了3片机......

而现在不同了,无论大的,还是小的,又是51,又是AVR,又是STC,还有什么430、PIC……都各说各的好,可谁也不敢说“我不要存储器”。

单片机的数据存储手段

程序存储器里面存放的是单片机的灵魂:工作程序。

小的可能只有1KB,最多只能装1024条8位数据,因为实际指令还有许多2字节,3字节指令,所以它还装不下1024条指令。大的也有128KB的。这些8位数据,要么在工厂里做模子光刻进去,要么一次性的烧写进去。

业余或开发,最多也就是用编程器这么一个特殊工具,把调试成功的机器码装载进去,或者像AVR单片机那样自己花几块钱做一条下载线,把电脑里这些东西灌进去(或许是AVR最吸引人之处)。

它一旦进驻电脑的程序存储器中,除了借助上述装置便不能自由改写,在单片机运行时,只是从其中读出指令或固定的数据,所以给程序存储器一个“只读存储器”的别名,简写为ROM,包括用编程器写紫外线擦除内容的EPROM、用电擦除的EEPROM和现在新兴的FLASH ROM。相关文章:EEPROM和Flash这样讲,我早就懂了。

一次性写入的ROM,仅用于电路和程序固定的批量产品中,实际工作起来,都是一样的。

为了定位ROM中的数据,每个8位存储单元都有一个固定的“地址”,通常用16进制数表示。例如,对于一个所谓4K的ROM,地址从0000H到0FFFH(即从0000,0001...4095),单片机运行时从哪个地址取数据,完全由程序本身决定,并不要我们干预。

记住,给单片机一通电,它经过一个短暂的复位过程,立即转向ROM的最低地址0000H,在这里面放置的往往是一条“跳转”指令,它从这里一步跳到另一个地址:程序的真正起始地址,例如51机的0080H。

ROM是程序存储器,除了指令外,还包括运行程序必须的某些固定数据,例如:数据表。假如,我们要求在单片机的接口上输出00H到FFH(255)按正弦半波变化的数值,每秒10000次。如果硬要它按照公式一个个计算,对于它来说未免力不从心。可是我们可以把预先计算好的数值存入ROM中,到时候直接取出不是好多了?

又如一个重要的应用:大家一定见过不少单片机的东西上面都有数码显示,那些个数字其实就是用单片机的口线控制数码管的字段电极电位。这些字形也是存放在ROM中的字模表,各个字模和0-9的数字(机器内当然是0000-0101二进制数)对应起来。常见的共阳极7段数码管,必须在阳极加正电,7个阴极都是地电位,才能显示数字"8",数字8对应的显示字码值是二进制数“10000000“(那个1对应的是小数点,高电位不让它显示)。

2. 数据存储器RAM

这是个可以随时存取数据的一块存储器,也就是可以读(取)也可以写(存)的存储器,简称RAM。

现在的单片机里面使用的RAM,属于静态RAM或SRAM,这个和电脑用的内存条有所不同。只要你把数据写入SRAM后,不断电或者不清除掉,这个数据就一直保存在那里。电脑用的是动态RAM,要不断给它加刷新脉冲才能保存数据。

因为单片机处理的信息量比电脑小很多,所以它带的RAM也比较少:从完全不带、带128、256、...1K、2K,到4K,比ROM少多了。

因为实际上RAM只是作为数据临时存放的地方,除非进行图像处理需要存放大量的数据外。一般对于执行较简单任务的单片机,有这么多也够用,如果实在不够用也只能采取外加SRAM如6116、6264等等来扩展。

1.jpg

为了对RAM单元存取8位二进制数,当然也得和ROM一样用“地址”来标示它的具体位置。假如某单片机有1K(1024)RAM,它的地址也是从0000到1024,或16进制数的0000H到03FFH。可见,和ROM的地址是一样的。

3. 会不会混淆不清?

答案是不会的,因为读ROM是由单片机的程序指针或转移指令或查表指令进行,而这些指令是不会进入RAM区的;读写RAM是另外的数据传送指令,也不会进入ROM区。

这点也是和电脑不同之处,后者程序和数据都在内存条里面,地址不同,如果窜位了就会造成不可预见后果。单片机的这种存储器结构也称为哈佛结构。

RAM在单片机里的用途

RAM在单片机里的用途,主要是存放临时数据。

例如用单片机测温,每秒测1次,显示1分钟的平均值(1分钟更新一次):

我们先通过传感器、放大电路、A/D转换,把温度这个模拟量转变为成比例的二进制数,然后每秒钟1次把数字量通过输入口顺序存入到单片机的RAM中,然后对他们进行两两求和再平均的计算,最后的数值显示出来,然后把这60个存储单元统统写0清除旧数据,下次又是如此循环进行。

总结

另外,在单片机里面还有若干寄存器,数量不多但是作用很大,除了暂存数据,还可以交换、加工、传递等等,以及随时记录单片机当前处于什么状态,输入输出口也是作为特殊功能的寄存器存在,具体各有不同,就不是随便说说可以搞清楚的,要看有关书籍了。

来源:ARM与嵌入式

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 12

其实,单片机就是个小计算机。大计算机少不了的数据存储系统,单片机一样有,而且往往和CPU集成在一起,显得更加小巧灵活。

直到90年代初,国内容易得到的单片机是8031:不带存储器的芯片,要想工作,必须外加RAM和ROM,于是单片机成了3片机......

而现在不同了,无论大的,还是小的,又是51,又是AVR,又是STC,还有什么430、PIC……都各说各的好,可谁也不敢说“我不要存储器”。

单片机的数据存储手段

1、程序存储器ROM

程序存储器里面存放的是单片机的灵魂:工作程序。

小的可能只有1KB,最多只能装1024条8位数据,因为实际指令还有许多2字节,3字节指令,所以它还装不下1024条指令。大的也有128KB的。这些8位数据,要么在工厂里做模子光刻进去,要么一次性的烧写进去。

业余或开发,最多也就是用编程器这么一个特殊工具,把调试成功的机器码装载进去,或者像AVR单片机那样自己花几块钱做一条下载线,把电脑里这些东西灌进去(或许是AVR最吸引人之处)。

它一旦进驻电脑的程序存储器中,除了借助上述装置便不能自由改写,在单片机运行时,只是从其中读出指令或固定的数据,所以给程序存储器一个“只读存储器”的别名,简写为ROM,包括用编程器写紫外线擦除内容的EPROM、用电擦除的EEPROM和现在新兴的FLASH ROM。

一次性写入的ROM,仅用于电路和程序固定的批量产品中,实际工作起来,都是一样的。

为了定位ROM中的数据,每个8位存储单元都有一个固定的“地址”,通常用16进制数表示。例如,对于一个所谓4K的ROM,地址从0000H到0FFFH(即从0000,0001...4095),单片机运行时从哪个地址取数据,完全由程序本身决定,并不要我们干预。

记住,给单片机一通电,它经过一个短暂的复位过程,立即转向ROM的最低地址0000H,在这里面放置的往往是一条“跳转”指令,它从这里一步跳到另一个地址:程序的真正起始地址,例如51机的0080H。

ROM是程序存储器,除了指令外,还包括运行程序必须的某些固定数据,例如:数据表。假如,我们要求在单片机的接口上输出00H到FFH(255)按正弦半波变化的数值,每秒10000次。如果硬要它按照公式一个个计算,对于它来说未免力不从心。可是我们可以把预先计算好的数值存入ROM中,到时候直接取出不是好多了?

又如一个重要的应用:大家一定见过不少单片机的东西上面都有数码显示,那些个数字其实就是用单片机的口线控制数码管的字段电极电位。这些字形也是存放在ROM中的字模表,各个字模和0-9的数字(机器内当然是0000-0101二进制数)对应起来。常见的共阳极7段数码管,必须在阳极加正电,7个阴极都是地电位,才能显示数字"8",数字8对应的显示字码值是二进制数“10000000“(那个1对应的是小数点,高电位不让它显示)。

2、数据存储器RAM

这是个可以随时存取数据的一块存储器,也就是可以读(取)也可以写(存)的存储器,简称RAM。

现在的单片机里面使用的RAM,属于静态RAM或SRAM,这个和电脑用的内存条有所不同。只要你把数据写入SRAM后,不断电或者不清除掉,这个数据就一直保存在那里。电脑用的是动态RAM,要不断给它加刷新脉冲才能保存数据。

因为单片机处理的信息量比电脑小很多,所以它带的RAM也比较少:从完全不带、带128、256、...1K、2K,到4K,比ROM少多了。

因为实际上RAM只是作为数据临时存放的地方,除非进行图像处理需要存放大量的数据外。一般对于执行较简单任务的单片机,有这么多也够用,如果实在不够用也只能采取外加SRAM如6116、6264等等来扩展。

为了对RAM单元存取8位二进制数,当然也得和ROM一样用“地址”来标示它的具体位置。假如某单片机有1K(1024)RAM,它的地址也是从0000到1024,或16进制数的0000H到03FFH。可见,和ROM的地址是一样的。

3、会不会混淆不清?

答案是不会的,因为读ROM是由单片机的程序指针或转移指令或查表指令进行,而这些指令是不会进入RAM区的;读写RAM是另外的数据传送指令,也不会进入ROM区。

这点也是和电脑不同之处,后者程序和数据都在内存条里面,地址不同,如果窜位了就会造成不可预见后果。单片机的这种存储器结构也称为哈佛结构。

RAM在单片机里的用途

RAM在单片机里的用途,主要是存放临时数据。

例如用单片机测温,每秒测1次,显示1分钟的平均值(1分钟更新一次):

我们先通过传感器、放大电路、A/D转换,把温度这个模拟量转变为成比例的二进制数,然后每秒钟1次把数字量通过输入口顺序存入到单片机的RAM中,然后对他们进行两两求和再平均的计算,最后的数值显示出来,然后把这60个存储单元统统写0清除旧数据,下次又是如此循环进行。

总结

另外,在单片机里面还有若干寄存器,数量不多但是作用很大,除了暂存数据,还可以交换、加工、传递等等,以及随时记录单片机当前处于什么状态,输入输出口也是作为特殊功能的寄存器存在,具体各有不同,就不是随便说说可以搞清楚的,要看有关书籍了。

来源:STM32嵌入式开发

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 100

单片机运行时需要调用某个程序/函数/固定数据时就需要读取ROM,然后在RAM中执行这些程序/函数的功能,所产生的临时数据也都存在RAM内,断电后这些临时数据就丢失了。

ROM:(Read Only Memory)

程序存储器在单片机中用来存储程序数据及常量数据或变量数据。

凡是c文件及h文件中所有代码、全局变量、局部变量、const’限定符定义的常量数据、startup.asm文件中的代码通通都存储在ROM中。

RAM:(Random Access Memory)

随机访问存储器用来存储程序中用到的变量。

凡是整个程序中,所用到的需要被改写的量,都存储在RAM中,“被改变的量”包括全局变量、局部变量、堆栈段。

程序经过编译、汇编、链接后,生成hex文件。

用专用的烧录软件,通过烧录器将hex文件烧录到ROM中。

究竟是怎样将hex文件传输到MCU内部的ROM中的呢?

因此,这个时候的ROM中,包含所有的程序内容。

无论是一行一行的程序代码,函数中用到的局部变量,头文件中所声明的全局变量,const声明的只读常量,都被生成了二进制数据,包含在hex文件中,全部烧录到了ROM里面。

此时的ROM,包含了程序的所有信息,正是由于这些信息,“指导”了CPU的所有动作。

可能有人会有疑问,既然所有的数据在ROM中,那RAM中的数据从哪里来?

什么时候CPU将数据加载到RAM中?

会不会是在烧录的时候,已经将需要放在RAM中数据烧录到了RAM中?

要回答这个问题,首先必须明确一条:ROM是只读存储器,CPU只能从里面读数据,而不能往里面写数据,掉电后数据依然保存在存储器中;

RAM是随机存储器,CPU既可以从里面读出数据,又可以往里面写入数据,掉电后数据不保存,这是条永恒的真理,始终记挂在心。

清楚了上面的问题,那么就很容易想到,RAM中的数据不是在烧录的时候写入的。

因为烧录完毕后,拔掉电源,当再给MCU上电后,CPU能正常执行动作,RAM中照样有数据。

这就说明:RAM中的数据不是在烧录的时候写入的,同时也说明,在CPU运行时,RAM中已经写入了数据。

关键就在这里:这个数据不是人为写入的,CPU写入的,那CPU又是什么时候写入的呢?

听我娓娓道来,上面说到,ROM中包含所有的程序内容,在MCU上电时,CPU开始从第1行代码处执行指令。

这里所做的工作是为整个程序的顺利运行做好准备,或者说是对RAM的初始化(注:ROM是只读不写的),工作任务有几项:

1、为全局变量分配地址空间---à如果全局变量已赋初值,则将初始值从ROM中拷贝到RAM中。

如果没有赋初值,则这个全局变量所对应的地址下的初值为0或者是不确定的。

当然,如果已经指定了变量的地址空间,则直接定位到对应的地址就行,那么这里分配地址及定位地址的任务由“连接器”完成。

2、设置堆栈段的长度及地址---à用C语言开发的单片机程序里面,普遍都没有涉及到堆栈段长度的设置,但这不意味着不用设置。

栈段主要是用来在中断处理时起“保存现场”及“现场还原”的作用,其重要性不言而喻。

而这么重要的内容,也包含在了编译器预设的内容里面,确实省事,可并不一定省心。

3、分配数据段data,常量段const,代码段code的起始地址。

代码段与常量段的地址可以不管,它们都是固定在ROM里面的,无论它们怎么排列,都不会对程序产生影响。

但是数据段的地址就必须得关心。

数据段的数据时要从ROM拷贝到RAM中去的,而在RAM中,既有数据段data,也有堆栈段stack,还有通用的工作寄存器组。

通常,工作寄存器组的地址是固定的,这就要求在绝对定址数据段时,不能使数据段覆盖所有的工作寄存器组的地址。

必须引起严重关注!

这里所说的“第一行代码处”,并不一定是你自己写的程序代码,绝大部分都是编译器代劳的,或者是编译器自带的demo程序文件。

因为,你自己写的程序(C语言程序)里面,并不包含这些内容。

高级一点的单片机,这些内容,都是在startup的文件里面,仔细阅读,有好处的。

通常的做法是:普通的flashMCU是在上电时或复位时,PC指针里面的存放的是“0000”,表示CPU从ROM的0000地址开始执行指令,在该地址处放一条跳转指令,使程序跳转到_main函数中。

然后根据不同的指令,一条一条的执行,当中断发生时(中断数量也很有限,2~5个中断),按照系统分配的中断向量表地址,在中断向量里面,放置一条跳转到中断服务程序的指令,如此如此,整个程序就跑起来了。

决定CPU这样做,是这种ROM结构所造成的。

其实,这里面,C语言编译器作了很多的工作,只是,你不知道而已。

如果你仔细阅读编译器自带的help文件就会知道很多的事情,这是对编译器了解最好的途径。

I/O口寄存器:也是可以被改变的量,它被安排在一个特别的RAM地址,为系统所访问,而不能将其他变量定义在这些位置。

中断向量表:中断向量表是被固定在MCU内部的ROM地址中,不同的地址对应不同的中断。

每次中断产生时,直接调用对应的中断服务子程序,将程序的入口地址放在中断向量表中。

ROM的大小问题:对于flash类型的MCU,ROM空间的大小通常都是整字节的,即为ak*8bits。

这很好理解,一眼就知道,ROM的空间为aK。

但是,对于某些OTP类型的单片机,比如holtek或者sonix公司的单片机,经常看到数据手册上写的是“OTP progarming ROM 2k*15bit。。。。。”。

可能会产生疑惑,这个“15bit”认为是1个字节有余,2个字节又不足,那这个ROM空间究竟是2k,多于2k,还是4k但是少了一点点呢?

这里要明确两个概念:一个是指令的位宽,另一个是指令的长度。

指令的位宽是指一条指令所占的数据位的宽度;有些是8位位宽,有些是15位位宽。

指令长度是指每条指令所占的存储空间,有1个字节,有2个字节的,也有3个字节甚至4个字节的指令。

这个可以打个形象的比方:我们做广播体操时,有很多动作要做,但是每个复杂的动作都可以分解为几个简单的动作。

例如,当做伸展运动时,我们只听到广播里面喊“2、2、3、4、5、6、7、8”。

而这里每一个数字都代表一个指令。

听到“3”这个指令后,我们的头、手、腰、腿、脚分别作出不同的动作:两眼目视前方,左手叉腰,右手往上抬起,五指伸直自然并拢打开,右腿伸直,左腿成弓步······等等一系列的分解动作。

而要做完这些动作的指令只有一个“3”,要执行的动作却又很多,于是将多个分解动作合并成一个指令,而每个分解动作的“位宽”为15bits。

实事上也确实如此,当在反汇编或者汇编时,可以看到,复合指令的确是有简单的指令组合起来的。

到此,回答前面那个问题,这个OTP的ROM空间应该是2K,指令位宽为15位。

一般的,当指令位宽不是8的倍数时,则说明该MCU的大部分指令长度是一个字节(注:该字节宽度为15位,不是8位),极少数为2个或多个字节,虽然其总的空间少,但是其能容下的空间数据并不少。

来源:巧学模电数电单片机
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 92

在各种单片机应用系统中,芯片存储器的正常与否直接关系到该系统的正常工作。为了提高系统的可靠性,对系统的可靠性进行测试是十分必要的。通过测试可以有效地发现并解决因存储器发生故障对系统带来的破坏问题。

本文针对性地介绍了几种常用的单片机系统RAM测试方法,并在其基础上提出了一种基于种子和逐位倒转的RAM故障测试方法。

一、RAM测试方法回顾

方法1:一种测试系统RAM的方法是分两步来检查,先后向整个数据区送入#00H和#FFH,再先后读出进行比较,若不一样,则说明出错。

方法2:方法1并不能完全检查出RAM的错误,在参考文献中分析介绍了一种进行RAM检测的标准算法MARCH-G。MARCH一G算法能够提供非常出色的故障覆盖率,但是所需要的测试时间是很大的。MARCH-G算法需要对全地址空间遍历3次。设地址线为”根,则CPU需对RAM访问6×2n次。

方法3:一种通过地址信号移位来完成测试的方法。在地址信号为全O的基础上,每次只使地址线Ai的信号取反一次,同时保持其他非检测地址线Aj(i≠j)的信号维持0不变,这样从低位向高位逐位进行;接着在地址信号为全1的基础上,每次只使地址线Ai的信号取反一次,同时保持其他非检测地址线Aj(i≠j)的信号维持1不变,同样从低位向高位逐位进行。

因此地址信号的移位其实就是按照2K(K为整数,最大值为地址总线的宽度)非线性寻址,整个所需的地址范围可以看成是以全0和全1为背景再通过移位产生的。在地址变化的同时给相应的存储单元写入不同的伪随机数据。在以上的写单元操作完成后,再倒序地将地址信号移位读出所写入的伪随机数据并进行检测。设地址线为n根,则CPU只对系统RAM中的2n+2个存储单元进行访问。

二、基于种子和逐位倒转的RAM测试方法

基于种子和逐位倒转的测试方法是在方法3的基础上进一步改进获得的。方法3主要是使用全O和全1两个背景数来移位展开的,与MARCH-G算法相比获得的故障覆盖率稍微低些,但使用了较少的地址单元。这里我们把方法3中的背景数称为“种子”。以地址线为8根的RAM为例,种子分别取00000000和11111111两个数,取00000000、11111111、0000llll和llll0000四个数,以及取00000000、11111111、00001111、11110000、00110011、1100llOO、01010101和10101010八个数来移位展开测试,所达到的故障覆盖率是不一样的。

种子数为2的改进方法要低于MARCH-G算法的故障覆盖率,种子数为4的改进方法与MARCH-G算法相当,种子数为8的改进方法能够超过MARCH-G算法的效果。整体上基于种子和逐位倒转的改进方法是可以代替MARCH-G算法的,但是种子数目不同所需要的寻址次数也是不同的。设地址线为n根,种子数为2时需要访问RAM共计4”+4次,种子数为4时需要访问RAM共计8n+8次,种子数为8时需要访问RAM共计16n+16次,而MARCH-G算法需要访问RAM共计6×2n次。可见,基于种子和逐位倒转的改进方法比MARCH-G算法的测试时间开销大大降低。同时,故障覆盖率会随着种子数目的增加而提高,当然不同种子数时所需要的测试时间开销也不同。在实际测试应用中要根据测试时间和测试故障覆盖率的需求来选择合适的种子数目,才能达到满意的效果。

来源:网络
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 256

经典的AT89C51单片机,其内部只有128字节RAM(内存),同样经典的MSP430F149也只有2K的RAM空间。

即使现在用的比较多的STM32F1系列,其最大的RAM也不到100K。

很多小伙伴就有这样的疑问:现在固态硬盘都以 T 为单位了,手机电脑内存都是8G、甚至32G了,为什么单片机RAM连1M都不到?

今天就来讲讲关于RAM以及单片机内存少的几点内容。
(备注:本文说的单片机,指MCU,微控制器)

关于RAM

RAM:Random Access Memory,随机存取存储器,也是大家所说的内存。

“单片机中RAM少,有哪几点原因?"

RAM是一种易失性存储器,也就是说断电就会丢失存储数据。

RAM有一些常见特点:

  • 随机存取

  • 易失性

  • 对静电敏感

  • 访问速度块

  • ······

随着需求的提高,技术的进步,RAM又发展了像SRAM、DRAM、SDRAM等多种类型的RAM存储器,这里可以参看一下文章:SRAM、DRAM、SDRAM的区别

“单片机中RAM少,有哪几点原因?"

相对于Flash、硬盘等非易失性存储器而言,RAM具有更快的读写速度,因此RAM广泛用于各种单片机、嵌入式、计算机系统中。

但RAM也存在一些“不足”,导致在很多场合,RAM的容量都相对比较小。

RAM容量小的几点原因

RAM相对Flash、硬盘而言,要做到足够大容量,其成本相对Flash要多的多。

1.RAM工艺更复杂

RAM要求速度更快,电流又不能太大,为了能尽量满足和平衡更高要求,就需要使用更特殊和更先进的半导体电容技术。

“单片机中RAM少,有哪几点原因?"

2.更大的硅面积

因为RAM的工艺更复杂,其占用硅面积相对更大。

大家应该都知道芯片的制造过程,目前芯片主要使用硅这种材料制作芯片(当前,现在也发明了更先进的材料),占用硅面积更大,意味着单个芯片成本更贵,相信这个原理大家都懂。

“单片机中RAM少,有哪几点原因?"

通过认识wafer、die、cell它们的关系你就能大概理解芯片其实是“批量”生成的。

3.功耗原因

单片机通常要求功耗不能太多,特别是低功耗的单片机,在待机模式下,要求nA级别的电路。

为了满足低功耗,单片机中RAM,通常是静态RAM(SRAM)。

这里要扩展一下与SRAM对应的DRAM(动态RAM),顾名思义,动态RAM就是需要定时给电容补充漏掉的电荷,也就是需要定时刷新,DRAM需要驱动电路,功耗相对SRAM自然更大。

4.单片机大容量RAM需求不大

大家都知道,使用单片机开发的项目,通常都是裸机,或者RTOS,一般不会用到大型软件,特别是早期的时候(早期少数对RAM有需求的项目,一般通过外扩RAM的方式)。

所以,早期很多项目对单片机RAM容量要求不高,甚至有很大一部分RAM都没有用到。

当然,随着UI、AI、物联网的快速发展,现在对单片机RAM的需求也在不断增加,很多新出的单片机RAM容量也在不断增加,比如256K,甚至512K了。

5.其他

除了以上说的几点,还有像寿命、稳定性、兼容性等也是间接影响RAM大小的因素。

来源:strongerHuang
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 71

单片机就是个小计算机,大计算机少不了的数据存储系统,单片机一样有,而且往往和CPU集成在一起,更加显得小巧灵活。

直到90年代初,国内容易得到的单片机就是8031:不带存储器的芯片,要想工作,还必须外加RAM和ROM,单片机成了3片机......

现在不同了,大的小的又是51,又是AVR又是STC,还有什么430,PIC等等,都各说各的好,可是谁也不敢说“我不要存储器”。

单片机的数据存储手段

01、程序存储器ROM

程序存储器里面存放的是单片机的灵魂:工作程序。

小的可能只有1KB,最多只能装1024条8位数据,因为实际指令还有许多2字节,3字节指令,所以它还装不下1024条指令。

大的也有128KB的。

这些8位数据,要么在工厂里做模子光刻进去,要么一次性的烧写进去。

业余或开发,最多也就是用编程器这么一个特殊工具,把调试成功的机器码装载进去,或者像AVR单片机那样自己花几块钱做一条下载线,把电脑里这些东西灌进去(或许是AVR最吸引人之处)。

它一旦进驻电脑的程序存储器中,除了借助上述装置便不能自由改写,在单片机运行时,只是从其中读出指令或固定的数据,所以给程序存储器一个“只读存储器”的别名,简写为ROM,包括用编程器写紫外线擦除内容的EPROM、用电擦除的EEPROM和现在新兴的FLASH ROM。

一次性写入的ROM,仅用于电路和程序固定的批量产品中,实际工作起来,都是一样的。

为了定位ROM中的数据,每个8位存储单元都有一个固定的“地址”,通常用16进制数表示。

例如,对于一个所谓4K的ROM,地址从0000H到0FFFH(即从0000,0001...4095),单片机运行时从哪个地址取数据,完全由程序本身决定,并不要我们干预。

记住,给单片机一通电,它经过一个短暂的复位过程,立即转向ROM的最低地址0000H,在这里面放置的往往是一条“跳转”指令,它从这里一步跳到另一个地址:程序的真正起始地址,例如51机的0080H。

ROM是程序存储器,除了指令外,还包括运行程序必须的某些固定数据,例如:数据表。

假如,我们要求在单片机的接口上输出00H到FFH(255)按正弦半波变化的数值,每秒10000次。

如果硬要它按照公式一个个计算,对于它来说未免力不从心。

可是我们可以把预先计算好的数值存入ROM中,到时候直接取出不是好多了?

又如一个重要的应用:大家一定见过不少单片机的东西上面都有数码显示,那些个数字其实就是用单片机的口线控制数码管的字段电极电位。

这些字形也是存放在ROM中的字模表,各个字模和0-9的数字(机器内当然是0000-0101二进制数)对应起来。

常见的共阳极7段数码管,必须在阳极加正电,7个阴极都是地电位,才能显示数字"8",数字8对应的显示字码值是二进制数“10000000“(那个1对应的是小数点,高电位不让它显示)。

02、数据存储器RAM

这是个可以随时存取数据的一块存储器,也就是可以读(取)也可以写(存)的存储器,简称RAM。

现在的单片机里面使用的RAM,属于静态RAM或SRAM,这个和电脑用的内存条有所不同。

只要你把数据写入SRAM后,不断电或者不清除掉,这个数据就一直保存在那里。

电脑用的是动态RAM,要不断给它加刷新脉冲才能保存数据。

因为单片机处理的信息量比电脑小很多,所以它带的RAM也比较少:从完全不带、带128、256、...1K、2K,到4K,比ROM少多了。

因为实际上RAM只是作为数据临时存放的地方,除非进行图像处理需要存放大量的数据外。

一般对于执行较简单任务的单片机,有这么多也够用,如果实在不够用也只能采取外加SRAM如6116、6264等等来扩展。

为了对RAM单元存取8位二进制数,当然也得和ROM一样用“地址”来标示它的具体位置。

假如某单片机有1K(1024)RAM,它的地址也是从0000到1024,或16进制数的0000H到03FFH。可见,和ROM的地址是一样的。

会不会混淆不清?

不会,因为读ROM是由单片机的程序指针或转移指令或查表指令进行,而这些指令是不会进入RAM区的;

读写RAM是另外的数据传送指令,也不会进入ROM区。

这点也是和电脑不同之处,后者程序和数据都在内存条里面,地址不同,如果窜位了就会造成不可预见后果。单片机的这种存储器结构也称为哈佛结构。

RAM在单片机里的用途

RAM在单片机里的用途,主要是存放临时数据。

例如用单片机测温,每秒测1次,显示1分钟的平均值(1分钟更新一次):

我们先通过传感器、放大电路、A/D转换,把温度这个模拟量转变为成比例的二进制数,然后每秒钟1次把数字量通过输入口顺序存入到单片机的RAM中,然后对他们进行两两求和再平均的计算,最后的数值显示出来,然后把这60个存储单元统统写0清除旧数据,下次又是如此循环进行。

结 语

另外在单片机里面还有若干寄存器,数量不多但是作用很大,除了暂存数据,还可以交换、加工、传递等等,以及随时记录单片机当前处于什么状态,输入输出口也是作为特殊功能的寄存器存在,具体各有不同,就不是随便说说可以搞清楚的,要看有关书籍了。

来源:EDA365电子论坛
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 34

对学电子的人来说,在电路板上设置测试点(test point)是再自然不过的事了。

有多少人没听说测试点?知道测试点但不了解测试点用途的人又有多少呢?

基本上设置测试点的目的是为了测试电路板上的零组件有没有符合规格以及焊性,比如说想检查一颗电路板上的电阻有没有问题,最简单的方法就是拿万用电表量测其两头就可以知道了。

可是在大量生产的工厂里没有办法让你用电表慢慢去量测每一片板子上的每一颗电阻、电容、电感、甚至是IC的电路是否正确,所以就有了所谓的ICT(In-Circuit-Test)自动化测试机台的出现。

它使用多根探针(一般称之为「针床(Bed-Of-Nails)」治具)同时接触板子上所有需要被量测的零件线路,然后经由程控以序列为主,并列为辅的方式循序量测这些电子零件的特性。

通常这样测试一般板子的所有零件只需要1~2分钟左右的时间可以完成,视电路板上的零件多寡而定,零件越多时间越长。

“为何要在MCU内部RAM调试?(基于Keil)"

但是,如果让这些探针直接接触到板子上面的电子零件或是其焊脚,很有可能会压毁一些电子零件,反而适得其反。

所以聪明的工程师就发明了「测试点」,在零件的两端额外引出一对圆形的小点,上面没有防焊(mask),可以让测试用的探针接触到这些小点,而不用直接接触到那些被量测的电子零件。

早期在电路板上面还都是传统插件(DIP)的年代,的确会拿零件的焊脚来当作测试点来用,因为传统零件的焊脚够强壮,不怕针扎,可是经常会有探针接触不良的误判情形发生。

因为一般的电子零件经过波峰焊或是SMT吃锡之后,在其焊锡的表面通常都会形成一层锡膏助焊剂的残留薄膜,这层薄膜的阻抗非常高,常常会造成探针的接触不良。

所以,当时经常可以见到产线的测试作业员,手里拿着空气喷枪拼命的对着板子吹,或是拿酒精擦拭这些需要测试的地方。

其实,经过波峰焊的测试点,也会有探针接触不良的问题,后来SMT盛行之后,测试误判的情形就得到了很大的改善,测试点的应用也被大大地赋予重任。

因为SMT的零件通常很脆弱,无法承受测试探针的直接接触压力,使用测试点就可以不用让探针直接接触到零件及其焊脚,不但保护零件不受伤害,也间接大大地提升测试的可靠度,因为误判的情形变少了。

不过,随着科技的演进,电路板的尺寸也越来越小,小小的电路板上面光要挤下这么多的电子零件都已经有些吃力了,所以测试点占用电路板空间的问题,经常在设计端与制造端之间拔河。

测试点的外观通常是圆形,因为探针也是圆形,比较好生产,也比较容易让相邻探针靠得近一点,这样才可以增加针床的植针密度。

使用针床来做电路测试会有一些机构上的先天上限制,比如说:探针的最小直径有一定极限,太小直径的针容易折断毁损。

针间距离也有一定限制,因为每一根针都要从一个孔出来,而且每根针的后端都还要再焊接一条扁平电缆。

如果相邻的孔太小,除了针与针之间会有接触短路的问题,扁平电缆的干涉也是一大问题。

某些高零件的旁边无法植针,如果探针距离高零件太近就会有碰撞高零件造成损伤的风险,另外因为零件较高,通常还要在测试治具针床座上开孔避开,也间接造成无法植针,电路板上越来越难容纳下所有零件的测试点。

由于板子越来越小,测试点的多寡存废屡屡被拿出来讨论,现在已经有了一些减少测试点的方法出现,如Net test、Test Jet、Boundary Scan、JTAG等。

也有其它的测试方法想要取代原本的针床测试,如AOI、X-Ray,但目前每个测试似乎都还无法100%取代ICT。

关于ICT的植针能力应该要询问配合的治具厂商,也就是测试点的最小直径及相邻测试点的最小距离,通常多会有一个希望的最小值与能力可以达成的最小值,但有规模的厂商会要求最小测试点与最小测试点间距离不可以超过多少点,否则治具还容易毁损。

来源:巧学模电数电单片机
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 42

由于工作的原因,笔者经常接到工程师询问MCU内部的RAM上电之后的初始值到底是什么,有什么特性和规律。今天笔者就以设计过程中遇到的几个问题与大家做一个交流。

首先明确一个问题,我们都知道,根据RAM的特性,MCU每次上电之后RAM里面的值是随机的。也就是说RAM上电后的初始值可以是0xAA,也可以是0x55,也可以是其它任何的值,这个都是正常的。明确了这个基本原理之后,我们来看一下下面这个跟RAM的初始值的使用相关的一个问题。

设计出状况

最近有工程师在开发的汽车娱乐系统中遇到了一种情况,就是他在使用RH850F1K的过程中,发现每次上电后RAM的值好像都是固定的。按照软件设计的初衷,他想通过判断RAM的值从而知道这次复位是掉电复位还是MCU内部复位——比如“看门狗”复位。如果是掉电复位,则对RAM进行初始化;如果是MCU内部复位,则不对RAM进行初始化,从而可以保持用户之前的一些设置,比如频道、界面信息等。

大致的设计思路和流程如下:

MCU复位后,软件会判断某个变量的值。如果不是0x55,就认为这是上电复位,所有的RAM需要初始化,并把该变量的值写为0x55;如果是0x55,就认为这是“看门狗”复位,这时候则不改变一些变量的值,比如记录里程相关的数据。

相关的C语言代码如下:

if (variable != 0x55)
{
初始化所有变量;
variable = 0x55;
}
else
{
只改变部分变量的值;
}

在测试的过程中,测试工程师发现了一个问题:对于99%的MCU来讲,上述的逻辑都是没有问题的,但是对于个别MCU却存在固定性的问题。

按照设计的初衷,本来我们认为上电后RAM的值是随机的,但是对于某些个别MCU来讲,测试工程师发现上电后RAM的值会固定的是0x55,或者出现0x55的几率非常高。

解决方法

针对这个现象,笔者也从单个MCU的特性方面做了解释:首先还是回到文章最初提到的问题,根据RAM的特性,上电后RAM是任何值都是正常的,基于这个前提,我们可以说测试工程师遇到的现象是正常的。

那么,为什么个别MCU的RAM上电后会偏向于某个特定值呢?

半导体器件的设计是非常复杂的,外观很小的一个芯片都是芯片内部数百万计的各种极其小的元器件搭建而成的,而这些的原材料基本都是硅。对于每个特定的芯片而言,其特性数据都是有一些偏好的,也包括上电后RAM的初始值,所以当我们看每个MCU的电气特性数据的时候,这些数据基本都是一个范围值,而不是确定的值。

另外,上面软件本身的设计也是有缺陷的,或者说鲁棒性不好。假定上电后RAM的初始值是完全随机的,那么这样总会碰到随机值恰好是0x55的情况。基于这种考虑,我建议软件工程师重新设计了判断的条件。比如判断RAM若干不连续地址的值,并且使用校验的算法,比如比较简单的校验和,这样可靠性就大大提高了。

结 语

笔者在工作过程中,遇到过多个类似的问题,这个问题也具有一定的普遍性,除了前面提到的汽车娱乐系统,在车身、仪表,甚至工业应用中的电表等都会涉及到,希望这篇文章能够帮助设计工程师少走一些弯路。

本文转载自:网络
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 65

单片机就是个小计算机,大计算机少不了的数据存储系统,单片机一样有,而且往往和CPU集成在一起,更加显得小巧灵活。

直到90年代初,国内容易得到的单片机就是8031:不带存储器的芯片,要想工作,还必须外加RAM和ROM,单片机成了3片机......

现在不同了,大的小的又是51,又是AVR又是STC,还有什么430,PIC等等,都各说各的好,可是谁也不敢说“我不要存储器”。

单片机的数据存储手段

程序存储器ROM

程序存储器里面存放的是单片机的灵魂:工作程序。

小的可能只有1KB,最多只能装1024条8位数据,因为实际指令还有许多2字节,3字节指令,所以它还装不下1024条指令。大的也有128KB的。这些8位数据,要么在工厂里做模子光刻进去,要么一次性的烧写进去。

业余或开发,最多也就是用编程器这么一个特殊工具,把调试成功的机器码装载进去,或者像AVR单片机那样自己花几块钱做一条下载线,把电脑里这些东西灌进去(或许是AVR最吸引人之处)。

它一旦进驻电脑的程序存储器中,除了借助上述装置便不能自由改写,在单片机运行时,只是从其中读出指令或固定的数据,所以给程序存储器一个“只读存储器”的别名,简写为ROM,包括用编程器写紫外线擦除内容的EPROM、用电擦除的EEPROM和现在新兴的FLASH ROM。

一次性写入的ROM,仅用于电路和程序固定的批量产品中,实际工作起来,都是一样的。

为了定位ROM中的数据,每个8位存储单元都有一个固定的“地址”,通常用16进制数表示。例如,对于一个所谓4K的ROM,地址从0000H到0FFFH(即从0000,0001...4095),单片机运行时从哪个地址取数据,完全由程序本身决定,并不要我们干预。

记住,给单片机一通电,它经过一个短暂的复位过程,立即转向ROM的最低地址0000H,在这里面放置的往往是一条“跳转”指令,它从这里一步跳到另一个地址:程序的真正起始地址,例如51机的0080H。

ROM是程序存储器,除了指令外,还包括运行程序必须的某些固定数据,例如:数据表。假如,我们要求在单片机的接口上输出00H到FFH(255)按正弦半波变化的数值,每秒10000次。如果硬要它按照公式一个个计算,对于它来说未免力不从心。可是我们可以把预先计算好的数值存入ROM中,到时候直接取出不是好多了?

又如一个重要的应用:大家一定见过不少单片机的东西上面都有数码显示,那些个数字其实就是用单片机的口线控制数码管的字段电极电位。这些字形也是存放在ROM中的字模表,各个字模和0-9的数字(机器内当然是0000-0101二进制数)对应起来。常见的共阳极7段数码管,必须在阳极加正电,7个阴极都是地电位,才能显示数字"8",数字8对应的显示字码值是二进制数“10000000“(那个1对应的是小数点,高电位不让它显示)。

数据存储器RAM

这是个可以随时存取数据的一块存储器,也就是可以读(取)也可以写(存)的存储器,简称RAM。

现在的单片机里面使用的RAM,属于静态RAM或SRAM,这个和电脑用的内存条有所不同。只要你把数据写入SRAM后,不断电或者不清除掉,这个数据就一直保存在那里。电脑用的是动态RAM,要不断给它加刷新脉冲才能保存数据。

因为单片机处理的信息量比电脑小很多,所以它带的RAM也比较少:从完全不带、带128、256、...1K、2K,到4K,比ROM少多了。

因为实际上RAM只是作为数据临时存放的地方,除非进行图像处理需要存放大量的数据外。一般对于执行较简单任务的单片机,有这么多也够用,如果实在不够用也只能采取外加SRAM如6116、6264等等来扩展。

为了对RAM单元存取8位二进制数,当然也得和ROM一样用“地址”来标示它的具体位置。假如某单片机有1K(1024)RAM,它的地址也是从0000到1024,或16进制数的0000H到03FFH。可见,和ROM的地址是一样的。

会不会混淆不清?

不会,因为读ROM是由单片机的程序指针或转移指令或查表指令进行,而这些指令是不会进入RAM区的;读写RAM是另外的数据传送指令,也不会进入ROM区。这点也是和电脑不同之处,后者程序和数据都在内存条里面,地址不同,如果窜位了就会造成不可预见后果。单片机的这种存储器结构也称为哈佛结构。

RAM在单片机里的用途

RAM在单片机里的用途,主要是存放临时数据。

例如用单片机测温,每秒测1次,显示1分钟的平均值(1分钟更新一次):

我们先通过传感器、放大电路、A/D转换,把温度这个模拟量转变为成比例的二进制数,然后每秒钟1次把数字量通过输入口顺序存入到单片机的RAM中,然后对他们进行两两求和再平均的计算,最后的数值显示出来,然后把这60个存储单元统统写0清除旧数据,下次又是如此循环进行。

结语

另外在单片机里面还有若干寄存器,数量不多但是作用很大,除了暂存数据,还可以交换、加工、传递等等,以及随时记录单片机当前处于什么状态,输入输出口也是作为特殊功能的寄存器存在,具体各有不同,就不是随便说说可以搞清楚的,要看有关书籍了。

围观 9

页面

订阅 RSS - RAM