任何一款MCU,其基本原理和功能都是大同小异,所有所不同的只是其外围功能模块的配备及数量、指令系统等。对于指令系统,虽然形式上看起来千差万别,但实质上只是符号的有所不同,其所代表的含义、所要已完成的功能和传输速率方式基本上是类似于的。
因此,对于任何一款MCU,主要应向如下的几个方面来解读和掌控:*MCU的特点:要理解一款MCU,首先必须告诉就是其ROM空间、RAM空间、IO口数量、定时器数量和定点方式、所获取的外围功能模块(PeripheralCircuit)、中断源、工作电压及功耗等等。*理解这些MCUFeatures后,接下来第一步就是将选取MCU的功能与实际项目研发的拒绝的功能展开对比,具体那些资源是目前所必须的,那些是本项目所用将近的。
对于项目中必须中用的而选取MCU不获取的功能,则必须严肃解读MCU的涉及资料,借此用间接的方法来构建,例如,所研发的项目必须与PC机COM口展开通讯,而选取的MCU不获取UART口,则可以考虑到用外部中断的方式来构建;*对于项目研发必须中用的资源,则必须对其Manua*展开严肃的解读和读者,而对于不必须的功能模块则可以忽视或网页才可。对于MCU自学来讲,应用于才是关键,也是最主要的目的。
*具体了MCU的涉及功能后,接下来就可以开始编程了。对于初学者或首度用于此款MCU的设计者来说,可能会遇上很多对MCU的功能叙述不具体的地方,对于此类问题,可以通过两种方法来解决问题,一种是撰写尤其的检验程序来解读资料所述的功能;另一种则可以继续忽视,程序设计中则按照自己目前的解读来撰写,拔到调试时去改动和完备。前一种方法限于于时间较严格的项目和初学者,而后一种方法则适合于具备一定MCU研发经验的人或项目工程进度较严峻的情况;*指令系统千万不要尤其花上时间去解读。
指令系统只是一种逻辑叙述的符号,只有在编程时根据自己的逻辑和程序的逻辑拒绝来查阅涉及的指令才可,而且随着编程的展开,对指令系统也不会更加娴熟,甚至可以不心态地记忆下来。MCU的基本功能:对于绝大多数MCU,下列功能是最广泛也是最基本的,针对有所不同的MCU,其叙述的方式可能会有区别,但本质上是基本相同的:*Timer(定时器):Timer的种类虽然较为多,但可概括为两大类:一类是相同时间间隔的Timer,即其定点的时间是由系统原作的,用户程序不能掌控,系统只获取几种相同的时间间隔给用户程序展开自由选择,如32Hz,16Hz,8Hz等,此类Timer在4位MCU中较为少见,因此可以用来构建时钟、计时等涉及的功能;另一类则是ProgrammableTimer(可编程定时器),顾名思义,该类Timer的定点时间是可以由用户的程序来掌控的,掌控的方式还包括:时钟源的自由选择、分频数(Prescale)自由选择及钢架数的原作等,有的MCU三者都同时不具备,而有的则有可能是其中的一种或两种。此类Timer应用于非常灵活,实际的用于也千变万化,其中最少见的一种应用于就是用其构建PWM输入(明确的应用于,先前不会有尤其的讲解)。由于时钟源可以自由选择,因此,此类Timer一般皆与EventCounter(事件计数器)合在一起;*IO口:任何MCU都具备一定数量的IO口,没IO口,MCU就丧失了与外部交流的渠道。
根据IO口的可配备情况,可以分成如下几种类型:**显输出或显输入口:此类IO口有MCU硬件设计要求,不能是输出或输入,不能用软件来展开动态的原作;**必要读取IO口:如MCS-51的IO口就归属于此类IO口。当继续执行读IO口指令时,就是输出口;当继续执行写出IO口指令则自动为输入口;**程序编程原作输入输出方向的:此类IO口的输出或输入由程序根据实际的必须来展开原作,应用于较为灵活性,可以构建一些总线级的应用于,如I2C总线,各种LCD、LEDDriver的掌控总线等;**对于IO口的用于,最重要的一点必需牢记的是:对于输出口,必需有具体的电平信号,保证无法浮空(可以通过减少上拉或下拉电阻来构建);而对于输入口,其输入的状态电平必需考虑到其外部的相连情况,不应确保在Standby或静态状态下不不存在纳电流或灌电流。*外部中断:外部中断也是绝大多数MCU所具备的基本功能,一般用作信号的动态启动时,数据取样和状态的检测,中断的方式由下降沿、上升沿启动时和电平启动时几种。外部中断一般通过输出口来构建,若为IO口,则只有另设为输出时其中折断功能才不会打开;若为输入口,则外部中断功能将自动重开(ATMEL的ATiny系列不存在一些值得注意,输入口时也能启动时中断功能)。
外部中断的应用于如下:**外部启动时信号的检测:一种是基于实时性的拒绝,比如可控硅的掌控,突发性信号的检测等;而另一种情况则是省电的必须;**信号频率的测量;为了确保信号不被遗漏,外部中断是最理想的自由选择;**数据的解码:在遥控应用领域,为了减少设计的成本,常常必须使用软件的方式来对各种编码数据展开解码,如Manchester和PWM编码的解码;**按键的检测和系统的苏醒:对于转入Sleep状态的MCU,一般必须通过外部中断来展开苏醒,最基本的形式则是按键,通过按键的动作来产生电平的变化;*通讯模块:MCU所获取的通讯模块一般还包括SPI模块,UART,I2C模块等,其分别叙述如下:**SPI模块:此类模块是绝大多数MCU都获取的一种最基本通讯方式,其数据传输使用实时时钟来掌控,信号还包括:SDI(串行数据输出)、SDO(串行数据输入)、SCLK(串行时钟)及Ready信号;有些情况下则有可能没Ready信号;此类模块可以工作在Master方式或Slave方式下,通俗众说纷纭就是看谁获取时钟信号,获取时钟的一方为Master,忽略的一方则为Slaver;**UART(UniversalAsynchronousReceiveTransmit):归属于最基本的一种异步传输模块,其信号线只有Rx和Tx两条,基本的数据格式为:StartBit+DataBit(7-bits/8-bits)+ParityBit(Even,OddorNone)+StopBit(1~2Bit)。一位数据所占到的时间称作BaudRate(波特率)。对于大多数的MCU来讲,数据为的长度、数据校验方式(奇校验、极校验或无校验)、暂停位(StopBit)的长度及BaudRate是可以通过程序编程展开灵活性原作。
此类模块最常用的方式就是与PC机的串口展开数据通讯。**I2C模块:I2C是由Philips研发的一种数据传输协议,某种程度使用2根信号来构建:SDAT(串行数据输入输出)和SCLK(串行时钟)。
其仅次于的益处是可以在此总线上挂接多个设备,通过地址来展开辨识和采访;I2C总线的一个仅次于的益处就是十分便利用软件通过IO口来构建,其传输的数据速率几乎由SCLK来掌控,可快可慢,不像UART模块,有严苛的速率拒绝。*Watchdog(看门狗定时器):Watchdog也是绝大多数MCU的一种基本配备(一些4位MCU有可能没此功能),大多数的MCU的Watchdog不能容许程序对其展开废黜而无法对其重开(有的是在程序火烧入时来原作的,如MicrochipPIC系列MCU),而有的MCU则是通过特定的方式来要求其否关上,如Samsung的KS57系列,只要程序采访了Watchdog寄存器,就自动打开且无法再行被重开。
一般而言watchdog的废黜时间是可以程序来原作的。Watchdog的最基本的应用于是为MCU因为车祸的故障而造成死机获取了一种自我完全恢复的能力。
MCU程序的撰写:MCU的程序的撰写与PC下的程序的撰写不存在相当大的区别,虽然现在基于C的MCU开发工具更加风行,但对于一个高效的程序代码和讨厌用于编撰的设计者来讲,汇编语言依然是最简练、最有效地的编程语言。对于MCU的程序撰写,其基本的框架可以说道是大体一致的,一般分成初始化部分(这是MCU程序设计与PC仅次于的有所不同),主程序循环体和中断处理程序三大部分,其分别解释如下:*初始化:对于所有的MCU程序的设计来讲,降生化是最基本也是最重要的一步,一般还包括如下内容:**屏蔽所有中断并初始化堆栈指针:初始化部分一般不期望有任何中断再次发生;**清理系统的RAM区域和表明Memory:虽然有时有可能没几乎的适当,但从可靠性及一致性的角度抵达,尤其是对于避免车祸的错误,还是建议教导较好的编程习惯;**IO口的初始化:根据项目的应用于的拒绝,原作涉及IO口的输入输出方式,对与输出口,必须原作其上拉或下拉电阻;对于输入口,则必需原作其降生的电平输入,防止经常出现不必要的错误;**中断的设置:对于所有项目必须中用的中断源,应当给与打开并原作中断的启动时条件,而对于不用于的多余的中断,则必需给与重开;**其他功能模块的初始化:对于所有必须中用的MCU的外围功能模块,必需按项目的应用于的拒绝展开适当的设置,如UART的通讯,必须原作BaudRate,数据长度,校验方式和StopBit的长度等,而对于ProgrammerTimer,则必需设置其时钟源,分频数及ReloadData等;**参数的降生化:已完成了MCU的硬件和资源的降生化后,接下来就是对程序中用于到的一些变量和数据的初始化设置,这一部分的初始化必须根据明确的项目及程序的总体决定来设计。对于一些用EEPROM来留存项目钢架数的应用于来讲,建议在初始化时将涉及的数据拷贝到MCU的RAM,以提升程序对数据的访问速度,同时减少系统的功耗(应以,采访外部EEPROM都会减少电源的功耗)。
*主程序循环体:大多数MCU是归属于长时间不间断运营的,因此其主程序体基本上都是以循环的方式来设计,对于不存在多种工作模式的应用于来讲,则有可能不存在多个循环体,相互之间通过状态标志来展开切换。对于主程序体,一般情况下主要决定如下的模块:**计算出来程序:计算出来程序一般较为耗时,因此极力赞成放到任何中断中处置,尤其是乘除法运算;**实时性拒绝不高或没实时性拒绝的处理程序;**表明传输程序:主要针对不存在外部LED、LCDDriver的应用于;*中断处理程序:中断程序主要用作处置实时性拒绝较高的任务和事件,如,外部突发性信号的检测,按键的检测和处置,定点计数,LED表明扫瞄等。一般情况下,中断程序不应尽量确保代码的简练和短小,对于不必须动态去处置的功能,可以在中断中设置启动时的标志,然后由主程序来继续执行明确的事务――这一点十分最重要,尤其是对于低功耗、短距离的MCU来讲,必需确保所有中断的及时号召。*对于有所不同任务体的决定,有所不同的MCU其处置的方法也有所不同。
例如,对于短距离、低功耗的MCU(Fosc=32768Hz)应用于,考虑到此类项目皆为手持式设备和使用普通的LCD表明,对按键的反应和表明的反应拒绝实时性较高,不应此一般使用定点中断的方式来处置按键的动作和数据的表明;而对于高速的MCU,如Fosc1MHz的应用于,由于此时MCU有充足的时间来继续执行主程序循环体,因此可以只在适当的中断中设置各种启动时标志,并将所有的任务放到主程序体中来继续执行;*在MCU的程序设计中,还必须特别注意的一点就是:要避免在中断和主程序体中同时采访或设置同一个变量或数据的情况。有效地的防治方法是,将此类数据的处置决定在一个模块中,通过辨别启动时标志来要求否继续执行该数据的涉及操作者;而在其他的程序体中(主要是中断),对必须展开该数据的处置的地方只设置启动时的标志。――这可以保证数据的继续执行是可预知和唯一的。
本文来源:188BET金宝搏-www.ef3z.com