单片机

单片机执行指令过程详解

单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可分为三个阶段进行。即取指令-----分析指令-----执行指令。

取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。

分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。如指令要求操作数,则寻找操作数地址。

计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。

一般计算机进行工作时,首先要通过外部设备把程序和数据通过输入接口电路和数据总线送入到存储器,然后逐条取出执行。但单片机中的程序一般事先我们都已通过写入器固化在片内或片外程序存储器中。因而一开机即可执行指令。

下面我们将举个实例来说明指令的执行过程:

单片机如何执行代码命令,单片MCU内存如何分配?

开机时,程序计算器PC变为0000H。然后单片机在时序电路作用下自动进入执行程序过程。执行过程实际上就是取出指令(取出存储器中事先存放的指令阶段)和执行指令(分析和执行指令)的循环过程。

例如执行指令:MOV A,#0E0H,其机器码为“74H E0H”,该指令的功能是把操作数E0H送入累加器,0000H单元中已存放74H,0001H单元中已存放E0H。当单片机开始运行时,首先是进入取指阶段,其次序是:

 1 程序计数器的内容(这时是0000H)送到地址寄存器;

 2 程序计数器的内容自动加1(变为0001H);

 3 地址寄存器的内容(0000H)通过内部地址总线送到存储器,以存储器中地址译码电跟,使地址为0000H的单元被选中;

 4 CPU使读控制线有效;

 5 在读命令控制下被选中存储器单元的内容(此时应为74H)送到内部数据总线上,因为是取指阶段,所以该内容通过数据总线被送到指令寄存器。

至此,取指阶段完成,进入译码分析和执行指令阶段。

由于本次进入指令寄存器中的内容是74H(操作码),以译码器译码后单片机就会知道该指令是要将一个数送到A累加器,而该数是在这个代码的下一个存储单元。所以,执行该指令还必须把数据(E0H)从存储器中取出送到CPU,即还要在存储器中取第二个字节。其过程与取指阶段很相似,只是此时PC已为0001H。指令译码器结合时序部件,产生74H操作码的微操作系列,使数字E0H从0001H单元取出。

单片机执行指令过程详解

因为指令是要求把取得的数送到A累加器,所以取出的数字经内部数据总线进入A累加器,而不是进入指令寄存器。至此,一条指令的执行完毕。单片机中PC=0002H,PC在CPU每次向存储器取指或取数时自动加1,单片机又进入下一取指阶段。这一过程一直重复下去,直至收到暂停指令或循环等待指令暂停。CPU就是这样一条一条地执行指令,完成所有规定的功能。

对于一款mcu来说,在性能描述的时候都会告诉sram,flash的容量大小,对于初学者来说,也不会去考虑和理会这些东西,拿到东西就只用。其实不然,这些量都是十分重要的,仔细想想,代码为什么可以运行,代码量是多少,定义的int、short等等类型的变量究竟是怎么分配和存储的,这些问题都和内寸有关系。

首先单片机的内存可以大小分为ram和rom,这里就不再解释ram和rom的区别了,我们可以将其等效为flash和sram,其中根据flash和sram的定义可得,flash里面的数据掉电可保存,sram中的并不可以,但是sram的执行速度要快于flash,可以将单片机的程序分为code(代码存储区)、RO-data(只读数据存储区)、RW-data(读写数据存储区)和ZI-data(零初始化数据区)。在MDK编译器下可以观察到在代码中这4个量的值,如下图1所示:

图1:

单片机执行指令过程详解

其中code和RO-data存储在flash中,所以两者之和为单片机中flash需要分配给它们的空间大小(并且等于代码所生成的.bin文件大小),另外RW-data和ZI-data存储在sram中,同样两者之和为单片机中sram需要分配给它们的空间大小。

另外,我们必然会想到栈区(stack)、堆区(heap)、全局区(静态区)(staTIc)、文字常量区和程序代码区和上面所介绍的code、RO-data等的关系。

单片机执行指令过程详解

1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 这些值是可读写的,那么stack应该被包含在RW-data(读写数据存储区),也就是单片机的sram中。

2、堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。可以理解,这些也是被包含在单片机的sram中的。

3、全局区(静态区)(staTIc):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。这些数据也是可读可写的,和stack、heap一样,被包含在sram中。

4、文字常量区:常量字符串就是放在这里的。这些数据是只读的,分配在RO-data(只读数据存储区),则被包含在flash中。

5、程序代码区:存放函数体的二进制代码,可以想象也是被包含在flash,因为对于MCU来说,当其重新上电,代码还会继续运行,并不会消失,所以存储在flash中。

综上所述,MCU的内存分配基本如此,其中并没有提到存储空间所对应的flash和sram地址,这些后面还会讲到!如有错误,请指正。

来源:电子发烧友

围观 354

蝴蝶效应理论想必大家都很清楚,而就在十年前的六月,意法半导体(以下简称ST)在北京首发了全球首款采用ARM Cortex-M3 内核的处理器STM32 F3,与此同时,选择了一只蝴蝶作为产品的Logo,正是这只蝴蝶,搅乱了整个MCU市场。

图:尽管公司的平面设计从美女变成了运动员,但那只蝴蝶还在
图:尽管公司的平面设计从美女变成了运动员,但那只蝴蝶还在

正如STM32之父、意法半导体微控制器事业部市场总监Daniel Colonna表示,“十年前我们选择了蝴蝶作为STM32的代表Logo,意味着我们要利用STM32,为工程师、开发者们释放更多创造力。”这是Daniel在意法半导体十周年纪念仪式上回忆的。除Daniel之外,意法半导体亚太区MMS及物联网副总裁Arnaud Julienne,意法半导体中国微控制器事业部市场及应用总监曹锦东悉数到场,一起回顾STM32这十年取得的成功,以及对今后微控制器市场的预测。

一只蝴蝶,改变了单片机市场——STM32诞生十周年纪念
图:从左至右依次为,意法半导体微控制器事业部市场总监Daniel Colonna;意法半导体中国微控制器事业部市场及应用总监曹锦东;意法半导体亚太区MMS及物联网副总裁Arnaud Julienne

2007年的那只蝴蝶

2007年,ST的第一大客户还是如日中天的Nokia,为了应对市场的变化,彼时刚刚上任一年多的CEO Carlo Bozotti,进行了大刀阔斧的架构改革。Bozotti将ST的半导体产品部划分为三大事业部,分别为ASG、FMG和IMS。其中ASG(Application Specific Product Groups)包括了移动,多媒体和通信,家庭娱乐与显示,个人电脑以及汽车产品部,FMG(Flash Memories Group)则是存储部门,也就是后来的Numonyx,IMS(Industrial and Multisegment Sector)部门则由模拟/功率/传感器(APM)部门与微控制器/存储/智能卡(MMS)两大部门组成,其中STM32所属的MMS部门领导由Claude Dardanne担任,时至今日,无论公司如何改组,Claude Dardanne依然领导着微控制器和数字IC事业部,足见公司对于该产品部的重视。

这一年,除了部门改组,ST还和Intel联合成立了Numonyx公司,收购了数字电视芯片供应商Genesis Microchip,与诺基亚签署合作计划,获得其调制解调器技术授权以及3G芯片开发业务。

如今,无论是数字电视、存储器还是手机芯片业务,ST都已放弃,当时谁能想到,MCU成为了公司现今一大支柱产业。

正如Arnaud所说:“10年很短,但对于半导体产业来讲,十年时间很长,会发生很多变化。”

STM32有多成功

Arnaud表示,十年前,意法半导体在中国通用MCU市场占有率仅为2%左右,排名10名以外,而现在占有率提升到了14.1%,在国内Cortex-M单片机市场中占有率更高达45.8%,已成为全球第二大通用微控制器厂商。

STM32 MCU年总产值从2007年的四千万美金增长到现如今的4亿美金,年复合增长率达27%,最近几年更是基本保持着两年翻一番的增长势头。

图:STM32 年营业额
图:STM32 年营业额

在Daniel给出的图中显示,2017年,STM的出货量将达到恐怖的每秒32颗,也就是一年10亿颗。

图:STM32出货量里程碑
图:STM32出货量里程碑

<成功离不开天时地利与人和/strong>

俗话说站在风口猪都会飞,STM32的成功正赶上32位单片机市场的爆发,2010年,32位MCU市场销售额超过了8位机,成为业界主导,根据IC Insight预测,到2020年32位MCU还将有10%的年复合增长率。而其中物联网微控制器的年均复合增长率更是达到了17.6%,届时年出货接近25亿美元。

图为MCU营业额预测

图为IOT MCU营业额预测
上图为MCU营业额预测,下图为IOT MCU营业额预测

地利源于ST对于技术的不断追求,从2007年全球首发STM32 F1之后,每年ST都会有新品推出,满足市场的不同需求。如图所示。

图:STM32发布的里程碑事件,几乎每年都会有新品推出
图:STM32发布的里程碑事件,几乎每年都会有新品推出

“十年前,我们发布的STM32,用180nm工艺做的,128kb flash,20Kb RAM,Cortex-M3 72MHz主频,而现在最新发布的产品STM32 M7主频提升到400M,工艺变成40nm,拥有2048KB闪存以及1024KB RAM。这表明STM32永远给客户更多选择,无论是性能还是存储的多样化方面,我们永远给市场承诺,让客户可以掌握先机。”

Daniel自豪地表示:“时至今日,STM32依然是中国工程师、开发者设计项目的首选,比如应用在现在流行的共享单车上,这也证明我们当时对产品的定义,对客户的需求的把握都恰到好处,我也为此感到无比自豪。”

人和则是STM32对中国工程师的大力支持,“过去十年中,我也经常访问中国,拜访我们的大客户、小客户,所以从内心来讲我对中国有很深的感情。”Daniel称。

Arnaud表示,STM32的成功得益于中国市场的爆发,ST每年都会不遗余力的培养中国MCU生态系统,从媒体广告合作到线上论坛,从先下峰会到技术培训,从大学人才培养到本地化内容,STM32已拥有10万个以上客户群,有超过百万工程师掌握了STM32产品技术。

十年前,ST在中国的单片机市场只有一些大客户,通过上述一系列动作,目前,据统计STM32产品有超过70%来自中小客户,中国区出货量占比也提升到了36%。

关于STM32的未来与承诺

关于STM32未来的愿景,Daniel畅想到:“第一,STM32依然保持嵌入式应用,包括IoT、智能工业、智能家居、应用里的核心,ST的功能是发挥它的智慧,通过软件实现更加智能的世界。我们希望STM32在市场上是创新,技术上的领先者、先行者。第二,我们希望STM32能成为所有的客户,包括大客户,和中小客户,在开始他们新项目或是新创意时候的首选。”

“往往新的、特别的创意都来自于中小客户,因为中小客户没有太多的限制,设计师会有更加令人称赞的设计,我们希望能够通过自己的渠道,产品的知名度,以及媒体的宣传,能够更好地支持中小客户的产品设计。”Daniel表示。实际上通过公布的客户资料显示,STM32客户群既有亚马逊、苹果、任天堂等大公司,同时又有Pogotec、UBTECH、Netatmo等初创创新公司。

Arnaud解释道:“MCU是个非常通用的产品线,纵观市场上的众多应用,一是过去没有用MCU的应用如今在用MCU;二是过去用MCU的应用现在依然在用MCU,可能是更高性能、更低功耗的MCU。当然随着市场成熟,会有一些SoC出来, 抢占部分MCU市场,或者把MCU集成到主控制器里。这一切都表明MCU市场永远是动态的,所以要准确把握市场动向,多接触中小客户。”

Daniel承诺,ST会不断投资STM32的未来,在产品线、可靠性和产品灵活度上,无论是STM32系统、内部的开发蓝图,以及合作伙伴的合作方面,尽力发布更加优异的产品,给用户提供MCU和整个生态系统。

在技术蓝图方面,Daniel的承诺如下:

首先,是注重低功耗无线产品线,同时也会更加注重高性能产品线。

第二,在GUI图像显示方面,ST会继续推进包括图形显示库在内的多种方式,同时ST有三家GUI协议栈合作伙伴,可以覆盖从低端到高端的用户体验。

第三,安全性是永恒的话题,STM32将更加安全,包括软件相关库,认证库和外设等方面。作为为数不多的智能卡方案供应商,STM32将嵌入更多的安全性功能。

第四,是ST将推出更多高性能产品应对工控需求,特别是马达控制领域。当然马达控制不仅在工业控制,在消费电子,包括航模、净化器、空调、风机等都有可能用到。

第五,会投入更多传感器相关领域,作为全球排名前列的传感器供应商,ST会加强传感器同MCU的协同垂直合作上。

第六,ST将继续发展无线传输领域,与STM32配合。包括NB-IOT、LoRa、SigFoX、Thread等新兴标准,同时也包括WiFi、蓝牙等传统领域,都会有相配套产品出现。

着力打造差异化的十年

十年前,当ST刚刚推出STM32时,Daniel就被媒体问道如果以后都采用ARM内核,那么单片机的差异化出路在哪里?ST如何应对竞争?Daniel也许忘记了当年的答案。

十年过去了,尽管越来越多公司推出ARM内核MCU,但STM32的市占率却屡创新高,这应该就是最好的回答。

为什么会这样?

Daniel认为,STM32差异化来自两方面,一个是拥有广泛且全面的产品线,客户的开发或升级都有很好的兼容性。第二是品牌建设,经过十年的耕耘,STM32尤其是在年轻工程师市场中拥有良好口碑,这对于MCU选型来说非常重要。当然这也离不开生态系统的建设,通过强大的开发者生态系统,一方面更为方便地帮客户进行开发,同时通过了解客户需求,进一步改进或规划未来的产品方向,实现良性循环。

Arnaude则补充了STM32成功的另外两个差异化:“ST是当今产品线最全的半导体供应商之一。用户在设计产品时,不仅会选择MCU,同时还选择功率器件、传感器、无线等产品。如今ST可以以系统供应商的方式为工程师服务,这就确保了用户对ST有着足够的忠诚度和依赖性。最后,则是ST拥有强大的本地技术开发与支持团队,确保公司层面策略的执行和本地化市场活动的执行。”

“MCU市场不仅只有我们一家,十年以来竞争从未消失,反而越来越激烈,我们必须从产品、设计、制造等方面不断突破自我,才能在这场赛跑中保持领先。”Daniel说。

来源: EEWORLD

围观 496

单片机现在可谓是铺天盖地,种类繁多,让开发者们应接不暇,发展也是相当的迅速,从上世纪80年代,由当时的4位8位发展到现在的各种高速单片机……

各个厂商们也在速度、内存、功能上此起彼伏,参差不齐~~同时涌现出一大批拥有代表性单片机的厂商:Atmel、TI、ST、MicroChip、ARM…国内的宏晶STC单片机也是可圈可点…

下面为大家带来51、MSP430、TMS、STM32、PIC、AVR、STC单片机之间的优缺点比较及功能体现……

51单片机

应用最广泛的8位单片机当然也是初学者们最容易上手学习的单片机,最早由Intel推出,由于其典型的结构和完善的总线专用寄存器的集中管理,众多的逻辑位操作功能及面向控制的丰富的指令系统,堪称为一代“经典”,为以后的其它单片机的发展奠定了基础。

51单片机之所以成为经典,成为易上手的单片机主要有以下特点:

特性:

1. 从内部的硬件到软件有一套完整的按位操作系统,称作位处理器,处理对象不是字或字节而是位。不但能对片内某些特殊功能寄存器的某位进行处理,如传送、置位、清零、测试等,还能进行位的逻辑运算,其功能十分完备,使用起来得心应手。

2. 同时在片内RAM区间还特别开辟了一个双重功能的地址区间,使用极为灵活,这一功能无疑给使用者提供了极大的方便,

3. 乘法和除法指令,这给编程也带来了便利。很多的八位单片机都不具备乘法功能,作乘法时还得编上一段子程序调用,十分不便。

缺点:(虽然是经典但是缺点还是很明显的)

1. AD、EEPROM等功能需要靠扩展,增加了硬件和软件负担

2. 虽然I/O脚使用简单,但高电平时无输出能力,这也是51系列单片机的最大软肋

3. 运行速度过慢,特别是双数据指针,如能改进能给编程带来很大的便利

4. 51保护能力很差,很容易烧坏芯片

应用范围:

目前在教学场合和对性能要求不高的场合大量被采用

使用最多的器件:8051、80C51

MSP430单片机

MSP430系列单片机是德州仪器1996年开始推向市场的一种16位超低功耗的混合信号处理器,给人们留下的最大的亮点是低功耗而且速度快,汇编语言用起来很灵活,寻址方式很多,指令很少,容易上手。主要是由于其针对实际应用需求,把许多模拟电路、数字电路和微处理器集成在一个芯片上,以提供“单片”解决方案。其迅速发展和应用范围的不断扩大,主要取决于以下的特点…

特性:

1. 强大的处理能力,采用了精简指令集(RISC)结构,具有丰富的寻址方式( 7 种源操作数寻址、 4 种目的操作数寻址)、简洁的 27 条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储器都可参加多种运算;还有高效的查表处理指令;有较高的处理速度,在 8MHz 晶体驱动下指令周期为 125 ns 。这些特点保证了可编制出高效率的源程序

2. 在运算速度方面,能在 8MHz 晶体的驱动下,实现 125ns 的指令周期。 16 位的数据宽度、 125ns 的指令周期以及多功能的硬件乘法器(能实现乘加)相配合,能实现数字信号处理的某些算法(如 FFT 等)

3. 超低功耗方面,MSP430 单片机之所以有超低的功耗,是因为其在降低芯片的电源电压及灵活而可控的运行时钟方面都有其独到之处。电源电压采用的是 1.8~3.6V 电压。因而可使其在 1MHz 的时钟条件下运行时, 芯片的电流会在 200~400uA 左右,时钟关断模式的最低功耗只有 0.1uA

缺点:

1. 个人感觉不容易上手,不适合初学者入门,资料也比较少,只能跑官网去找

2. 占的指令空间较大,因为是16位单片机,程序以字为单位,有的指令竟然占6个字节。虽然程序表面上简洁, 但与pic单片机比较空间占用很大

应用范围:

在低功耗及超低功耗的工业场合应用的比较多

使用最多的器件:MSP430F系列、MSP430G2系列、MSP430L09系列

TMS单片机

这里也提一下TMS系列单片机,虽不算主流。由TI推出的8位CMOS单片机,具有多种存储模式、多种外围接口模式,适用于复杂的实时控制场合。虽然没STM32那么优秀,也没MSP430那么张扬,但是TMS370C系列单片机提供了通过整合先进的外围功能模块及各种芯片的内存配置,具有高性价比的实时系统控制。同时采用高性能硅栅CMOS EPROM和EEPROM技术实现。低工作功耗CMOS技术,宽工作温度范围,噪声抑制,再加上高性能和丰富的片上外设功能,使TMS370C系列单片机在汽车电子,工业电机控制,电脑,通信和消费类具有一定的应用。

STM32单片机

由ST厂商推出的STM32系列单片机,行业的朋友都知道,这是一款性价比超高的系列单片机,应该没有之一,功能及其强大。其基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核,同时具有一流的外设:1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI等等,在功耗和集成度方面也有不俗的表现,当然和MSP430的功耗比起来是稍微逊色的一些,但这并不影响工程师们对它的热捧程度,由于其简单的结构和易用的工具再配合其强大的功能在行业中赫赫有名…其强大的功能主要表现在:

特性:

1.内核:ARM32位Cortex-M3CPU,最高工作频率72MHz,1.25DMIPS/MHz,单周期乘法和硬件除法

2.存储器:片上集成32-512KB的Flash存储器。6-64KB的SRAM存储器

3.时钟、复位和电源管理:2.0-3.6V的电源供电和I/O接口的驱动电压。POR、PDR和可编程的电压探测器(PVD)。4-16MHz的晶振。内嵌出厂前调校的8MHz RC振荡电路。内部40 kHz的RC振荡电路。用于CPU时钟的PLL。带校准用于RTC的32kHz的晶振

4、调试模式:串行调试(SWD)和JTAG接口。最多高达112个的快速I/O端口、最多多达11个定时器、最多多达13个通信接口

使用最多的器件:STM32F103系列、STM32 L1系列、STM32W系列。

PIC单片机

PIC单片机系列是美国微芯公司(Microship)的产品,共分三个级别,即基本级、中级、高级,是当前市场份额增长最快的单片机之一,CPU采用RISC结构,分别有33、35、58条指令,属精简指令集,同时采用Harvard双总线结构,运行速度快,它能使程序存储器的访问和数据存储器的访问并行处理,这种指令流水线结构,在一个周期内完成两部分工作,一是执行指令,二是从程序存储器取出下一条指令,这样总的看来每条指令只需一个周期,这也是高效率运行的原因之一,此外PIC单片机之所以成为一时非常热的单片机不外乎以下特点:

特点:

1. 具有低工作电压、低功耗、驱动能力强等特点。PIC系列单片机的I/O口是双向的,其输出电路为CMOS互补推挽输出电路。I/O脚增加了用于设置输入或输出状态的方向寄存器,从而解决了51系列I/O脚为高电平时同为输入和输出的状态。

2. 当置位1时为输入状态,且不管该脚呈高电平或低电平,对外均呈高阻状态;置位0时为输出状态,不管该脚为何种电平,均呈低阻状态,有相当的驱动能力,低电平吸入电流达25mA,高电平输出电流可达20mA。相对于51系列而言,这是一个很大的优点

3. 它可以直接驱动数码管显示且外电路简单。它的A/D为10位,能满足精度要求。具有在线调试及编程(ISP)功能。

不足之处:

其专用寄存器(SFR)并不像51系列那样都集中在一个固定的地址区间内(80~FFH),而是分散在四个地址区间内。只有5个专用寄存器PCL、STATUS、FSR、PCLATH、INTCON在4个存储体内同时出现,但是在编程过程中,少不了要与专用寄存器打交道,得反复地选择对应的存储体,也即对状态寄存器STATUS的第6位(RP1)和第5位(RP0)置位或清零。数据的传送和逻辑运算基本上都得通过工作寄存器W(相当于51系列的累加器A)来进行,而51系列的还可以通过寄存器相互之间直接传送,因而PIC单片机的瓶颈现象比51系列还要严重,这在编程中的朋友应该深有体会

使用最多的器件:PIC16F873、PIC16F877

AVR单片机

AVR单片机是Atmel公司推出的较为新颖的单片机,其显著的特点为高性能、高速度、低功耗。它取消机器周期,以时钟周期为指令周期,实行流水作业。AVR单片机指令以字为单位,且大部分指令都为单周期指令。而单周期既可执行本指令功能,同时完成下一条指令的读取。通常时钟频率用4~8MHz,故最短指令执行时间为250~125ns。AVR单片机能成为最近仍是比较火热的单片机,主要的特点:

特点:

1. AVR系列没有类似累加器A的结构,它主要是通过R16~R31寄存器来实现A的功能。在AVR中,没有像51系列的数据指针DPTR,而是由X(由R26、R27组成)、Y(由R28、R29组成)、Z(由R30、R31组成)三个16位的寄存器来完成数据指针的功能(相当于有三组DPTR),而且还能作后增量或先减量等的运行,而在51系列中,所有的逻辑运算都必须在A中进行;而AVR却可以在任两个寄存器之间进行,省去了在A中的来回折腾,这些都比51系列出色些

2. AVR的专用寄存器集中在00~3F地址区间,无需像PIC那样得先进行选存储体的过程,使用起来比PIC方便。AVR的片内RAM的地址区间为0~00DF(AT90S2313) 和0060~025F(AT90S8515、AT90S8535),它们占用的是数据空间的地址,这些片内RAM仅仅是用来存储数据的,通常不具备通用寄存器的功能。当程序复杂时,通用寄存器R0~R31就显得不够用;而51系列的通用寄存器多达128个(为AVR的4倍),编程时就不会有这种感觉。

3. AVR的I/O脚类似PIC,它也有用来控制输入或输出的方向寄存器,在输出状态下,高电平输出的电流在10mA左右,低电平吸入电流20mA。这点虽不如PIC,但比51系列还是要优秀的…

缺点:

1. 是没有位操作,都是以字节形式来控制和判断相关寄存器位的

2. C语言与51的C语言在写法上存在很大的差异,这让从开始学习51单片机的朋友很不习惯

3. 通用寄存器一共32个(R0~R31),前16个寄存器(R0~R15)都不能直接与立即数打交道,因而通用性有所下降。而在51系列中,它所有的通用寄存器(地址00~7FH)均可以直接与立即数打交道,显然要优于前者。

使用最多的器件:ATUC64L3U、ATxmega64A1U、AT90S8515

STC单片机

说到STC单片机有人会说到,STC也能算主流,估计要被喷了~~我们基于它是国内还算是比较不错的单片机来说。STC单片机是宏晶生产的单时钟/机器周期的单片机,说白了STC单片机是51与AVR的结合体,有人说AVR是51的替代单片机,但是AVR单片机在位控制和C语言写法上存在很大的差异。而STC单片机洽洽结合了51和AVR的优点,虽然功能不及AVR那么强大,但是在AVR能找到的功能,在STC上基本都有,同时STC单片机是51内核,这给以51单片机为基础的工程师们提供了极大的方便,省去了学习AVR的时间,同时也不失AVR的各种功能…

STC单片机是高速、低功耗、超强抗干扰的新一代8051单片机51单片机,指令代码完全兼容传统8051,但速度快8~12倍,内部集成MAX810专用复位电路。4路PWM 8路高速10位A、D转换,针对电机电机 的供应商控制,强干扰场合,成为继51单片机后一个全新系列单片机…

特性:

1. 下载烧录程序用串口方便好用,容易上手,拥有大量的学习资料及视频,最著名的要属于杜老师的那个视频了,好多对单片机有兴趣的朋友都是通过这个视频入门的,同时具有宽电压:5.5~3.8V,2.4~3.8V, 低功耗设计:空闲模式,掉电模式(可由外部中断唤醒)

2. STC单片机具有在应用编程,调试起来比较方便;带有10位AD、内部EEPROM、
可在1T/机器周期下工作,速度是传统51单片机的8~12倍,价格也较便宜

3. 4 通道捕获/比较单元,STC12C2052AD系列为2通道,也可用来再实现4个定时器或4个外部中断,2个硬件16位定时器,兼容普通8051的定时器。4路PCA还可再实现4个定时器,具有硬件看门狗、高速SPI通信端口、全双工异步串行口,兼容普通8051的串口,同时还具有先进的指令集结构,兼容普通8051指令集

PS:STC单片机功能虽不及AVR、STM32强大,价格也不及51和ST32便宜,但是这些并并不重要,重要的是这属于国产单片机比较出色的单片机,但愿国产单片机能一路长虹…

使用最多的器件:STC12C2052AD

Freescale单片机

主要针对S08,S12这类单片机,当然Freescale单片机远非于此。Freescale系列单片机采用哈佛结构和流水线指令结构,在许多领域内都表现出低成本,高性能的的特点,它的体系结构为产品的开发节省了大量时间。此外Freescale提供了多种集成模块和总线接口,可以在不同的系统中更灵活的发挥作用!Freescale单片机的特有的特点如下:

1.全系列:从低端到高端,从8位到32位全系列应有尽有,其推出的8位/32位管脚兼容的QE128,可以从8位直接移植到32位,弥补单片机业界8/32 位兼容架构中缺失的一环

2.多种系统时钟模块:三种模块,七种工作模式。多种时钟源输入选项,不同的mcu具有不同的时钟产生机制,可以是RC振荡器,外部时钟或晶振,也可以是内部时钟,多数CPU同时具有上述三种模块!可以运行在FEI,FEE,FBI,FBILP,FBE,FBELP,STOP这七种工作模式

3.多种通讯模块接口:Freescale单片机几乎在内部集成各种通信接口模块:包括串行通信接口模块SCI,多主I2C总线模块,串行外围接口模块 SPI,MSCAN08控制器模块,通用串行总线模块(USB/PS2)

4.具有更多的可选模块:具有LCD驱动模块,带有温度传感器,具有超高频发送模块,含有同步处理器模块,含有同步处理器的MCU还具有屏幕显示模块OSD,还有少数的MCU具有响铃检测模块RING和双音多频/音调发生器DMG模块

5.可靠性高,抗干扰性强,多种引脚数和封装选择

6.低功耗、也许Freescale系列的单片机的功耗没有MSP430的低,但是他具有全静态的“等待”和“停止”两种模式,从总体上降低您的功耗!新近推出的几款超低功耗已经与MSP430的不相上下!

使用最多的器件:MC9S12G系列

如果真要在这些单片机中分个一二三等,那么如果你想跟随大众,无可厚非51单片机还是首选;如果你追求超高性价比,STM32将是你理想选择;如果你渴望超低功耗,MSP430肯定不会让你失望;如果你想支持国产,STC会让你兴奋

来源:21ic.com

围观 841

随着单片机系统越来越广泛地应用于消费类电子、医疗、工业自动化、智能化仪器仪表、航空航天等各领域,单片机系统面临着电磁干扰(EMI)日益严重的威胁。电磁兼容性(EMC)包含系统的发射和敏感度两方面的问题。如果一个单片机系统符合下面三个条件,则该系统是电磁兼容的:

① 对其它系统不产生干扰;
② 对其它系统的发射不敏感;
③ 对系统本身不产生干扰。

假若干扰不能完全消除,但也要使干扰减少到最小。干扰的产生不是直接的(通过导体、公共阻抗耦合等),就是间接的(通过串扰或辐射耦合)。电磁干扰的产生是通过导体和通过辐射,很多电磁发射源,如光照、继电器、DC电机和日光灯都可引起干扰;AC电源线、互连电缆、金属电缆和子系统的内部电路也都可能产生辐射或接收到不希望的信号。在高速单片机系统中,时钟电路通常是宽带噪声的最大产生源,这些电路可产生高达300 MHz的谐波失真,在系统中应该把它们去掉。另外,在单片机系统中,最容易受影响的是复位线、中断线和控制线。

1 干扰的耦合方式

(1) 传导性EMI
一种最明显而往往被忽略的能引起电路中噪声的路径是经过导体。一条穿过噪声环境的导线可捡拾噪声并把噪声送到其它电路引起干扰。设计人员必须避免导线捡拾噪声和在噪声引起干扰前,用去耦办法除去噪声。最普通的例子是噪声通过电源线进入电路。若电源本身或连接到电源的其它电路是干扰源,则在电源线进入电路之前必须对其去耦。

(2) 公共阻抗耦合
当来自两个不同电路的电流流经一个公共阻抗时就会产生共阻抗耦合。阻抗上的压降由两个电路决定,来自两个电路的地电流流经共地阻抗。电路1的地电位被地电流2调制,噪声信号或DC补偿经共地阻抗从电路2耦合到电路1。

(3) 辐射耦合
经辐射的耦合通称串扰。串扰发生在电流流经导体时产生电磁场,而电磁场在邻近的导体中感应瞬态电流。

(4) 辐射发射
辐射发射有两种基本类型:差分模式(DM)和共模(CM)。共模辐射或单极天线辐射是由无意的压降引起的,它使电路中所有地连接抬高到系统地电位之上。就电场大小而言,CM辐射是比DM辐射更为严重的问题。为使CM辐射最小,必须用切合实际的设计使共模电流降到零。

2 影响EMC的因数

① 电压。电源电压越高,意味着电压振幅越大,发射就更多,而低电源电压影响敏感度。
② 频率。高频产生更多的发射,周期性信号产生更多的发射。在高频单片机系统中,当器件开关时产生电流尖峰信号;在模拟系统中,当负载电流变化时产生电流尖峰信号。
③ 接地。在所有EMC问题中,主要问题是不适当的接地引起的。有三种信号接地方法:单点、多点和混合。在频率低于1 MHz时,可采用单点接地方法,但不适于高频;在高频应用中,最好采用多点接地。混合接地是低频用单点接地,而高频用多点接地的方法。地线布局是关键,高频数字电路和低电平模拟电路的地回路绝对不能混合。
④ PCB设计。适当的印刷电路板(PCB)布线对防止EMI是至关重要的。
⑤ 电源去耦。当器件开关时,在电源线上会产生瞬态电流,必须衰减和滤掉这些瞬态电流。来自高di/dt源的瞬态电流导致地和线迹“发射”电压,高di/dt 产生大范围高频电流,激励部件和线缆辐射。流经导线的电流变化和电感会导致压降,减小电感或电流随时间的变化可使该压降最小。

3 印刷电路板(PCB)的电磁兼容性设计

PCB是单片机系统中电路元件和器件的支撑件,它提供电路元件和器件之间的电气连接。随着电子技术的飞速发展,PCB的密度越来越高。PCB设计的好坏对单片机系统的电磁兼容性影响很大,实践证明,即使电路原理图设计正确,印刷电路板设计不当,也会对单片机系统的可靠性产生不利影响。例如,如果印刷板两条细平行线靠得很近,则会形成信号波形的延迟,在传输线的终端形成反射噪声。因此,在设计印刷电路板的时候,应注意采用正确的方法,遵守PCB设计的一般原则,并应符合抗干扰设计的要求。

3.1 PCB设计的一般原则
要使电子电路获得最佳性能,元器件的布局及导线的布设是很重要的。为了设计质量好、成本低的PCB,应遵循以下一般性原则。

(1) 特殊元器件布局
首先,要考虑PCB尺寸的大小:PCB尺寸过大时,印刷线条长,阻抗增加,抗噪声能力下降,成本也增加;过小,则散热不好,且邻近线条易受干扰。在确定PCB尺寸后,再确定特殊元器件的位置。最后,根据电路的功能单元,对电路的全部元器件进行布局。

在确定特殊元器件的位置时要遵守以下原则:
① 尽可能缩短高频元器件之间的连线,设法减少它们的分布参数和相互间的电磁干扰。易受干扰的元器件不能相互挨得太近,输入和输出元件应尽量远离。
② 某些元器件或导线之间可能有较高的电位差,应加大它们之间的距离,以免放电引出意外短路。带高电压的元器件应尽量布置在调试时手不易触及的地方。
③ 重量超过15 g的元器件,应当用支架加以固定,然后焊接。那些又大又重、发热量多的元器件,不宜装在印刷板上,而应装在整机的机箱底板上,且应考虑散热问题。热敏元件应远离发热元件。
④ 对于电位器、可调电感线圈、可变电容器、微动开关等可调元件的布局,应考虑整机的结构要求。若是机内调节,应放在印刷板上方便调节的地方;若是机外调节,其位置要与调节旋钮在机箱面板上的位置相适应。
⑤ 留出印刷板定位孔及固定支架所占用的位置。

(2) 一般元器件布局
根据电路的功能单元,对电路的全部元器件进行布局时,要符合以下原则:
① 按照电路的流程安排各个功能电路单元的位置,使布局便于信号流通,并使信号尽可能保持一致的方向。
② 以每个功能电路的核心元件为中心,围绕它来进行布局。元器件应均匀、整齐、紧凑地排列在PCB上,尽量减少和缩短各元器件之间的引线和连接。
③ 在高频下工作的电路,要考虑元器件之间的分布参数。一般电路应尽可能使元器件平行排列,这样,不但美观,而且装焊容易,易于批量生产。
④ 位于电路板边缘的元器件,离电路板边缘一般不小于2 mm。电路板的最佳形状为矩形。长宽比为3:2或4:3。电路板面尺寸大于200 mm&TImes;150 mm时,应考虑电路板所受的机械强度。
(3) 布线

布线的原则如下:
① 输入输出端用的导线应尽量避免相邻平行,最好加线间地线,以免发生反馈耦合。
② 印刷板导线的最小宽度主要由导线与绝缘基板间的粘附强度和流过它们的电流值决定。当铜箔厚度为0.5 mm、宽度为1~15 mm时,通过2 A的电流,温升不会高于3℃。因此,导线宽度为1.5 mm可满足要求。对于集成电路,尤其是数字电路,通常选0.02~0.3 mm导线宽度。当然,只要允许,还是尽可能用宽线,尤其是电源线和地线。导线的最小间距主要由最坏情况下的线间绝缘电阻和击穿电压决定。对于集成电路,尤其是数字电路,只要工艺允许,可使间距小于0.1~0.2 mm。
③ 印刷导线拐弯处一般取圆弧形,而直角或夹角在高频电路中会影响电气性能。此外,尽量避免使用大面积铜箔,否则,长时间受热时,易发生铜箔膨胀和脱落现象。必须用大面积铜箔时,最好用栅格状,这样有利于排除铜箔与基板间粘合剂受热产生的挥发性气体。

(4) 焊盘
焊盘中心孔要比器件引线直径稍大一些。焊盘太大易形成虚焊。焊盘外径D一般不小于(d+1.2) mm,其中d为引线孔径。对高密度的数字电路,焊盘最小直径可取(d+1.0) mm。

3.2 PCB及电路抗干扰措施
印刷电路板的抗干扰设计与具体电路有着密切的关系,这里仅就PCB抗干扰设计的几项常用措施作一些说明。

(1) 电源线设计
根据印刷线路板电流的大小,尽量加粗电源线宽度,减少环路电阻;同时,使电源线、地线的走向和数据传递的方向一致,这样有助于增强抗噪声能力。kx6电子技术吧

(2) 地线设计
在单片机系统设计中,接地是控制干扰的重要方法。如能将接地和屏蔽正确结合起来使用,可解决大部分干扰问题。单片机系统中地线结构大致有系统地、机壳地(屏蔽地)、数字地(逻辑地)和模拟地等。在地线设计中应注意以下几点:
① 正确选择单点接地与多点接地。在低频电路中,信号的工作频率小于1 MHz,它的布线和器件间的电感影响较小,而接地电路形成的环流对干扰影响较大,因而应采用一点接地的方式。当信号工作频率大于10 MHz时,地线阻抗变得很大,此时应尽量降低地线阻抗,应采用就近多点接地。当工作频率在1~10MHz时,如果采用一点接地,其地线长度不应超过波长的 1/20,否则应采用多点接地法。
② 数字地与模拟地分开。电路板上既有高速逻辑电路,又有线性电路,应使它们尽量分开,而两者的地线不要相混,分别与电源端地线相连。低频电路的地应尽量采用单点并联接地,实际布线有困难时可部分串联后再并联接地;高频电路宜采用多点串联接地,地线应短而粗。高频元件周围尽量
用栅格状大面积地箔,要尽量加大线性电路的接地面积。
③ 接地线应尽量加粗。若接地线用很细的线条,则接地电位会随电流的变化而变化,致使电子产品的定时信号电平不稳,抗噪声性能降低。因此应将接地线尽量加粗,使它能通过三倍于印刷电路板的允许电流。如有可能,接地线的宽度应大于3 mm。
④ 接地线构成闭环路。设计只由数字电路组成的印刷电路板的地线系统时,将接地线做成闭路可以明显地提高抗噪声能力。其原因在于:印刷电路板上有很多集成电路元件,尤其遇有耗电多的元件时,因受接地线粗细的限制,会在地线上产生较大的电位差,引起抗噪能力下降;若将接地线构成环路,则会缩小电位差值,提高电子设备的抗噪声能力。

(3) 退耦电容配置
PCB设计的常规做法之一,是在印刷板的各个关键部位配置适当的退耦电容。退耦电容的一般配置原则是:
① 电源输入端跨接10~100μF的电解电容器。如有可能,接100μF以上的更好。
② 原则上每个集成电路芯片都应布置一个0.01 pF的瓷片电容。如遇印刷板空隙不够,可每4~8个芯片布置一个1~10 pF的钽电容。
③ 对于抗噪能力弱、关断时电源变化大的器件,如RAM、ROM存储器件,应在芯片的电源线和地线之间直接接入退耦电容。
④ 电容引线不能太长,尤其是高频旁路电容不能有引线。

此外,还应注意以下两点:
① 在印刷板中有接触器、继电器、按钮等元件时,操作它们时均会产生较大火花放电,必须采用RC电路来吸收放电电流。一般R取1~2 kΩ,C取2.2~47μF。
② CMOS的输入阻抗很高,且易受感应,因此在使用时,对不用端要接地或接正电源。

(4) 振荡器
几乎所有的单片机都有一个耦合于外部晶体或陶瓷谐振器的振荡器电路。在PCB上,要求外接电容、晶体或陶瓷谐振器的引线越短越好。RC振荡器对干扰信号有潜在的敏感性,它能产生很短的时钟周期,因而最好选晶体或陶瓷谐振器。另外,石英晶体的外壳要接地。

(5) 防雷击措施
室外使用的单片机系统或从室外架空引入室内的电源线、信号线,要考虑系统的防雷击问题。常用的防雷击器件有:气体放电管、TVS(Transient Voltage Suppression)等。气体放电管是当电源电压大于某一数值时,通常为数十V或数百V,气体击穿放电,将电源线上强冲击脉冲导入大地。TVS可以看成两个并联且方向相反的齐纳二极管,当两端电压高于某一值时导通。其特点是可以瞬态通过数百乃至上千A的电流。

结语

为了提高单片机系统的电磁兼容性,不仅要合理设计PCB板,而且要在电路结构上及软件中采取相应的措施。实践表明,在单片机系统的设计、制造、安装和运行的各个阶段,都需要考虑其电磁兼容性,只有这样,才能保证系统长期稳定、可靠、安全地运行。

来源:网络

围观 407

单片机(MCU)一般都有内部EEPROM/FLASH供用户存放程序和工作数据。什么叫单片机解密呢?如果要非法读出里的程式,就必需解开这个密码才能读出来,这个过程通常称为单片机解密或芯片加密。

为了防止未经授权访问或拷贝单片机的机内程序,大部分单片机都带有加密锁定位或者加密字节,以保护片内程序;如果在编程时加密锁定位被使能(锁定),就无法用普通编程器直接读取单片机内的程序,单片机攻击者借助专用设备或者自制设备,利用单片机芯片设计上的漏洞或软件缺陷,通过多种技术手段,就可以从芯片中提取关键信息,获取单片机内程序这就叫单片机解密。大部分单片机程式写进单片机后,工程师们为了防止他人非法盗用,所以给加密,以防他人读出里面的程式。

单片机加解密可划分为两大类,一类是硬件加解密,一类是软件加解密。硬件加密,对于单片机来说,一般是单片机厂商将加密熔丝固化在IC内,熔丝有加密状态及不加密状态,如果处于加密状态,一般的工具是读取不了IC里面的程序内容的,要读取其内容,这就涉及到硬件解密,必须有专业的硬件解密工具及专业的工程师。

其实任何一款单片机从理论上讲,攻击者均可利用足够的投资和时间使用以上方法来攻破。这是系统设计者应该始终牢记的基本原则,因此,作为电子产品的设计工程师非常有必要了解当前单片机攻击的最新技术,做到知己知彼,心中有数,才能有效防止自己花费大量金钱和时间辛辛苦苦设计出来的产品被人家一夜之间仿冒的事情发生。

众所周知,目前凡是涉及到单片机解密的领域一般都是进行产品复制的,真正用来做研究学习的,不能说没有,但是相当罕见。所以,想破解单片机解密芯片破解,就得知道单片机解密芯片破解的原理。

围观 506

能同电脑的性能是天渊之别的,无论从空间资源上、内存资源、工作频率,都是无法与之比较的。PC 机编程基本上不用考虑空间的占用、内存的占用的问题,最终目的就是实现功能就可以了。对于单片机来说就截然不同了,一般的单片机的Flash 和Ram 的资源是以KB 来衡量的,可想而知,单片机的资源是少得可怜,为此我们必须想法设法榨尽其所有资源,将它的性能发挥到最佳,程序设计时必须遵循以下几点进行优化:

1.使用尽量小的数据类型

能用unsiged就不用signed;
能用char就不用int;
能不用floating就不用。
能用位操作不用算数。

2.使用自加、自减指令

通常使用自加、自减指令和复合赋值表达式(如a-=1 及a+=1 等)都能够生成高质量的程序代码,编译器通常都能够生成inc 和dec 之类的指令,而使用a=a+1 或a=a-1 之类的指令,有很多C 编译器都会生成二到三个字节的指令。

3.减少运算的强度

可以使用运算量小但功能相同的表达式替换原来复杂的的表达式。

(1) 求余运算

N= N %8 可以改为N = N &7

说明:位操作只需一个指令周期即可完成,而大部分的C 编译器的“%”运算均是调用子程序来完成,代码长、执行速度慢。通常,只要求是求2n 方的余数,均可使用位操作的方法来代替。

(2) 平方运算

N=Pow(3,2) 可以改为N=3*3

说明:在有内置硬件乘法器的单片机中(如51 系列),乘法运算比求平方运算快得多, 因为浮点数的求平方是通过调用子程序来实现的,乘法运算的子程序比平方运算的子程序代码短,执行速度快。

(3) 用位移代替乘法除法

N=M*8 可以改为N=M<<3
N=M/8 可以改为N=M>>3

说明:通常如果需要乘以或除以2n,都可以用移位的方法代替。如果乘以2n,都可以生成左移的代码,而乘以其它的整数或除以任何数,均调用乘除法子程序。用移位的方法得到代码比调用乘除法子程序生成的代码效率高。实际上,只要是乘以或除以一个整数,均可以用移位的方法得到结果。

如N=M*9可以改为N=(M<<3)+M;

(4) 自加自减的区别

例如我们平时使用的延时函数都是通过采用自加的方式来实现。

void DelayNms(UINT16 t)
{
UINT16 i,j;
for(i=0;i
define MAX(A,B) {(A)>(B)?(A):(B)}

说明:函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间。大家要知道的是,函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查选项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,cpu 也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要一些cpu 时间。而宏函数不存在这个问题。宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏函数的时候,该现象尤其突出。

1.适当地使用算法

假如有一道算术题,求1~100 的和。

作为程序员的我们会毫不犹豫地点击键盘写出以下的计算方法:

UINT16 Sum(void)
{
UINT8 i,s;
for(i=1;i<=100;i++)
{
s+=i;
}
return s;
}

很明显大家都会想到这种方法,但是效率方面并不如意,我们需要动脑筋,就是采用数学算法解决问题,使计算效率提升一个级别。

UINT16 Sum(void)
{
UINT16 s;
s=(100 *(100+1))>>1;
return s;
}

结果很明显,同样的结果不同的计算方法,运行效率会有大大不同,所以我们需要最大限度地通过数学的方法提高程序的执行效率。

2.用指针代替数组

在许多种情况下,可以用指针运算代替数组索引,这样做常常能产生又快又短的代码。与数组索引相比,指针一般能使代码速度更快,占用空间更少。使用多维数组时差异更明显。下面的代码作用是相同的,但是效率不一样。

UINT8 szArrayA[64];
UINT8 szArrayB[64];
UINT8 i;
UINT8 *p=szArray;
for(i=0;i<64;i++)szArrayB[i]=szArrayA[i];
for(i=0;i<64;i++)szArrayB[i]=*p++;

指针方法的优点是,szArrayA 的地址装入指针p 后,在每次循环中只需对p 增量操作。在数组索引方法中,每次循环中都必须进行基于i 值求数组下标的复杂运算。

3.强制转换

C 语言精髓第一精髓就是指针的使用,第二精髓就是强制转换的使用,恰当地利用指针和强制转换不但可以提供程序效率,而且使程序更加之简洁,由于强制转换在C 语言编程中占有重要的地位,下面将已五个比较典型的例子作为讲解。

例子1:将带符号字节整型转换为无符号字节整型

UINT8 a=0;
INT8 b=-3;
a=(UINT8)b;

例子2:在大端模式下(8051 系列单片机是大端模式),将数组a[2]转化为无符号16 位整型值。

方法1:采用位移方法。

UINT8 a[2]={0x12,0x34};
UINT16 b=0;
b=(a[0]<<8)|a[1];

结果:b=0x1234

方法2:强制类型转换。

UINT8 a[2]={0x12,0x34};

UINT16 b=0;

b= (UINT16 )a; //强制转换

结果:b=0x1234

例子3:保存结构体数据内容。

方法1:逐个保存。

typedef struct _ST
{
UINT8 a;
UINT8 b;
UINT8 c;
UINT8 d;
UINT8 e;
}ST;
ST s;
UINT8 a[5]={0};
s.a=1;
s.b=2;
s.c=3;
s.d=4;
s.e=5;
a[0]=s.a;
a[1]=s.b;
a[2]=s.c;
a[3]=s.d;
a[4]=s.e;

结果:数组a 存储的内容是1、2、3、4、5。

方法2:强制类型转换。

typedef struct _ST
{
UINT8 a;
UINT8 b;
UINT8 c;
UINT8 d;
UINT8 e;
}ST;
ST s;
UINT8 a[5]={0};
UINT8 p=(UINT8 )&s;//强制转换
UINT8 i=0;
s.a=1;
s.b=2;
s.c=3;
s.d=4;
s.e=5;
for(i=0;i

define Perror(FUN) printf(“Err:%s %s %d: %s\n”, FILE, func,LINE,FUN) 类linux的perror函数实现,这里加了出错的文件位置,所在函数,引发出错调用的函数FUN。

宏中#和##的用法
define STR(s) #s
define CONS(a, b) int(a##e##b)
printf(STR(vck));//输出vck
printf(“%d\n”, CONS(2,3));//2e3 输出2000

来源:玩转单片机

围观 415

三极管在数字电路里的开关特性,最常见的应用有 2 个:一个是控制应用,一个是驱动应用。所谓的控制就是如图 3-7 里边介绍的,我们可以通过单片机控制三极管的基极来间接控制后边的小灯的亮灭,用法大家基本熟悉了。还有一个控制就是进行不同电压之间的转换控制,比如我们的单片机是 5V 系统,它现在要跟一个 12V 的系统对接,如果 IO 直接接 12V电压就会烧坏单片机,所以我们加一个三极管,三极管的工作电压高于单片机的 IO 口电压,用 5V 的 IO 口来控制 12V 的电路,如图 3-8 所示。


图 3-8 三极管实现电压转换

图 3-8 中,当 IO 口输出高电平 5V 时,三极管导通,OUT 输出低电平 0V,当 IO 口输出低电平时,三极管截止,OUT 则由于上拉电阻 R2 的作用而输出 12V 的高电平,这样就实现了低电压控制高电压的工作原理。

所谓的驱动,主要是指电流输出能力。我们再来看如图 3-9 中两个电路之间的对比。


图 3-9 LED 小灯控制方式对比

图 3-9 中上边的 LED 灯,和我们第二课讲过的 LED 灯是一样的,当 IO 口是高电平时,小灯熄灭,当 IO 口是低电平时,小灯点亮。那么下边的电路呢,按照这种推理,IO 口是高电平的时候,应该有电流流过并且点亮小灯,但实际上却并非这么简单。

单片机主要是个控制器件,具备四两拨千斤的特点。就如同杠杆必须有一个支点一样,想要撑起整个地球必须有力量承受的支点。单片机的 IO 口可以输出一个高电平,但是他的输出电流却很有限,普通 IO 口输出高电平的时候,大概只有几十到几百 uA 的电流,达不到1mA,也就点不亮这个 LED 小灯或者是亮度很低,这个时候如果我们想用高电平点亮 LED,就可以用上三极管来处理了,我们板上的这种三极管型号,可以通过 500mA 的电流,有的三极管通过的电流还更大一些,如图 3-10 所示。


图 3-10 三极管驱动 LED 小灯

图 3-10 中,当 IO 口是高电平,三极管导通,因为三极管的电流放大作用,c 极电流就可以达到 mA 以上了,就可以成功点亮 LED 小灯。

虽然我们用了 IO 口的低电平可以直接点亮 LED,但是单片机的 IO 口作为低电平,输入电流就可以很大吗?这个我想大家都能猜出来,当然不可以。单片机的 IO 口电流承受能力,不同型号不完全一样,就 STC89C52 来说,官方手册的 81 页有对电气特性的介绍,整个单片机的工作电流,不要超过 50mA,单个 IO 口总电流不要超过 6mA。即使一些增强型 51 的IO 口承受电流大一点,可以到 25mA,但是还要受到总电流 50mA 的限制。那我们来看电路图的 8 个 LED 小灯这部分电路,如图 3-11 所示。


图 3-11 LED 电路图(一)

这里我们要学会看电路图的一个知识点,电路图右侧所有的 LED 下侧的线最终都连到一根黑色的粗线上去了,大家注意,这个地方不是实际的完全连到一起,而是一种总线的画法,画了这种线以后,表示这是个总线结构。而所有的名字一样的节点是一一对应的连接到一起,其他名字不一样的,是不连在一起的。比如左侧的 DB0 和右侧的最右边的 LED2 小灯下边的DB0 是连在一起的,而和 DB1 等其他线不是连在一起的。

那么我们把图 3-11 中现在需要讲解的这部分单独摘出来看,如图 3-12 所示。


图 3-12 LED 电路图(二)

现在我们通过 3-12 的电路图来计算一下,5V 的电压减去 LED 本身的压降,减掉三极管e 和 c 之间的压降,限流电阻用的是 330 欧,那么每条支路的电流大概是 8mA,那么 8 路 LED如果全部同时点亮的话电流总和就是 64mA。这样如果直接接到单片机的 IO 口,那单片机肯定是承受不了的,即使短时间可以承受,长时间工作就会不稳定,甚至导致单片机烧毁。

有的同学会提出来可以加大限流电阻的方式来降低这个电流。比如改到 1K,那么电流不到 3mA,8 路总的电流就是 20mA 左右。首先,降低电流会导致 LED 小灯亮度变暗,小灯的亮度可能关系还不大,但因为我们同样的电路接了数码管,后边我们要讲数码管还要动态显示,如果数码管亮度不够的话,那视觉效果就会很差,所以降低电流的方法并不可取。其次,对于单片机来说,他主要是起到控制作用,电流输入和输出的能力相对较弱,P0 的 8 个口总电流也有一定限制,所以如果接一两个 LED 小灯观察,可以勉强直接用单片机的 IO 口来接,但是接多个小灯,从实际工程的角度去考虑,就不推荐直接接 IO 口了。那么我们如果要用单片机控制多个 LED 小灯该怎么办呢?

除了三极管之外,其实还有一些驱动 IC,这些驱动 IC 可以作为单片机的缓冲器,仅仅是电流驱动缓冲,不起到任何逻辑控制的效果,比如我们板子上用的 74HC245 这个芯片,这个芯片在逻辑上起不到什么别的作用,就是当做电流缓冲器的,我们通过查看其数据手册,74HC245 稳定工作在 70mA 电流是没有问题的,比单片机的 8 个 IO 口大多了,所以我们可以把他接在小灯和 IO 口之间做缓冲,如图 3-13 所示。


图 3-13 74HC245 功能图

从图 3-13 我们来分析,其中 VCC 和 GND 就不用多说了,细心的同学会发现这里有个0.1uF 的去耦电容哦。

74HC245 是个双向缓冲器,1 引脚 DIR 是方向引脚,当这个引脚接高电平的时候,右侧所有的 B 编号的电压都等于左侧 A 编号对应的电压。比如 A1 是高电平,那么 B1 就是高电平,A2 是低电平,B2 就是低电平等等。如果 DIR 引脚接低电平,得到的效果是左侧 A 编号的电压都会等于右侧 B 编号对应的电压。因为我们这个地方控制端是左侧接的是 P0 口,我们要求 B 等于 A 的状态,所以 1 脚我们直接接的 5V 电源,即高电平。图 3-13 中还有一排电阻 R10 到 R17 是上拉电阻,这个电阻的用法我们在后边介绍。

还有最后一个使能引脚 19 脚 OE,叫做输出使能,这个引脚上边有一横,表明是低电平有效,当接了低电平后,74HC245 就会按照刚才上边说的起到双向缓冲器的作用,如果 OE接了高电平,那么无论 DIR 怎么接,A 和 B 的引脚是没有关系的,也就是 74HC245 功能不能实现出来。

从下面的图 3-14 可以看出来,单片机的 P0 口和 74HC245 的 A 端是直接接起来的。这个地方,有个别同学有个疑问,就是我们明明在电源 VCC 那地方加了一个三极管驱动了,为何还要再加 245 驱动芯片呢。这里大家要理解一个道理,电路上从正极经过器件到地,首先必须有电流才能正常工作,电路中任何一个位置断开,都不会有电流,器件也就不会参与工作了。其次,和水流一个道理,从电源正极到负极的电流水管的粗细都要满足要求,任何一个位置的管子过细,都会出现瓶颈效应,电流在整个通路中细管处会受到限制而降低,所以在电路通路的每个位置上,都要保证通道足够畅通,这个 74HC245 的作用就是消除单片机IO 这一环节的瓶颈。


图 3-14 单片机与 74HC245 的连接

来源:电子工程世界

围观 311

单片机程序死机,跑飞了可以从以下几个方面查找原因:

1
意外中断。是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象;

2
中断变量处理不妥。若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile,其次在主循环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断;否则出现造成数据乱套。

3
地址溢出,常见错误为指针操作错误。我要着重说的是数组下标使用循环函数中循环变量,如果循环变量没控制好则会出现数组下标越界,意外修改系统的寄存器造成死机,这种情况下如果死机说明运气好,否则后面不知道发生什么头疼的事。

4
无条件的死循环;比如使用while(x);等待电平变化,正常情况下x都会变成0,就怕万一,因此最好加上时间限制;

5
看门狗没有关闭。有的单片机即使没使用看门狗开机时也有可能意外自动开启了最小周期的看门狗,导致软件不断复位,造成死机,这个要看芯片手册,最好在程序复位后首先应该显式清除看门狗再关闭看门狗;

6
堆栈溢出。最难查找的问题,对于容量小的单片机,尽量减少函数调用层级,减少局部变量,从而减少压栈的时候所需的空间。当你把以上几条都试过不能解决问题,试一试把你的被调用少函数直接内置到调用的地方并且把占用RAM大的局部变量改成全局变量,试一试说不定就可以了。

来源:21ic电子网

围观 499

状态机的概念

状态机是软件编程中的一个重要概念。比这个概念更重要的是对它的灵活应用。在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。

比如说一个按键命令解析程序,就可以被看做状态机:本来在A状态下,触发一个按键后切换到了B状态;再触发另一个键后切换到C状态,或者返回到A状态。这就是最简单的按键状态机例子。实际的按键解析程序会比这更复杂些,但这不影响我们对状态机的认识。

进一步看,击键动作本身也可以看做一个状态机。一个细小的击键动作包含了:释放、抖动、闭合、抖动和重新释放等状态。

同样,一个串行通信的时序(不管它是遵循何种协议,标准串口也好、I2C也好;也不管它是有线的、还是红外的、无线的)也都可以看做由一系列有限的状态构成。

显示扫描程序也是状态机;通信命令解析程序也是状态机;甚至连继电器的吸合/释放控制、发光管(LED)的亮/灭控制又何尝不是个状态机。

当我们打开思路,把状态机作为一种思想导入到程序中去时,就会找到解决问题的一条有效的捷径。有时候用状态机的思维去思考程序该干什么,比用控制流程的思维去思考,可能会更有效。这样一来状态机便有了更实际的功用。
程序其实就是状态机。

也许你还不理解上面这句话。请想想看,计算机的大厦不就是建立在“0”和“1”两个基本状态的地基之上么?

状态机的要素

状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:
① 现态:是指当前所处的状态。
② 条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。
③ 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
④ 次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

如果我们进一步归纳,把“现态”和“次态”统一起来,而把“动作”忽略(降格处理),则只剩下两个最关键的要素,即:状态、迁移条件。

状态机的表示方法有许多种,我们可以用文字、图形或表格的形式来表示一个状态机。

纯粹用文字描述是很低效的,所以就不介绍了。接下来先介绍图形的方式。

状态迁移图(STD)

状态迁移图(STD),是一种描述系统的状态、以及相互转化关系的图形方式。状态迁移图的画法有许多种,不过一般都大同小异。我们结合一个例子来说明一下它的画法,如图1所示。

图1状态迁移图

图1状态迁移图

①状态框:用方框表示状态,包括所谓的“现态”和“次态”。
②条件及迁移箭头:用箭头表示状态迁移的方向,并在该箭头上标注触发条件。
③节点圆圈:当多个箭头指向一个状态时,可以用节点符号(小圆圈)连接汇总。
④动作框:用椭圆框表示。
⑤附加条件判断框:用六角菱形框表示。

状态迁移图和我们常见的流程图相比有着本质的区别,具体体现为:在流程图中,箭头代表了程序PC指针的跳转;而在状态迁移图中,箭头代表的是状态的改变。

我们会发现,这种状态迁移图比普通程序流程图更简练、直观、易懂。这正是我们需要达到的目的。

状态迁移表

除了状态迁移图,我们还可以用表格的形式来表示状态之间的关系。这种表一般称为状态迁移表。

表1就是前面介绍的那张状态迁移图的另一种描述形式。

表1状态迁移表

表1状态迁移表

①采用表格方式来描述状态机,优点是可容纳更多的文字信息。例如,我们不但可以在状态迁移表中描述状态的迁移关系,还可以把每个状态的特征描述也包含在内。
②如果表格内容较多,过于臃肿不利于阅读,我们也可以将状态迁移表进行拆分。经过拆分后的表格根据其具体内容,表格名称也有所变化。
③比如,我们可以把状态特征和迁移关系分开列表。被单独拆分出来的描述状态特征的表格,也可以称为“状态真值表”。这其中比较常见的就是把每个状态的显示内容单独列表。这种描述每个状态显示内容的表称之为“显示真值表”。同样,我们把单独表述基于按键的状态迁移表称为“按键功能真值表”。另外,如果每一个状态包含的信息量过多,我们也可以把每个状态单独列表。
④由此可见,状态迁移表作为状态迁移图的有益补充,它的表现形式是灵活的。
⑤状态迁移表优点是信息涵盖面大,缺点是视觉上不够直观,因此它并不能取代状态迁移图。比较理想的是将图形和表格结合应用。用图形展现宏观,用表格说明细节。二者互为参照,相得益彰。

状态机思路实现一个时钟程序

接下来,我将就状态机的应用,结合流程图、状态迁移图和状态迁移,举一个实际例子。下面这张图是一个时钟程序的状态迁移图,如图2所示。

图2时钟程序状态迁移图

图2时钟程序状态迁移图

把这张图稍做归纳,就可以得到它的另一种表现形式——状态迁移表,如表2所示。

表2时钟程序状态迁移表

表2时钟程序状态迁移表

状态机应用的注意事项

基于状态机的程序调度机制,其应用的难点并不在于对状态机概念的理解,而在于对系统工作状态的合理划分。

初学者往往会把某个“程序动作”当作是一种“状态”来处理。我称之为“伪态”。那么如何区分“动作”和“状态”。本匠人的心得是看二者的本质:“动作”是不稳定的,即使没有条件的触发,“动作”一旦执行完毕就结束了;而“状态”是相对稳定的,如果没有外部条件的触发,一个状态会一直持续下去。

初学者的另一种比较致命的错误,就是在状态划分时漏掉一些状态。我称之为“漏态”。

“伪态”和“漏态”这两种错误的存在,将会导致程序结构的涣散。因此要特别小心避免。

更复杂的状态机

前面介绍的是一种简单的状态结构。它只有一级,并且只有一维,如图3所示。

图3 线性状态机结构

图3 线性状态机结构

如果有必要,我们可以建立更复杂的状态机模型。

(1)多级状态结构

状态机可以是多级的。在分层的多级状态机系统里面,一个“父状态”下可以划分多个“子状态”,这些子状态共同拥有上级父状态的某些共性,同时又各自拥有自己的一些个性。

在某些状态下,还可以进一步划分子状态。比如,我们可以把前面的时钟例子修改如下:

把所有和时钟功能有关的状态,合并成1个一级状态。在这个状态下,又可以划分出3个二级子状态,分别为显示时间、设置小时、设置分钟;

同样,我们也可以把所有和闹钟功能有关的状态,合并成1个一级状态。在这个状态下,再划分出4个二级子状态,分别为显示闹钟、设置“时”、设置“分”、设置鸣叫时间。

我们需要用另一个状态变量(寄存器)来表示这些子状态。

子状态下面当然还可以有更低一级的孙状态(子子孙孙无穷尽也),从而将整个状态体系变成了树状多级状态结构,如图4所示。

图4树状多级状态结构

图4树状多级状态结构

(2)多维状态结构

状态结构也可以是多维的。从不同的角度对系统进行状态的划分,这些状态的某些特性是交叉的。比如,在按照按键和显示划分状态的同时,又按照系统的工作进程做出另一种状态划分。这两种状态划分同时存在,相互交叉,从而构成了二维的状态结构空间。

举一个这方面的例子,如:空调遥控器,如图5所示。

图5多维状态机结构

图5多维状态机结构

同样,我们也可以构建三维、四维甚至更多维的状态结构。每一维的状态都需要用一个状态变量(寄存器)来表示。

无论多级状态结构和多维状态结构看上去多么迷人,匠人的忠告是:我们依然要尽可能地简化状态结构,能用单级、单维的结构,就不要给自己找事,去玩那噩梦般的复杂结构。

简单的才是最有效的。

围观 504

设计电路板最基本的过程可以分为三大步骤:电路原理图的设计,产生网络表,印制电路板的设计。不管是板上的器件布局还是走线等等都有着具体的要求。

例如,输入输出走线应尽量避免平行,以免产生干扰。两信号线平行走线必要是应加地线隔离,两相邻层布线要尽量互相垂直,平行容易产生寄生耦合。电源与地线应尽量分在两层互相垂直。线宽方面,对数字电路PCB可用宽的地线做一回路,即构成一地网(模拟电路不能这样使用),用大面积铺铜。

下面这篇文章就单片机控制板设计需要注意的原则和一些细节问题进行了说明。

1.元器件布局

在元器件的布局方面,应该把相互有关的元件尽量放得靠近一些,例如,时钟发生器、晶振、CPU的时钟输入端都易产生噪声,在放置的时候应把它们靠近些。对于那些易产生噪声的器件、小电流电路、大电流电路开关电路等,应尽量使其远离单片机的逻辑控制电路和存储电路(ROM、RAM),如果可能的话,可以将这些电路另外制成电路板,这样有利于抗干扰,提高电路工作的可靠性。

2.去耦电容

尽量在关键元件,如ROM、RAM等芯片旁边安装去耦电容。实际上,印制电路板走线、引脚连线和接线等都可能含有较大的电感效应。大的电感可能会在Vcc 走线上引起严重的开关噪声尖峰。防止Vcc走线上开关噪声尖峰的唯一方法,是在VCC与电源地之间安放一个0.1uF的电子去耦电容。如果电路板上使用的是表面贴装元件,可以用片状电容直接紧靠着元件,在Vcc引脚上固定。最好是使用瓷片电容,这是因为这种电容具有较低的静电损耗(ESL)和高频阻抗,另外这种电容温度和时间上的介质稳定性也很不错。尽量不要使用钽电容,因为在高频下它的阻抗较高。

在安放去耦电容时需要注意以下几点:

● 在印制电路板的电源输入端跨接100uF左右的电解电容,如果体积允许的话,电容量大一些则更好。

● 原则上每个集成电路芯片的旁边都需要放置一个0.01uF的瓷片电容,如果电路板的空隙太小而放置不下时,可以每10个芯片左右放置一个1~10的钽电容。

● 对于抗干扰能力弱、关断时电流变化大的元件和RAM、ROM等存储元件,应该在电源线(Vcc)和地线之间接入去耦电容。

● 电容的引线不要太长,特别是高频旁路电容不能带引线。

3.地线设计

在单片机控制系统中,地线的种类有很多,有系统地、屏蔽地、逻辑地、模拟地等,地线是否布局合理,将决定电路板的抗干扰能力。在设计地线和接地点的时候,应该考虑以下问题:

● 逻辑地和模拟地要分开布线,不能合用,将它们各自的地线分别与相应的电源地线相连。在设计时,模拟地线应尽量加粗,而且尽量加大引出端的接地面积。一般来讲,对于输入输出的模拟信号,与单片机电路之间最好通过光耦进行隔离。

● 在设计逻辑电路的印制电路版时,其地线应构成闭环形式,提高电路的抗干扰能力。

● 地线应尽量的粗。如果地线很细的话,则地线电阻将会较大,造成接地电位随电流的变化而变化,致使信号电平不稳,导致电路的抗干扰能力下降。在布线空间允许的情况下,要保证主要地线的宽度至少在2~3mm以上,元件引脚上的接地线应该在1.5mm左右。

● 要注意接地点的选择。当电路板上信号频率低于1MHz时,由于布线和元件之间的电磁感应影响很小,而接地电路形成的环流对干扰的影响较大,所以要采用一点接地,使其不形成回路。当电路板上信号频率高于10MHz时,由于布线的电感效应明显,地线阻抗变得很大,此时接地电路形成的环流就不再是主要的问题了。所以应采用多点接地,尽量降低地线阻抗。

4.其他

● 电源线的布置除了要根据电流的大小尽量加粗走线宽度外,在布线时还应使电源线、地线的走线方向与数据线的走线方身一致在布线工作的最后,用地线将电路板的底层没有走线的地方铺满,这些方法都有助于增强电路的抗干扰能力。

● 数据线的宽度应尽可能地宽,以减小阻抗。数据线的宽度至少不小于0.3mm(12mil),如果采用0.46~0.5mm(18mil~20mil)则更为理想。

● 由于电路板的一个过孔会带来大约10pF的电容效应,这对于高频电路,将会引入太多的干扰,所以在布线的时候,应尽可能地减少过孔的数量。再有,过多的过孔也会造成电路板的机械强度降低。

围观 527

页面

订阅 RSS - 单片机