单片机

CRC校验算应该绝大部分理工类同学都学习过,但真正搞明白的没几个,之前给大家分享过《几种常见的校验算法》,今天结合STM32来分享其中CRC相关的内容。

1、关于CRC校验

CRC:Cyclic Redundancy Check,即循环冗余校验码。

CRC是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。
循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

---来自百度百科

学电子、计算机相关专业的同学都应该学习过CRC的基础原理。其原理说难不难,可以说就是一个公式。同时,说简单也不简单,这个公式里面包含的内容不简单。

1.jpg

拿STM32参考手册中CRC计算单元来说,使用CRC-32(以太网)多项式:0x4C11DB7─ X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 + X8 + X7 + X4 + X2 + X +1

关于CRC基础原理的内容比较多,百度、谷歌一下可以看到很多关于CRC原理的内容,我这里就不再过多讲述。

参考维基百科循环冗余校验:https://zh.wikipedia.org/wiki/%E5%BE%AA%E7%92%B0%E5%86%97%E9%A4%98%E6%A0%A1%E9%A9%97

2、STM32中CRC计算单元

相信初学STM32的朋友都知道STM32中有个CRC计算单元,如果有不知道的去面壁思过(参考手册中目录一看就能看见CRC章节)。

但很多朋友都仅限知道有CRC计算单元这个东西,基本都没怎么进一步了解过。

STM32全系列产品都具有 CRC 外设(注意,是全系列都有), 对 CRC 的计算提供硬件支持,为应用程序节省了代码空间。

STM32的CRC(循环冗余校验)计算单元使用一个固定的多项式发生器从一个 32 位的数据字中产生 CRC 码。

在众多的应用中,基于 CRC 的技术还常用来验证数据传输或存储的完整性。

根据 EN/IEC60335-1 标准的规定,这些技术提供了验证 Flash 完整性的方法。CRC 计算单元有助于在运行期间计算软件的签名,并将该签名与链接时生成并存储在指定存储单元的参考签名加以比较。

CRC 主要特性

  • 使用 CRC-32 (以太网)多项式:0x4C11DB7

— X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ X +1

  • 单输入/输出 32 位数据寄存器

  •  CRC 计算在 4 个 AHB 时钟周期 (HCLK) 内完成

  • 8 位通用寄存器 (可用于临时存储)

---来自STM32参考手册

输入/输出数据的反转

STM32默认不对输入数据和输出数据进行位反转。

1.对输入数据的位反转操作可以设置为按字节/半字 /字为单元进行操作。例如输入数据为0x1A2B3C4D,

  • 每个字节内逐位反转,结果是 0x58D43CB2

  • 每半字内逐位反转,结果是 0xD458B23C

  • 每个字长内逐位反转,结果是 0xB23CD458

2.对输出数据的位反转

  • 例如输出数据为 0x11223344,反转后为 0x22CC4488

操作STM32的CRC比较简单,只有三个比较简单的寄存器,不管是使用寄存器,还是库函数,对于大部分人来说,没有多大难度。

看下标准库的部分函数源码:

2.jpg

3、CRC应用

我记得读书那个时候,想要把CRC搞明白好难啊,原因在于不知道学这个CRC到底有什么用途。

CRC用途其实非常广泛,我们最常见的就是在一些通信上,比如:Modbus:

3.jpg

再比如之前讲述的MAVLink通信协议:

4.jpg

CRC其主要目的就是验证数据的正确性。在CRC应用中,还有一个重要的作用:通过 CRC 校验对 FLASH 的完整性进行检查。

在对 FLASH 完整性检查的应用中,需要事先计算出整个 FLASH 的 CRC 校验值(不包括最后保存 CRC 值的字节),放在 FLASH 的末尾。在程序启动或者运行的过程中重新用同样的方法计算整个 FLASH 的 CRC 校验值,然后与保存在 FLASH 末尾的 CRC 值进行比较。

这个对Flash添加CRC校验主要目的:在远程升级程序可有效检查程序的完整性。

在IAR EWARM中有这么一个功能:Checksum。不知道大家使用过没,也是可以对Flash添加CRC的功能。看下图:

5.jpg

简单来说,这里的配置可以对Flash进行CRC计算,关于这里内容比较多,足以单独写一篇文章了,感兴趣的读者可以深入了解一下。

来源:strongerHuang

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

围观 190

负电压的产生电路图原理 

在电子电路中我们常常需要使用负电压,比如说我们在使用运放的时候常常需要建立一个负电压。下面就简单的以正5V电压到负电压5V为例说一下它的电路。

通常需要使用负电压时一般会选择使用专用的负压产生芯片,但这些芯片都比较贵,比如ICL7600,LT1054等。差点忘了MC34063了,这个芯片使用的最多了,关于34063的负压产生电路这里不说了,在datasheet中有的。下面请看我们在单片机电子电路中常用的两种负电压产生电路。

1.png

现在的单片机有很多都带有了PWM输出,在使用单片机的时候PWM很多时候是没有用到的,用它辅助产生负压是不错的选择。

上面的电路是一个最简单的负压产生电路了。使用的原件是最少的了,只需要给它提供1kHz左右的方波就可以了,相当简单。这里需要注意这个电路的带负载能力是很弱的,同时在加上负载后电压的降落也比较大。

由于上面的原因产生了下面的这个电路:

2.png

负电压产生电路分析

电压的定义:电压(voltage),也称作电势差或电位差,是衡量单位电荷在静电场中由于电势不同所产生的能量差的物理量。其大小等于单位正电荷因受电场力作用从A点移动到B点所做的功,电压的方向规定为从高电位指向低电位的方向。

说白了就是:某个点的电压就是相对于一个参考点的电势之间的差值。V某=E某-E参。一般把供电电源负极当作参考点。电源电压就是Vcc=E电源正-E电源负。

想产生负电压,就让它相对于电源负极的电势更低即可。要想更低,必须有另一个电源的介入,根本原理都是利用两个电源的串联。电源2正极串联在参考电源1的负极后,电源2负极就是负电压了。

3.jpg

一个负电压产生电路:利用电容充电等效出一个新电源,电容串联在GND后,等效为电源2,则产生负电压。

4.jpg

1、电容充电:当PWM为低电平时,Q2打开,Q1关闭,VCC通过Q2给C1充电,充电回路是VCC-Q2-C1-D2-GND,C1上左正右负。

5.jpg

2、电容C1充满电。

6.jpg

3、电容C1作为电源,C1高电势极串联在参考点。C1放电,从C2续流,产生负电压。

当PWM为高电平时,Q2关闭,Q1打开,C1开始放电,放电回路是C1-C2-D1,这实际上也是对C2进行充电的过程。C2充好电后,下正上负,如果VCC的电势为5点几伏,就可以输出-5V的电压了。

7.jpg

产生负电压(-5V)的方案

8.jpg

7660和MAX232输出能力有限,做示波器带高速运放很吃力,所以也得用4片并联的方式扩流。

第一版是7660两片并联的。

用普通的DC/DC芯片都可以产生负电压,且电压精确度同正电压一样,驱动能力也很强,可以达到300mA以上。

一般的开关电源芯片都能产生负电压,实在不行用开关电源输出的PWM去推电荷泵,也可以产生较大的电流,成本也很低,不知纹波要求多少,电荷泵用LC滤波之后纹波相当小的。7660是电荷泵,所以电流很小。

整个示波器的设计,数字电源的+5V和模拟电源的+5V是分开供电的,但是数字地和模拟地应该怎么处理呢?

数字地和模拟地是一定要连在一起的,不然电路没法工作。

数字部分的地返回电流不能流过模拟部分地,两个地应该在稳定的地参考点连在一起。

负电压的意义 

1、人为规定。

例如电话系统里是用-48V来供电的,这样可以避免电话线被电化学腐蚀。当然了,反着接电话也是可以工作的,无非是电压参考点变动而已。

2、通讯接口需要。

例如RS232接口,就必须用到负电压。-3V~-15V表示1,+3~+15V表示0。这个是当初设计通讯接口时的协议,只能遵守咯。PS:MAX232之类的接口芯片自带电荷泵,可以自己产生负电压。

3、为(非轨到轨)运放提供电源轨。

老式的运放是没有轨到轨输入/输出能力的,例如OP07,输入电压范围总是比电源电压范围分别小1V,输出分别小2V。这样如果VEE用0V,那么输入端电压必须超过1V,输出电压不会低于2V。这样的话可能会不满足某些电路的设计要求。为了能在接近0V的输入/输出条件下工作,就需要给运放提供负电压,例如-5V,这样才能使运放在0V附近正常工作。不过随着轨到轨运放的普及,这种情况也越来越少见了。

4、这个比较有中国特色,自毁电路。

一般来说芯片内部的保护电路对于负电压是不设防的,所以只要有电流稍大,电压不用很高的负电压加到芯片上,就能成功摧毁芯片。

本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。

围观 72

接口电路的设计在电单片机应用场合中还是很重要的,因为如果接口电路没有设计好,严重就会烧芯片,或者烧芯片IO口,轻者就会导致工作紊乱,工作不正常。

有时候这种问题自己在设计调试的时候根本发现不了,在批量生产或者用户在使用的时候才出现芯片被烧掉,或者IO口被烧掉。如果我们在设计的时候能考虑到接口的一些问题就可以减少,提高产品的可靠性。

下面我们就从电流倒灌问题和电平匹配问题进行叙述。

电流倒灌

1、概念

倒灌就是电流流进IC内部,电流总是流入电势低的地方。比如说电压源,一般都是输出电流,但是如果有另一个电源同时存在,并且电势高于这个电源,电流就会流入这个电源,称为倒灌。

2、危害

1)电流太大会将使IO口上的钳位二极管迅速过载并使其损坏。

2)会使单片机复位不成功。

3)会使可编程器件程序紊乱。

4)会出现闩锁效应。

3、原因

1.jpg

如上图,STM32的IO口框图。

当两个单片机进行串口通信,如果其中一个单片机断电,另一个单片机继续供电,正常运行。那么没有断电的单片机的IO口给断电的单片机的IO口供电,并同通过上拉保护二极管向断电的单片机进行供电。或者说两个单片机供电电压不一样,电流就会从供电高的一方流向供电低的一方。

4、解决办法

2.jpg
如上图,加一个小电阻,可以防止过流损坏二极管D1。还可以进行阻抗匹配,因为信号源的阻抗很低,跟信号线之间阻抗不匹配,串上一个电阻后,可改善匹配情况,以减少反射,避免振荡等。也可以减少信号边沿的陡峭程度,从而减少高频噪声以及过冲等。但不能解决灌流在Vcc上建立电压。一般情况下就会选择串电阻,取值范围是几欧到1K欧,根据实际情况而定,小编我喜欢取330欧。
3.jpg

如上图,在信号线上加二极管D3及上拉电阻R1,D3用于阻断灌流通路,R1解决前级输出高电平时使G1的输入保持高电平。

此方法既可解决灌流损坏二极管D1的问题,又可解决灌流在Vcc上建立电压。缺点只适用于速率不快的电路上。如果单片机IO口比较脆弱,或者两边电压不也一样需要低成本进行电平转换,且是但一方向,速率比较低(比如串口)的时候就可以选择该方案。二极管要选择肖特基二极管才比较好。

电平转换

在电路设计过程中,会碰到处理器MCU的I/O电平与模块的I/O电平不相同的问题,为了保证两者的正常通信,需要进行电平转换。如果两边的电平不一样就直接连接进行通信,像TTL电平就会出现上一节将的那样电流倒灌现象。

设计电平转换电路需要几个问题:

(1)VOH>VIH;VOL<vil

4.png

各种电平的电压范围,如上图。

(2)对于多电源系统,某些器件不允许输入电平超过电源电压,针对有类似要求的器件,电路上应适当做些保护。

(3)电平转换电路会影响通信速度,所以使用时应当注意通信速率上的要求。

1、NPN三极管电平转换

5.jpg

这个电平转换就是两级三极管电路组成。三极管只能单向进行转换,而且元器件比较多。

2、NMOS电平转换

6.jpg
该电路可实现双向传输,使用条件是VCC2>VCC1+0.7V,这个电路也是小编我常用的电路。

其工作过程是:

Port1向Port2传输:

(1)Port1高电平时,NMOS的Ugs=0V截止,Port2端的电压为VCC2高电平。

(2)Port1低电平时,NMOS的Ugs=3.3V导通,Port2端的电压为Port1端的电压低电平。

Port2向Port1传输:

(1)Port2高电平时,NMOS的Ugs=0V截止,Port1端的电压为VCC1--高电平。

(2)Port2低电平时,NMOS的体二极管导通,使得Vs的电压为0.7V左右,那么Ugs=VCC1-0.7V,只要选择的开启电压小于Ugs电压就可以让MOS管导通,Port1端的电压为Port2端的电压--低电平。

3、使用专用电平芯片转换电平

使用专用的电平转换芯片,分别给输入和输出信号提供不同的电压,转换由芯片内部完成,例如PCA9306DCTR等电平转换芯片。专用芯片是最可靠的电平转换方案。

7.png

优势:

1) 驱动能力强:专用芯片的输出一般都使用了CMOS工艺,输出驱动10mA不在话下。

2) 漏电流几乎为0:内部是一些列的放大、比较器,输入阻抗非常高,一般都达到数百K。漏电流基本都是nA级别的。

3) 路数较多:专用芯片针对不同的应用,从2路到数十路都有,十分适合对面积要求高的场合。

4) 速率高:专用芯片由于集成度较高,工艺较高,,速率从数百K到数百M的频率都可以做。

劣势:

1) 成本:专用芯片集众多优势于一身,就是成本是最大的劣势,一个普通的数百K速率的4通道电平转换芯片,价格至少要1元人民币以上,如果使用三极管做,成本2毛钱都不到。

8.jpg
4、使用电阻分压转换电平
9.jpg

优势:

1) 便宜:便宜是最大的优点,2个电阻一分钱不到;

2) 容易实现:电阻采购容易,占用面积小。

劣势:

1) 速度:分压法为了降低功耗,使用K级别以上的电阻,加上电路和器件的分布和寄生电容,速率很难上去,一般只能应用于100K以内的频率。

2) 驱动能力:由于使用了大阻值的电阻,驱动能力被严格控制,并不适合需要高驱动能力的场合,例如LED灯等

3) 漏电:漏电是该方案最大的缺点,由于通过电阻直连,左右两端的电压会流动,从而互相影响。例如,RS232接口采用该方案,上电瞬间外设就给主芯片提供2.8V的电平,轻则影响时序导致主芯片无法启动,重则导致主芯片闩锁效应,烧毁芯片。

5、使用电阻限流转换电平

10.jpg

优势:

1) 便宜:便宜是最大的优点,只需要一个电阻就解决。

2) 容易实现。

劣势:

1) 电阻选值不是很容易选择,需要对芯片内部很熟悉。

6、使用二极管转换电平

11.jpg

优势:

1) 漏电流小:由于二极管的漏电流非常小(uA级),可以单向防止电源倒灌,防止电流倒灌。

2) 容易实现。

劣势:

1) 电平误差大:主要是二极管的正向压降较大,容易超出芯片的工作电压范围。

2) 单向防倒灌:只能单向防止倒灌,不能双向防止倒灌。

3) 速度和驱动能力不理想:由于电阻限流,驱动速度和能力均不理想,只能应用在100K以内的频率。

来源:STM32嵌入式开发

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

围观 566

作为使用RX单片机进行逆变器控制的应用,以UPS为例对基于MCU的电源控制可行性进行介绍。

RX-T系列主要应用于空调室外机和工业逆变器,在逆变器控制领域享有盛誉。近年来,还广泛用于UPS、太阳能逆变器和EV充电器等电源控制应用中。本次以UPS电源控制应用为例,对基于MCU实现的电源控制进行介绍。UPS是一种具有以下三大功能的设备,是表现MCU控制电源基础功能的最佳设备。

UPS功能

  • AC-DC转换器(以下简称AC-DC),包括将市电转换为直流电源的PFC

  • DC-DC转换器(以下简称DC-DC),用于将高压直流电源转换为低压直流电源,并充电到电池,或将低压直流电源的电池电源放电,并转换为高压直流电源

  • DC-AC逆变器(以下简称DC-AC),可将直流电源转换为交流电源,以支持电源插座连接型电子设备

这些电源控制是使用RX产品家族中的以下通用功能在一个MCU中实现的。虽然本次使用的MCU属于RX产品家族的RX66T系列,但是RX产品家族中,只要具有如下功能,也可以实现类似的或部分功能。例如RX72T、RX24T。

RX产品家族使用功能

  • PWM输出定时器(MTU3d,GPTW)

  • 12位A/D转换器(S12ADH)

  • 端口输出使能(用于PWM输出紧急停止)(POE3B)

  • 比较器(用于过流检测)(CMPC)

  • 12位D/A转换器(用于比较器参考电压)(R12DAb)

我们利用这些RX产品家族中的适合逆变器控制的功能,构建了以下电路方式的电源控制功能。

UPS电路

AC-DC

  • 通过基于MTU3的互补PWM输出(载波频率60KHz)对电机控制设备中经常使用的电流连续模式交错配置PFC电路进行驱动,从而输出电流纹波较少的DC电源。

DC-DC

  • 升压电路和降压电路相结合的斩波电路通过MTU3互补PWM;

  • 输出(载波频率40KHz)进行驱动,从而无电压波动实施AC-DC电源充电至电池(降压模式)以及电池电源放电向DC-AC供电(升压模式)。

DC-AC

  • 通过GPT互补PWM输出(载波频率20KHz)实现功率半导体的开关功能,从而使电机控制等类似的桥式电路产生110V@50Hz的正弦波。控制算法通过矢量控制输出无失真的正弦波。

1.png

2.png

将这些电路进行组合形成UPS,电源效率可高达98%以上,性能与专用产品相当。这使得除了AC-DC的PFC IC和DC-DC的功率IC等专用产品外,还可以实现基于MCU的电源控制产品,从而为客户提供更多的选择,做到适材适所。

本次为大家介绍了电源控制(UPS)作为逆变器控制应用的可行性。我们将继续推出符合客户需求的优质产品,为客户的创新事业添砖加瓦。敬请期待瑞萨RX产品家族的进一步发展。

更多资料

有关本次介绍的UPS的更多信息,请点击下方链接查看UPS应用指南:

https://www.renesas.cn/cn/zh/document/apn/rx66tgroup-digital-power-conversion-uninterruptible-power-system-ups-rev100

有关RX66T的更多信息,请点击下方链接查看RX66T产品页:

https://www.renesas.cn/cn/zh/products/microcontrollers-microprocessors/rx-32-bit-performance-efficiency-mcus/rx66t-32-bit-microcontrollers-optimal-motor-control-industrial-home-appliance-and-robotics-applications

RX66T样例程序,请点击下方链接进入官网下载页面:

https://www.renesas.cn/cn/zh/document/scd/rx66tgroup-digital-power-conversion-uninterruptible-power-system-ups-rev100(注册并登录瑞萨电子官网后即可下载)

来源:瑞萨电子

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

围观 42

之前为大家分享的《Cortex-M位带操作的原理》,虽然现在不常用位带操作了,但里面很多知识点值得学习和了解。

指针变量及例子

位带操作牵涉到的一个重要知识点就是指针变量。

这种位带映射操作,就是操作映射过后的地址,其实就是操作指针变量(存放地址的变量)。
指针变量是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址。《摘自百度百科【指针变量】》
指针变量的例子:

int main(void)
{
   uint32_t *p;

  p = (uint32_t *)(0x42210184);

  System_Initializes();
  while(1)
  {
    *p = 0;
    TIMDelay_Nms(500);

    *p = 1;
    TIMDelay_Nms(500);
  }
}

上面例子中给p指针变量赋的值是“0x42210184”,只是强制转换成(uint32_t *)这种指针类型。 

而*p = 0;代表该地址上的数据值为0;也就是上面说的该地址存放的数据为0; 

前面有一个朋友问过我关于指针变量的问题,看到这里,相信你应该知道使用指针变量,直接打印指针就可以判断指针是否越界。

指针变量---位带操作

上面代码中“0x42210184”代表STM32F103系列芯片中PA1的位带别名地址(就是映射过去的地址),截一个图,大家看看:

1.jpg

提示:上图中对p的赋值,其实是一样的(在STM32中),都是0x42210184。
结合公式理解:

之前文章《位带操作原理》列出了关于片上外设区计算公式:

AliasAddr = 0x42000000+(A-0x40000000)*32 + n*4
对比截图中第一个p赋的值,就是片上外设的计算公式。

第二个p只是对代码优化了:“&”到“-”的优化,可以看编译器相关手册。
第4个p就是上一节代码中值,有没有发现,位带操作其实就操作指针变量啊?
这样相比读出寄存器,再&或者|再写入寄存器的效率要高多啦?
位带别名区最低有效位

有朋友发现,*p = 0;这样操作对地址0x42210184(PA1输出)写入0,PA1输出低。假如我写入0x10,那么PA1输出多少呢?

答案:输出低。
原因在于:在位带区中,每个比特都映射到别名地址区的一个字只有 LSB 有效,也就是最低一位有效。

位带操作另一种宏定义

有通过之前的两个公式,可以推出下图的公式:

2.jpg

上面框起来的定义适合RAM和外设两种,假如定义一个LED为PA1,只需要将PA1相关参数传入即可。
LED另外一种定义:

#define LED BIT_ADDR((GPIOA_BASE + 12), 1)
这种定义需要注意:+12,其实是ODR相对GPIOA的基地址的偏移地址。
我曾在这里遇到的坑:我将STM32F1的移植到F4上,出现了问题,我找了半天才发现由于这个偏移地址不一样导致的。
STM32F1的ODR偏移是12,而F4的ODR偏移是20。所以,建议大家使用GPIOA->ODR这种方式。(不管是标准外设库还是HAL库都有这样定义)。

来源:strongerHuang

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

围观 21

一、前言

程序存储器(又称数据Flash),顾名思义,是用来存储用户的程序,使单片机能够按照编写的代码顺序执行,完成指定的任务。所以程序存储器是只读存储器(只读存储器),我们已经听过很多次了。

代码存储在程序存储器里面,一般有常数、表格、pi值、数码管形状、SCM ID号、内部参考信号源、关机唤醒定时器频率、IRC参数等数据。

注意: 单片机每次都是烧录程序,烧录就是为了把代码放到程序存储器中,而我们用的电脑则是把硬盘的数据和程序放到RAM,再用CPU去读取RAM里面的数据和程序。

二、存储器的存储单位与编址

存储信息的基本单位称存储元件,每个存储元件是一个二进制位,一位可存放一个二进制数0或1,每8位组成一个字节。

编址是为了方便我们存取存储器中的信息,我们需要给每个存储单元编号,即编址。

1. 存储单位

  • 位(bit):计算机的最小数据单位

  • 字节(Byte):1Byte = 8bits

  • 字(Word):1Word = 2Bytes = 16bits

2. 编址

51单片机的存储单元是一个字节,为了存取数据方便,每个存储单元都有编号,这个编号就是编址,编址采用二进制数。例如:0000 0010B可以代表第二个存储单元。

三、51单片机有哪些内部存储器

存储器是单片机的又一个重要组成部分,存储容量为256个单元的存储器结构中每个存储单元对应一个地址,256个单元共有256个地址,用两位16进制数表示,即存储器的地址(00H~FFH)。

存储器中每个存储单元可存放一个八位二进制信息,通常用两位16进制数来表示,这就是存储器的内容。存储器的存储单元地址和存储单元的内容是不同的两个概念,不能混淆。

1.片内RAM

RAM(Random Access Memory)又叫随机存取存储器,正常情况下不仅可以写入数据到RAM,也可以从RAM读取数据。

单片机内部总共有256Bytes的RAM。RAM的每一个字节都有编码,从0000 0000开始直到1111 1111,不同区域的RAM有着不同的功能。可以把RAM想象成一栋办公楼,不同的楼层有不同的部门,不同的部门自然干不同的活。

注意: 因为单片机一次只能处理8个bit的数据(字长为8),并且一个8位二进制数的范围是0到256,所以单片机一次能寻址的范围也就是0到256。

2.片内ROM

ROM(Read-OnlyMemory),又叫只读存储器,正常情况下只能从ROM读取数据,不能往写入数据。

单片机内部的ROM大小为4KB(4096Bytes),字节地址范围为000H~0FFFH。

在特殊条件下,可以把程序烧入到ROM中,所以ROM也叫程序存储器。

如果ROM的大小不够存入所有程序,也可以外接ROM。单片机最多可外接64KB的ROM。内部ROM和外部ROM是统一编址,要么就只用64KB的外部ROM,要么就用4KB的内部ROM+60KB的外部ROM(外部ROM的开头4KB闲置)。

3.外部数据存储器

外部数据存储器一般由静态 RAM 构成,其容量大小由用户根据需要而定,最大可扩展到 64KB RAM,地址是 0000H~0FFFFH。CPU 通过 MOVX 指令访问外部数据存储器,用间接寻址方式,R0 、R1 和 DPTR 都可作间接寄存器。

注意: 外部 RAM 和 扩展的 I/O接口是统一编址的,所有的外扩I/O 口都要占用 64KB 中的地址单元。

四、如何区分ROM和ROM

片内ROM和片外ROM的区分:在单片机既有片内ROM又有片外ROM时,会产生一部分重复的地址范围,为了解决区分片内和片外ROM的问题,51单片机设置了一根控制线EA(低电平有效),所以

EA = 0 => 有效 => 访问片内存储器

EA = 1 => 无效 => 片内存储器被忽略

本质的原理:就是当PC的值大于了某个值时将访问外部存储器,PC的值小于了某个值时将访问内部存储器。这个值由存储器容量的大小绝定,在8051单片机中,片内ROM = 4KB,所以当PC小于0FFFH时,访问片内ROM。

五、存储器数据读写说明

要对256字节存储器的每个存储单元进行读写,需要8根地址线和8根数据线,先送8位地址选中某个存储单元,再根据读控制或写控制,将选中的存储单元的8位数据从8根数据线送出,或通过8根数据线将8位数据存入选中的存储单元中。

当地址总线A7~A0将8位地址00011111(1FH)送入存储器时,会选中内部编址为1FH的存储单元,这时再从读控制线送入一个读控制信号,1FH 存储单元中的数据00010111从8根数据总线D7~D0送出。

六、总结

对于RAM和ROM,当我们写程序的时候,我们把程序误认为ROM,也就是说,我的某个逻辑形成了一系列的逻辑开关,但是当CPL进行操作的时候,在传输的过程中,交换逻辑需要不断的改变,所以RAM就诞生了。

但是由于技术的限制,RAM不能下电来保存逻辑,即电路中的每个硅电子都不能被保存,并且这个过程限制了内存的大小。因此,RAM和ROM是通过CPU总线连接的。

通过51单片机的RAM地址,ROM地址,可以看到,ROM存储程序,通过CPU传递数据,到RAM,而RAM是各个寄存器的集合,按ROM程序形成逻辑,响应CPU,同时传递给ROM信号(这里ROM的逻辑已不变,相当于与或非的各种开关)。

来源:嵌入式悦翔园(作者:JamesBin)

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

围观 121

近些年的MCU市场,8位单片机一直是这个领域的主力军之一,尽管随着物联网的发展,特别是近年来对智能化、高安全性、高可靠度等性能需求的提高, 32位MCU的占比有着些许的攀升。但8位单片机凭借其应用的简单灵活、安全稳定、成本优势等特点,在诸如手环、蓝牙耳机、校园卡等低功耗场景下都占据着绝对的使用比例;另外,在较复杂的白电场景中,例如电视机、空调、洗衣机,以及冰箱等一系列应用,也都有8位MCU的身影;并且在对速率要求较高,安全性要求有需求的场景下,比如医疗保健、数据处理、工业控制、通信等产业场景下,大量的数据也需要越来越多IO处理工作,这无形中也增加了对8位MCU的需求。

Microchip的8位单片机作为这个领域的翘楚,其PIC与AVR系列 MCU 作为这个区间的两种行业领先架构,有哪些技术上的独到技术和过人之处?本期视频,就请Microchip市场推广经理张荣宝 (Paul Zhang)老师带着大家一探究竟。

访谈嘉宾

1.jpg

张荣宝 (Paul Zhang),MCU8产品部市场推广经理

现于 MicrochipTechnology Inc.(美国微芯科技公司)上海分公司任市场推广经理,负责公司8位单片机产品的营销。他拥有10多年的嵌入式应用的研发经验和单片机 产品的推广经验。张荣宝于1996年毕业于山东科技大学,获得机械电子工程专业学士学位;于2007年获得复旦大学电子与通信工程专业的硕士学位。

点击观看


2.jpg

(图片来源:Microchip Technology Inc.)

更多相关设计资源,归纳如下

关于Microchip Technology

Microchip Technology Inc. 是领先的微控制器和模拟半导体提供商,为全球范围内数以千计的各类客户应用提供低风险产品开发、更低的总系统成本和更快的面市速度。Microchip 的总部位于亚利桑那州钱德勒市,提供杰出的技术支持,交付及时可靠,产品品质优异。

小编的话

作为全球最大的8位单片机供应商,Microchip致力于推动8位单片机的发展和应用。通过张荣宝先生的介绍和分析,想必大家对8位单片机何以仍然能够快速发展有了更为清晰的了解。您正在使用8位单片机开发哪些产品?您在应用AVR 和 PIC MCU 产品系列过程中有哪些心得和经验?欢迎分享和讨论。

来源:得捷电子DigiKey

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

围观 19

前言

在STM32之前,都是老大头51,带着它的“小弟们” MSP430、AVR、PIC在单片机界呼风唤雨。

那个时候,市场上遍布8位机,大学教材用51入门,个人、企业学单片机基本上也都在用51。虽然AVR也有一些8位机市场,但与stc带领下的51单片机是完全不能相比的。当然,这个时候也有16位机的msp430,其他厂家单片机还有pic,高端嵌入式处理器等市场有arm7、arm9等。这个时期的单片机市场是百花齐放、百家争鸣,但总体来说,还是势均力敌、一片祥和的。那么,这个局势是从什么时候开始打破的呢?这还得从物联网的崛起说起。 

原因

当时,物联网(Internet of Things,IoT)逐步进入人们的视野范围。随着它的发展,嵌入式领域对于高性能处理器的需求呈现爆发式增长。

虽然8位CISC(复杂指令)架构内核8051占据了半壁江山,但奈何其性能低下,寻址范围受限,已经难以适应更多的新兴应用领域。而32位架构微处理器内核凭借其极佳的执行效能,不仅能满足物联网对数据处理能力的要求,还能兼顾物联网的低功耗和高性能要求,斩获物联网市场的独家宠爱。在32位架构微处理器中,属ARM公司推出了面向各类嵌入式应用的微控制器核Cortex-M内核受到市场青睐,Cortex-M之于32位MCU就如同8051之于8位MCU。而正是Cortex-M的出现,让ST公司看到了这个内核的强大之处——利用该内核设计了大放光芒的STM32,打破了曾经的单片机局面。

崛起过程

如今,我们往回看那段历史,会发现一切改变都由那时发生——

从2007年6月11日推出第一代STM32产品——Cortex-M MCU STM32F1开始,单片机市场迎来了STM32新星,32位MCU浪潮,如期而至。

1.jpg

2.jpg

此后,芝麻开花节节高,STM32成功的故事也一直在延续。ST公司陆续在每一年都基于新的内核或者新的技术领域有所突破,发布超过了19个STM32 产品系列,包括一个MPU产品线,生产工艺也从180nm不断进阶到110nm、90nm和40nm。例如:

2009年推出了全球第一款超低功耗系列STM32 L1;

2010年推出了第一款在高性能的基于90纳米工艺、120 MHz 的STM32F2产品线;2011年推成第一款高性能Contex-M4的处理器STM32F4;

......

2019年推出全球最为强大的第一款双核处理器STM32MP1、最新一代混合信号Contex-M4 MCUs和世界上最大的MCU STM32H7;

2020年推出全球首颗内置LoRa收发器的SoC——STM32WL。

3.jpg

“一只南美洲亚马逊流域热带雨林中的蝴蝶,偶尔扇动几下翅膀,可以在两周以后引起美国德克萨斯州的一场龙卷风。”STM32这只小蝴蝶带来的改变效果也很明显。2007年ST公司的通用MCU全球排名还只是第11位,2015年便上升到第3位,2018年上升到第2位,2018年则在中国供应商的排名中ST公司一举拿下第一的高地,此后数年,ST的地位几乎无人撼动。

4.jpg

如何学习

入坑STM32后,我们应该如何学习?

如今,STM32堪称爆火,并且潜力无穷。所以,有很多人都在学STM32。

但STM32对入门者可能不是特别友好,因为知识很多,但是对于有一定开发经验的人来说,就是一把好兵器,它能帮你大大缩短开发周期。

那应该如何入坑STM32呢?

(1) 根据时间表定时定量学习

大学时期,都有实验室的学长学姐带着入门,安排任务。

比如,基本任务是一周内学完搭好环境、熟悉调试软件,结合《STM32Fxxx参考手册》、《STM32固件库使用手册》和光盘视频,实现基本篇的GPIO应用。

(2) 举一反三,并通过阶段任务检查学习效果

在学习例程时,可以尝试修改该例程的外设配置,达到举一反三的效果。

每一周,学长学姐会根据你的学习进度,安排给你一个阶段任务,用来检查你的学习效果。

如果你是自学,那么可以根据网上教程和各大资源网站上的“STM32入门小项目合集”,主动给自己找一个小项目,把它实现出来。

这里我推荐正点原子的资源,毕竟每次看视频时的片头曲“我的未来不是梦”让我对STM32充满激情,当然野火、小苗、普中也不错~

(3) 基本外设、功能会用就行,后期需要什么再去针对性地学

按部就班地把STM32知识从头到尾系统性地学习完,固然很好。但是,你要知道学习单片机只是为了解决问题,我们只要在遇到问题时,能够通过STM32解决就行。

因此,当你把基本外设、功能都差不多掌握了,程序能跑起来,并且也知道哪里可以修改、修改成什么就已经基本入门了。

此后,你可以通过一些大大小小项目,巩固理解和探索新功能,你的经验也随之增加。

(4) 学好C语言,可以学着画PCB制板、焊接

软件和硬件都要两手抓。C语言对于STM32的学习至关重要,C语言不好,还跑什么代码?学会画板子、焊板子,这样有什么需求,都可以自己添加。

当然,上面的建议都是给0基础的STM32入门者,若是你有一定基础,那当然是对症下药,哪里不会补哪里。

学海无涯,勇于探索新技术

“学海无涯、永无止境”,更何况是每一年都在推陈出新的STM32。

事实上,STM32 的开发方式已经发生了很大的变化。

比如:

2014 年,ST 公司推出了 HAL 库和 MCU 图形化配置软件STM32CubeMX。

2017 年年底,ST 公司收购了 Atollic 公司,把专业版 TrueSTUDIO 转为免费软件。

2019 年 4 月,ST 公司正式推出了自己的 STM32 程序开发 IDE 工具软件 STM32CubeIDE1.0.0,打造了一个完整的 STM32Cube 生态系统。

而STM32Cube 生态系统已经完全抛弃了早期的标准外设库,STM32 系列 MCU 都提供 HAL固件库以及其他一些扩展库。

STM32Cube 生态系统的两个核心软件是STM32CubeMX 和STM32CubeIDE,且都是由 ST 官方免费提供的。

使用 STM32CubeMX 可以进行 MCU 的系统功能和外设图形化配置,可以生成STM32CubeIDE 项目框架代码,包括系统初始化代码和已配置外设的初始化代码。

如果用户想在生成的 STM32CubeIDE 初始项目的基础上添加自己的应用程序代码只需把用户代码写在代码沙箱段内,就可以在 STM32CubeMX 中修改 MCU 设置,重新生成代码,而不会影响用户已经添加的程序代码。

由此看来,使用STM32CubeMX 和 TrueSTUDIO 进行STM32 开发是一个良好的组合方式!

本文直接来源:嵌入式资讯精选

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

围观 32

页面

订阅 RSS - 单片机