任何一款MCU,其根本原理和功用都是迥然不同,所不同的仅仅其外围功用模块的装备及数量、指令体系等。关于指令体系,尽管办法上看似千差万别,但实践上仅仅符号的不同,其所代表的意义、所要完结的功用和寻址办法根本上是相似的。因而,关于任何一款MCU,首要应从如下的几个方面来了解和把握:
参数的初始化:完结了MCU的硬件和资源的初始化后,接下来便是对程序中运用到的一些变量和数据的初始化设置,这一部分的初始化需求依据详细的项目及程序的整体组织来规划。关于一些用EEPROM来保存项目预制数的运用来讲,主张在初始化时将相关的数据拷贝到MCU的RAM,以进步程序对数据的拜访速度,一起下降体系的功耗(原则上,拜访外部EEPROM都会添加电源的功耗)。
MCU的特色:要了解一款MCU,首要需求知道便是其ROM空间、RAM空间、IO口数量、守时器数量和守时办法、所供给的外围功用模块(Peripheral Circuit)、中止源、作业电压及功耗等等。
了解这些MCU Features后,接下来第一步便是将所选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中比较常见,因而能够用来完成时钟、计时等相关的功用;另一类则是Programmable Timer(可编程守时器),望文生义,该类Timer的守时时刻是能够由用户的程序来操控的,操控的办法包含:时钟源的挑选、分频数(Prescale)挑选及预制数的设定等,有的MCU三者都一起具有,而有的则或许是其间的一种或两种。此类Timer运用十分灵敏,实践的运用也千变万化,其间最常见的一种运用便是用其完成PWM输出(详细的运用,后续会有特别的介绍)。因为时钟源能够自由挑选,因而,此类Timer一般均与Event Counter(事情计数器)合在一起。
IO口:任何MCU都具有必定数量的IO口,没有IO口,MCU就失去了与外部交流的途径。依据IO口的可装备状况,能够分为如下几品种型。
纯输入或纯输出口:此类IO口有MCU硬件规划决议,只能是输入或输出,不行用软件来进行实时的设定;
直接读写IO口:如MCS-51的IO口就归于此类IO口。当履行读IO口指令时,便是输进口;当履行写IO口指令则主动为输出口;
程序编程设定输入输出方向的:此类IO口的输入或输出由程序依据实践的需求来进行设定,运用比较灵敏,能够完成一些总线级的运用,如I2C总线,各种LCD、LED Driver的操控总线等;
关于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(Universal Asynchronous Receive Transmit):归于最根本的一种异步传输接口,其信号线只需Rx和Tx两条,根本的数据格式为:Start Bit + Data Bit(7-bits/8-bits) + Parity Bit(Even, Odd or None) + Stop Bit(1~2Bit)。一位数据所占的时刻称为Baud Rate(波特率)。关于大多数的MCU来讲,数据为的长度、数据校验办法(奇校验、偶校验或无校验)、中止位(Stop Bit)的长度及Baud Rate是能够经过程序编程进行灵敏设定。此类接口最常用的办法便是与PC机的串口进行数据通讯。
I2C接口:I2C是由Philips开发的一种数据传输协议,相同选用2根信号来完成:SDAT(串行数据输入输出)和SCLK(串行时钟)。其最大的优点是能够在此总线上挂接多个设备,经过地址来进行辨认和拜访;I2C总线的一个最大的优点便是十分便利用软件经过IO口来完成,其传输的数据速率彻底由SCLK来操控,可快可慢,不像UART接口,有严厉的速率要求。
Watchdog(看门狗守时器):Watchdog也是绝大多数MCU的一种根本装备(一些4位MCU或许没有此功用),大多数的MCU的Watchdog只能答应程序对其进行复位而不能对其封闭(有的是在程序烧入时来设定的,如Microchip PIC系列MCU),而有的MCU则是经过特定的办法来决议其是否翻开,如Samsung的KS57系列,只需程序拜访了Watchdog寄存器,就主动敞开且不能再被封闭。一般来说watchdog的复位时刻是能够程序来设定的。Watchdog的最根本的运用是为MCU因为意外的毛病而导致死机供给了一种自我康复的才能。
MCU程序的编写:
MCU的程序的编写与PC下的程序的编写存在很大的差异,尽管现在依据C的MCU开发工具越来越盛行,但关于一个高效的程序代码和喜爱运用汇编的规划者来讲,汇编言语仍然是最简练、最有用的编程言语。关于MCU的程序编写,其根本的结构能够说是大体一致的,一般分为初始化部分(这是MCU程序规划与PC最大的不同),主程序循环体和中止处理程序三大部分(见图1 a 和b),其别离阐明如下:
初始化:关于一切的MCU程序的规划来讲,出生化是最根本也是最重要的一步,一般包含以下几个方面:
屏蔽一切中止并初始化仓库指针:初始化部分一般不期望有任何中止产生;
铲除体系的RAM区域和显现Memory:尽管有时或许没有彻底的必要,但从可靠性及一致性的视点动身,特别是关于避免意外的过错,仍是主张养成杰出的编程习气;
IO口的初始化:依据项意图运用的要求,设定相关IO口的输入输出办法,对与输进口,需求设定其上拉或下拉电阻;关于输出口,则有必要设定其出生的电平输出,以防呈现不必要的过错;
中止的设置:关于一切项目需求用到的中止源,应该给予敞开并设定中止的触发条件,而关于不运用的剩余的中止,则有必要给予封闭;
其他功用模块的初始化:关于一切需求用到的MCU的外围功用模块,有必要按项意图运用的要求进行相应的设置,如UART的通讯,需求设定Baud Rate,数据长度,校验办法和Stop Bit的长度等,而关于Programmer Timer,则有必要设置其时钟源,分频数及Reload Data 等;
参数的初始化:完结了MCU的硬件和资源的出生化后,接下来便是对程序中运用到的一些变量和数据的初始化设置,这一部分的初始化需求依据详细的项目及程序的整体组织来规划。关于一些用EEPROM来保存项目预制数的运用来讲,主张在初始化时将相关的数据拷贝到MCU的RAM,以进步程序对数据的拜访速度,一起下降体系的功耗(原则上,拜访外部EEPROM都会添加电源的功耗)。
主程序循环体:大多数MCU是归于长时刻不间断运转的,因而其主程序体根本上都是以循环的办法来规划,关于存在多种作业形式的运用来讲,则或许存在多个循环体,相互之间经过状况标志来进行转化。关于主程序体,一般状况下首要组织如下的模块:
核算程序:核算程序一般比较耗时,因而坚决对立放在任何中止中处理,特别是乘除法运算;
实时性要求不高或没有实时性要求的处理程序;
显现传输程序:首要针对存在外部LED、LCD Driver 的运用。
中止处理程序:中止程序首要用于处理实时性要求较高的使命和事情,如,外部突发性信号的检测,按键的检测和处理,守时计数,LED显现扫描等。一般状况下,中止程序应尽或许确保代码的简练和矮小,关于不需求实时去处理的功用,能够在中止中设置触发的标志,然后由主程序来履行详细的业务――这一点十分重要,特别是关于低功耗、低速的MCU来讲,有必要确保一切中止的及时呼应。
关于不同使命体的组织,不同的MCU其处理的办法也有所不同。例如,关于低速、低功耗的MCU(Fosc=32768Hz)运用,考虑到此类项目均为手持式设备和选用一般的LCD显现,对按键的反响和显现的反响要求实时性较高,应此一般选用守时中止的办法来处理按键的动作和数据的显现;而关于高速的MCU,如Fosc大于1MHz的运用,因为此刻MCU有满足的时刻来履行主程序循环体,因而能够只在相应的中止中设置各种触发标志,并将一切的使命放在主程序体中来履行;
在MCU的程序规划中,还需求特别注意的一点便是:要避免在中止和主程序体中一起拜访或设置同一个变量或数据的状况。有用的防备办法是,将此类数据的处理组织在一个模块中,经过判别触发标志来决议是否履行该数据的相关操作;而在其他的程序体中(首要是中止),对需求进行该数据的处理的当地只设置触发的标志。――这能够确保数据的履行是可预知和仅有的。
总归,关于MCU开发来讲,有必要记住一点:“条条大路通罗马”,没有做不到的事,要害是看办法是否正确!再便是多做多着手和多想。