单片机程序设计编程规范_第1页
单片机程序设计编程规范_第2页
单片机程序设计编程规范_第3页
单片机程序设计编程规范_第4页
单片机程序设计编程规范_第5页
已阅读5页,还剩20页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机程序设计编程规范本规范适用松翰科技8-bitMCU部门汇编程序编写准则,同样适用代理商及币;耍客户工 程师编程规范参考。本规范的H的为统一编程风格,保证程序编写质吊,提高程序的町移植 性和维护性。人部分的规范严格,品质耍求高的软件公司対员编写代码的风格都冇硬性规定,例如缩排的 使用,TAB的长度,曲数变届的命名方式.这些规定的明显好处是町以统一规范不同程序员所 编制的代码,提升程序代码的可读性与可维护性,同时统-格式的编程风格也为code renew 提供方便.目录r设计总则二三. 程序可读性及可巒性四. 注释五. 变M名规则六. 當量命名規则七. 标号命名規则A.文粉名規JWt核割九.

2、标准程序模块设计总则1. 程序质量的评估程序的优劣可以从两个方面进行评佔,定最指标和定性指标。 定量指标包括:1)程序代码执行效率:2)程序占用资源多少.定性指标包括:1)可调试性,即是否方便排除程序语法错误;2)可测试性,即是否方便验证程序功能的正确性:3)可维护性,即是否方便程序的修改和升级;4)可移松性;5)可读性。2、程序架构为了便维护和移植,推荐使用层次化的软件设计方法。町把整个软件分为三层:应用层、 界而层和底层驱动层。各层之间的关系如下图所示。层次化设计说明:D 底层驱动层主耍包含直接和硕件相关的驱动程序,如数码管显示、按键、峰鸣器、 继电器和电机控制等。底层的以个模块间耍保持?

3、$门的独立性,不产生直接的数拯交互,底 层也不直接访问应用层,如果有需要,都耍通过界而层进行数据交互。2)界面层主耍提供数据交互,为皿用层和底层岖动Z间以及底层驱动层各模块Z间提 供数据的交互。3)应用层主耍完成11体功能的实现,它耍通过界面层控制底层驱动层齐模块來完成所 需功能,而不能越过界面层直接访问底层牀动层。所冇的用户接II要在W用层来实现.4)一个好的架构必须将底层硬件包装起来,为应用程序提供一组丰富的两数操作 (buffer or parameter),例如在中断的处理屮,应川程序不需耍资料屮断的堆栈如何保护不 需要知道地址操作,只需耍读取中断产生的旗标动作.5)在即时性软件系统里

4、面,对达到高效率的实时性与反应力,所以程序使用大吊的博 件触发方式来设计任务.事件有可能来自外部的触发(key , rx data , sensor detect, .)也可 能是系统内部自行产生的(Timer, alarm, flag),*j事件触发方式相对应的是定时査询方式 (polling), 一般來说polling效率较差 因为仃多余的动作而11系统反应时间与查询polling时 间间隔有关,但是在小空的MCU系统里面用Polling方式反而简单许多3设计基本原则D尽杲减少各个子程序功能模块间的耦介度(耦介度是指一个程序的执行对另一个程 序的影响力),保证各自的独立性。一般情况卜,建议

5、子程序模块功能的划分耍尽町能细化. 功能尽量单一,减少子程序模块间的数据交互。2)在满足功能盂求的情况卜,可适为牺牲代码的执行速度,以保证程序的透明度。3)主耍子程序模块间的交耳,耍通过特定的界面跟应用层进仃沟通,可使用FIFO (Firstin, Firstout)或是Buffer两种方式.每种子程序模块都可以有自己的FIFO。例如: 就按键來说,一般有Key buffer. Key FIFO或直接进入AP FIFO三种设计方式。Key buffer: 一般用J保存数字按键信息。例如:在电话机的设计屮,需要记录按 键内容用J- LCD显示、最后数字确认、数字存储等,这时候需耍把按键值的信息

6、(0123456789*#)记录在 Key buffer 中;Key FIFO: 一些功能按键町以将相应信息列入到Key FIFO中,等待W用层的取用. 这样可根据不同的工作模式进行不同的处理及动作。这些类似的观念可以应用在许多周边中:输入类:Key、RF Data input. UART data input Switch input 等; 输出类:LCD display、LED display、UART data output 等。APR FIFO (jK用界面层丄要是将发工的怕T储存在APP FIFO屮Ml等待适片的 时间依序处理,不然冇可能造成系统在某-程序物件里而循环,从而降低系统的

7、实时性(Real-Time).4)每个子程序模块只能勺唯一一个程序入I I地址在程序的首部,只能有唯一一个程序 出I】地址在程序的尾部。例如:以卜的写法是不规范的(两个RET出II,心在调试时不易设立断点,程序可读性降低等问 题):lable:bObtsO fzretclryret应该改为(只有一个出口位置,标号为lable90,便于程序检査):lable:bObtsO fzjmp lable90clrylable90:ret5)上电复位时耍対所仃的RAM空间进彳j:初始化(建议用户寄存器清零,系统寄存器 进行必耍设定),不耍使用未经初始化的变磺。RAM未经过完整的初始化,容易导致程序执 行的

8、不确定性,这一不良现象往往在批杲生产中何所体现。(这点是工程师经常犯错的地方, 须特别注意)6)系统中如果盂耍等待一些未知的应答信呂,如通信或等待输入信号时,必须进行超 时或异常处理,以防止程序进入“死等”状态。例如在红外接收中,由信号的突然消失或干扰从而无法得到一帧完整或正确的信 息,这时需耍复位接收程序的入II条件并退出接收程宇,而不是一貫等待信号的来临。不然 无法进行卜次接收甚至会影响到其它程序的执行。7)通过对系统数据结构的划分与组织的改进,以及刘程序算法的优化來提高空间效 率。这种方式是解决轶件空的效率的根本办法。8)保证循坏体内的工作磺最小化。应仔细考虑循环体内的语句是否町以放在循

9、环体Z外.使循环体内I作彊最小.从而提高程序的执行效率。9)在多重循环中,应将最忙的循坏放在垠内层。10)中断处理程序应尽届短。冇效的作法为:在中断中进行标记,在主程序中进行处 理。但一些实时性耍求较高的程序例外。此外,进入中断时应该保存涉及到的变起和寄存器。11)看门狗的正确使川。看门狗主要用微控制器死机时的时间溢出复位,需要程序 适时淸除。正确的处理方式为:整个系统程序屮尽宦保还只仃一处淸看门狗位置,而且应处 在主循环的主干位置。切记不可在定时中断中清狗,因为微控制器仃时只是在主循环中死掉, (所冇AC电源的应用程序都必须强迫加入看门狗选项尤贰是条件式的看门狗何利系统 发生异常后的重启动)

10、二、排版风格仁 程序采用缩进风格编写,缩进为1个Tab键,1个Tab键定义为8个空格位。2、程序中的标号耍从第一列开始书写。以开头的预编译命令也要从第一列开始书写, 其他预编译命令采用缩进风格编写。例如:1)以开头的预编译命令耍从第一列开始书写,其他预编译命令采用缩进风格书丄1ST写。;从第一列开始书写macro 1.hCONSTNUMBEREQU55hDATAwkOODS1CODEORGOhINCLUDESTD标号要从第一列开始书写。2) main:jmpmain3)变股或常届的定义采用缩进风格。 例如:;从第一列开始;缩进8个空格位DATAkeybufDS1CONSTNUMBEREQU84

11、)定义变杲或常杲时.变起名或常杲名与命令符Z间使用2个Tab键(相为JT6个空 格位)分开,命令符与后面的操作数用1个Tab键(相当J:8个空格位)分开。例如:keybufDS1NUMBEREQU55h5)操作码与操作数个Tab键(相当J 8个空格位)分开。例如:ORG80hmova,NUMBERtable:DW1234h6.)程序屮两个操作数Z间用一个“,”作为分隔符,“#''号与立即数Z间不需耍分隔 符。例如:mova.# 55h7)标号要单独占一行。8)相对独立的程序块之间必须加空行。例如:ORG10hINCLUDEsys.asmINCLUDEint.asm7INCLUD

12、E key.asm9)程序语旬后面若仃注秫,所仃的注释耍遵守上卜对齐的原则。 例如:bOmov lt#7fhmova,#00应该书写为: bOmov movl,#7fha,#00;usedpOx(hl) pointer ;set pointer = 007fh;use dpOx(hl) pointer;set pointer 二 007fh#三.程序可读性与可维护性1. 程序屮的语句.标号、变吊使用小写英文字母.常最与预编译命令使用人写英文字母.以便和-般的语创进行区分。 例如:55h1NUMBEREQUDATAaccbufDSCODEmova,#NU MBER2. 表示不同进制的立即数,要在

13、立即数后面加上不同的进制符号。例如:mova,#00100011bmova,#23h不建议使用:mova,#0x233. 一般请况卜,变磧和常St要分开定义,不要混在一起。变St在“.DATA"段中定义,采用 命令符常最在"CONST"段屮定义.釆用命令符 忙QLP。例如:CONSTNUMBER EQU 10DATAaccbufDS14.程序中不使用未定义或意义不明确的常So 例如:卜面的赋值方法要避免使用:mov在常吊中做定义mova,#3r.a;不要口接使用总义不明确的数建议采用如卜赋值方法:CONSTNUMBER EQU 3;循环次数CODEmova,#NU

14、MBERmovr,a5. 整个程序的结尼耍以“ENDP”语句结束。6. 为一段代码在程序中冇多个地方使用时,建议采用子程序调用或宏命令的方式來替代。 如此,对该代码段的修改就可在一处完成,増强代码的可维护性。7. 程序屮关系絞为密切的子程序代码尽可能相邻。8. 避免程序屮的垃圾代码,预留代码应以注释的方式出现。程序中的垃圾代码不仅占用额 外的空间,而冃.还可能影响到程序的功能与性能,很可能给程序的测试、维护等造成不必要 的麻烦。?1!注释1. 程序应该包括两个部分注释,说明部分和语句注禅。一般情况卜,源程序冇效注释起必 须在30%以上。2说明部分:1)源文件说明部分位每个源文件的最前面,主要描

15、述:文件名、作者、生成口期、 联络方式、功能描述、版木号、软锁件平台、版权说明、修改记录等的简耍说明,以英文书 写。例如:*w* *»* * xw »File name:Author:Date:Email:Description:;文件名;作者;口期;邮箱地址;功能描述;版本号Version:Hardware&IDE;软硬件平台Copyright (C), SONIX TECHNOLOGY Co., LtdHistory:* * 食食* ww 食*« *# 食* *» * /;修改记录2)子程序说明部分位毎个子程序的最前面,主要描述:子程序名称、

16、功能、设计原 理、所用变届、入II条件、出II店息、调用模块、堆栈层数、影响资源、算法简述、使用说 明和修改记录等。例如:/*# * * * *AW * *> * Subrouti ne: Description: Principium:;子程序名称;子程序功能的描述;程序设计原理Calls:;被本子程序调用的子程序消单Variables:Input:;本子程序中所用到的临时变量;子程序调用所需要基本参数的说明Output:;子程序调用后运算结果的说明Stack:History:* *»* M * M 食* »* * * *<* * * * /3. 边写代码边注

17、释,修改代码的同时修改相应注释, 用的注释要删除。4. 耍避免在注释中使用缩写,特别是罪常用缩写。;占用的堆栈层数;修改记录以保证注释与代码的一致性。不再有5. 程序在必耍的地方必须冇注释,注释耍准确、易懂、简洁。注释耍冇意义,如果冇需要. 还耍详细描述相关含义。例如:以下是无意义的注释mova,#5;把嗽给 accmovwkOO.a;把 acc 赋给 wkOO应该如下注释:mova,#5;设置循环次数为5次movwkOO.a6. 注释用与具描述的代码相近,对代码的注释应放在其I:方或右方(対单条语句的注释) 的和邻位置,不可放在下方,如放丁上方则需与其上面的代码用空行隔开。例如:clrwkO

18、O;Check Read index = FiFo Limitcmprsa,r; Is Read index = Limitjmpf7.注释格式尽杲统一,对多行注釋建议使用“广 7',对单行的注释建议使用8. 注释用考虑程序易读及外观排版因索,语言尽彊统一。対不能进行准确英文表达的建议 便用中文。9. 対冇金义的变鼠、常駅,如果氏命名不是充分门注释的,在声明时都必须加以注释,说 明其含义。五、变量命名规则1. 变昴的名称耍釆用冇意义的英文单词小写缩写。可以采用以卜几种方式进行缩写命名:1)去掉所有不在词头的尤音字母。如screen可以简写为scrn.2)使用毎个单词的头儿个字母。ill

19、 channelactivation可以简写为chanactiVo3)使用变名中具彳j'典型点义的单词。如numberofcycle可以简写为cyclenumber。4)去掉无用的单词后缀ing、ed等。如pagingrequest可以简写为pagreq。5)尽杲使用标准或惯用的缩写形式,缩写应该保持一致性。如serial peripheral interface可以简写为spi。6)部门已经完成函式的变彊名称,如果没仃特别原因,发展人员延续使用以增加可 读性2. 在定义部分耍加入注释來说明变宣的含义。3. 变量的定义耍在“-DATA“段中。4. 变駅标识符的长度不超过16个字符。5.

20、 程序会用到起码三种变最1)全局变最名称前面不加任何修饰2)局部变届 利用wkOO , wk01 .wkOn來衷示,每个独立程序里面用到的 Local var.可有效节省RAM3) 中断局部变杲中断里面用的Interrupt local var.利用IwkOO, lwk01以作为 区隔(注意屮断使用的变磺必泄耍小心的跟主程序区隔开,不然影响系统稳泄性相当人) 例如:DATAaccbufds 1:全局变最l_numberds 5;局部变彊6. 位定义。程序多处会经常对寄存器的某一位进行操作,可以在变龟定义时対盂要用到的 位进行定义,建议名称以许_”开头。7. 临时工作寄存器的定义。程序中经常需要

21、用到一些临时存储数据的占存器,我们称Z为 临时工作寄存器,这些临时工作寄存器的命名方法为"wk”加上一个二位数了组成,这个 数字可以从“00”开始随着需耍定义的临时工作寄存器的数龟的増加而增加。需耍特别说明 的览,临时工作寄存器的使用可以大量节省RAM空间,但是耍注意相应的生命周期,必须 在子程序退出Z前,将空间释放以便其它子程序使用。8. 在中断处理程序中用到的寄存器,为了和一般的备时工作寄存器作以区分,可以在寄存 器前而加英文字母“i”來命名。在使用时需耍加以注意,不要和主程序中的变杲复用。 例如:DATAwkOOds1wk01ds1wk02ds1iwkOOds1;中断中耍用到的

22、临时工作寄存器iwk01ds1;中断中要用到的临时匸作寄存器CODEmova,rmovwk00,amova,wk01movr,a六、常量命名规则1. 常駅的名称要采用冇意义的英文单词人写缩写。2. 常最耍定义在“CONST“段中。3. 在定义部分耍加入注释來说明常R含义。4. 常量标识符的长度不超过16个字符。5. 系统寄存器中常用到的某些位可以再额外进行定义,但耍冇意义:P_key1EQU P1.0;P_打头表示为Port定义Pm_key1 EQU P1m.O;Pm_打头表示为Port方向定义七、标号命名规则1. 标号的名称耍采用有意义的英文单词小写缩写。2. 子程序标号定义。在同一个子程序

23、中,所有的标号应该有规律可寻.建议第一个标号为 子程序名,卜面所用到的标号用子程序名添加数字表示,从而便今后程序的添加和修改, 数字尽最使用两位数,在子程序的退出位置,数字一般为”90”。例如:在一段按键打描程序中,如卜的标号是不可取的。Label:LabelOKLabelFailLabelQuitLabelfun:LabelE nd:Ret(设计师要花许多精神命名label,同时不容易看出子程序的结构关西,所以建议在子程序 里面别在花梢神命名,都用号码表示)(详细的动作都用注解來说明)应该改为: Wt * * W* * * « * * « * * * * * X xw *

24、 *9; Sub-routine , Name : label rww * * *«m *«* rw*w*“* «*rww w* >Label:If the condition fail then go to Label90;program begin here13LabeHO:;注解都写在这里Label20:;最后结尾结束的label都用90当做结尾:有助尸程序的阅读Label90:Ret3. 为了使程序的结构更加消晰,子程序的命名婆尽彊能显爪出相耳间的调用关系。111 main主循环中直接调用的程序,要以“mn_”作为标弓的开头,卜面仅列出一些常用的 子

25、程序名称,其它类似情况可同样处理。mn_app;系统应用程序mnjntgnd;中断与主程序Z间的界面子程序mn_key;按键柯描子程序mn_lcd;LCD显示子程序mn_led;LED显示子程序mn_tone;声音处理子程序mn_eppEEPROM读写操作mn_bio;基本输入/输出控制mn_adc;ADC输入及处理mn_debug;debug 处理程序4. 程序的几个常用入I 1地址命X如卜I复位入口: reset中断入11: isr主程烬入II: main例如:org 0jmp reset org 8jmp sr;ISR (Interrupt Service Routine)org 10;

26、有效程序开始地址reset: ;进入主程序前的一些准备匚作(预处理)premai n:;主程序循环圈main:Jmp main八、文件名的命名规则及文件分割1. 在一个项冃中耍包括两种文件:源文件和头文件,源文件是程序体,扩展名为” asm”, 头文件包括了变最、常鼠、宏命令的定义,扩展名为”.inc”。2. 头文件的命名头文件用三个不同的文件來分别定义常昴、变磧、宏命令,其命名方法如门常吊:定义文件:xxx_equ.inc变磺定义文件:xxx_ram.inc宏命令怎义文件:xxx_macro.inc其中,xxx表示項目的名称例如:作一个电话机的完整程序,头文件町如卜定义:常吊定义文件:pho

27、ne_equ.inc变就定义文件:phone_ram.inc宏命令定义文件:phone_macro.inc3. 源文件分为主文件、子文件。主文件包括了项日的主程序,它描述了芯片信息、CODE OPTION倍息及项口包倉的其它了文件模块。了文件是宙*个了程序模块组成,功能相近 的子程序要放在一个文件中,文件名可以用“项冃名+模块功能的缩写+扩展名”表示。卜而 列举一些常用的文件名:主程序文件:xxx_main.asm常用的子文件定义:中断服务程序模块:xxxjnt.asm进程处理模块:xxx_pro.asm系统处理程序:xxx_sys.asm按键处理模块:xxx_key.asmLCD 显示模块:

28、xxx_lcd asm其屮,xxx表示项冃的名称。九、标准程序模块常用功能模块尽量采用附件提供的标准程序如果无法使用标准的程序模块,那么所编写的 程序一定耍符介规范耍求。所提供的标准程序如卜详细的源代码在附录中。1.mn_key;单键打描子程序2.mn_mulkey;多键处理子程序3.mn_tone;声音处理子程序4.mn_lcd;LCD显示子程序5.mn_i2c;I2C操作子程序6.mn_sio;SIO操作子程序7.mn _1wie;单总线操作了程序8.mn_uart;UART子程序9.wr_fifoJWFIFO10.rd_fifo;读 FIFO11.ram2ram12.rom2ram13.

29、math;RAM到RAM的数据传递 ;ROM到RAM的数据传递;基本运算程序实例说明1.初始化1)当程序上电复位时,一个完整的用户寄存器初始化或淸零动作是非常豆要的.否则容易造成程序执行的不确定性。例如: pre_clrRAM:bOmovy,#o;消 RAM bankO:bOmov乙#48clryzdeemszjmpbclr retyz2)系统寄存器必须进行初始化,比如说I/O II方向和输出电平等。需要特别说明的是输出口的初始化必须按照卜列顺序來处理:(1)设定相应I/O【输出高低电平(2)将相应I/O II为输出II如此町确保MCU的I/O I I从输入模式转为输出模弍时不会令脉冲的存在。

30、而在I/O II控制频繁变化(如通信)时更耍引起注意。例如:(3) mov;如果p1.0和p1.1 而这不是所希望的。a,#11111111b原來为输入高电半,肖肖接切换为输出方式时会令高电半脉冲的输出.bOmov mov bOmovp2m,aa,# 11111100bP2,a(4) mova,#OOOO11OObbOmov p2,a;这样处理p1.o和P1.1就避免了高电平脉冲的输出 movaHHIIHb;bOmovp2m,a开机时后10 toggle的作法利用暂时没有用到的10来做toggle可仃效观察以卞儿点1)系统是否正常开机2)足否发生 reset or watchdog reset

31、 现線3)程序是否重头运行观察IO toggle pulse width nj以解Internal RC频率的淮确性或是协助调整外部RC数値 以上方法可以有效协助最产生产问题开机时后Test Mode的作法Test Mode必须在开机时后 按卜某些组介按键 同时通过de-bounce才町进入test mode2. 按键处理1) 般來说key的处理是所冇程序的皋础教科书里而所教导的key处理观念人多以 delay循环与多次检査来处理弹跳书件,但是此种方法由导入delay循坏 人大降低系统实 时性,而人釦吏用者 都没仃警觉此问题 依然延续此观念设il key scan and de-bounce技

32、门, 此份文件详细叙述key处理观念2) 家电产品中经常用到抗干扰的测试EFT,会从电源端打入噪声测试系统抗噪声能 力,如果key处理不好会有key误动作产生,一般使用者会在key sean地方加入电容 以 减低此问题的产生,但是此方法还是无法完全避免此问题同时还増加硬件成本,这里提出 的de-bounce观念可以完全解决此问题3) 按键处理很多程序员都会将系统的程序设计与key程序结介没冇分开结构, 这造成很多程序就以key程序变成程序主体来运行,这里提出将key动作得出的key code 到fifo(first in first out)屮,使得AP系统得以在有空闲的时候才处理key co

33、de动 作,程序架构自然形成4) 一般來说key处理 都只侦测key down ,但是在某些系统确冇key down and key up的要求,这方面可以透H key in buffei的储存new/old buffer XOR比对得到key event, 更深一层的技乃侦测多按键处理更是需耍利用neWold buffer XOR來处理介理的按键处理一般包括按键打描、按键弹跳处理、按键输出转换等环节。例如:mn_ key:callkeyi n;IW按键输入将资料储存在keyinbuf里面callkeychk;按键弹跳处理callkeyevt;弹跳处理后,将按键扫描码转换储存到FIFO里面Ir

34、et®keyin一一按键打描,氏上要负贞将外部按键信息读入到内部buffer中。常用的按键一般包括:苴接按键、矩阵式扫描按键、三角形按键、扩充按键、按 键与其它周边共享I/O脚位等,部分场介还要考世睡眠和按键的唤醒功能。卜面进行分別 说明:1) 貢接按键址简单的按键方式,通常作法利用MCU里面的pull-up电阻上拉,外面按键落地,平时没有按键的时候,MCU input端11读到Hi,按键按F时候读到Low,如I、图所示2) M*N矩阵式打描按键最典型的按键知描方式,仃分Single key , multi-key扌描 单按键扌I描:一个时间只允许一个按键动作同时也只读取一个按键 1

35、9多按键扫描:一个时何允许一个以上的key按下,但是只读取最新按下的按健 打描注意車项:般來说打描的作法/j Output port and input port配介Output port 1110110110110111依序送出0信号让input port ®取,但此时可能发生两件冲突爭件需耍注意如果用output 0 and output 1的组介来送出scan pattern,当客户同时按卜同一排 两组按键的时候,会自短路现象,传统作法是加入二极管diode來保护,现在单片机的作法 则是利用output a input pull-up R的方式來达成.见图面说明但是当使用Inp

36、ut pull-up R时候 又有另外一件事情要注意就是当1110a1101时候,bitO = output 0 a input pull-up 1,必须是 bit 0 二 output 0 a output 1 a input pull-up 中间必须经过 output 1的动作,这动作要协助output 0的信号代接快速拉至Hi准位,然后再切换入input mode,如果 直接由output 0 a input mode ,此时会有一个较长的上升时间,导致key scan 错误3)三角形按键有效的增加扫描按键数目,见图面说明4)扩充按键 可以加上diode增加key scan数口见图面说明

37、5)按键与苴它周边共享I/O脚位6)ADC与RF接收机杂音避免的方式®k»ychk一按键弹跳处理,其主耍负责滤除按键输入11灌入的杂讯或按键弹跳杂波。1)一般建议弹跳时间处理约在70mS100mS , EFT特性如果要好可以更加长到 使用者可接受到最常时间200mS2)弹跳时间的处理并非用delay loop延迟,这会降低系统的实时性与反应力 必须检 査的动作放在主程序循环里而配keychat time的递减來完成!3)如果 主循环绕圈时间1mS那按键稳定检査连续次数可高达100次左右 这对 Key处理来说是非常稳定的4)弹跳的检査是连续检查key变化后维持相同状态100m

38、S,比如说key按FG Hi变成Low这时候程序侦测到输入仃异动便开启检查时间机制,当程序连续检査100mS 都发现Low没有改变的时候便发出key event,此时才有按键发生.5)关J* de-bounce的程序验证可透过修改弹跳时间测试,比如说故意将弹跳时间改1 sec.观察在一秒内的按键动作是否都不成立,只仃按键持续达一秒以上才仃动作产生,确 认后再将弹跳时间改回Iwycvt按键输出转换,其主要负贞将确认的按键信息进彳j转换和存储。1)KeyCVT主耍T作 将经过de-bounce的keybuffe跟之前所得到的key相比对, 看看新的key event为何,转换出来后 存储到keyb

39、uffer or keyfifo共至Fi接进入apfifo2)将key code储存到fifo中是一个非常晅耍的观念,这里展示出Key处理是一个 独立的物件程序,他的运行跟其他程序都没有相关,唯对外的界ifii interface就是fife.而 key的处理方式端看为时系统的status还冇AP设计的流程才做出相对应的丁作Task.3. 计时系统计时系统一般包括定时器初始化和泄时设直及处理两部分。1) 定时器初始化部分又包括:(1) 定时器控制寄存器的设定(2) 相关用户寄存器的设定(3) 定时时间的初始化2) 定时设置及处理:由系统里而会经常在不同的时间点执行不同的动作,所以定时的设 置及

40、处理变的尤为取要。例如需要以卜时间的定时:10ms定时:每10ms产生定时到达标,忐位100ms定时:每100ms产生定时到达标志位1000ms定时:每1000ms产生定时到达标志位一般来说,10ms的匸作可放在中断处理程序或主程序循坏圈中执行,至采取哪 种方式主要是看时间准确性的要求。100ms以上的匸作如果没仃特别的耍求建议放在主桿 序循环中执行。此外在系统时间设计中,时间不准确的问题经常发生,-般来源于时基的计 算与处理。可以在定时中断处理程序中输出一个方波來检査中断发生的时间.定时设置及处理有两种方法可作参考:计算法:利用MCU本身的定时中断作出10ms的时基,再利用计算的方法作 出

41、100ms. 1000ms 的定时。(2)累加法:此方法适用刈时间没冇特别耍求的场介。卜面以四位位尤依次累加來说明做法:timeslot= 0 0 0b timeslot= 0 0 1b timeslot= 0 10b timeslot= 0 11b timeslot= 10 0b timeslot= 10 1b timeslot= 110b timeslot= 111b timeslot= 0 0 0b假设变M timeslot以每5ms的时间来累加:;bitO=1,5ms 动作;bit1=1,产生 10ms flag;bitO=1,执行5ms动作,此时不再检査bit1;bit2=1,产生

42、20ms flag;bitO=1,执行5ms动作;bit1=1,执行10ms动作;bitO=1,执行20ms动作;没有动作市上面例子的规律来看,一个时间只会右一个时间任务产生,从而不会有A多的时间单位。4. 中断和主程序的处理1) Push and PoP动作 耍确实完整i. 请参照不同母体的建议作法2) 透过mnintgnd副程序來操作i. Interrupt中产生的动作可以在中断中直接处理(又急乂准的需求) 约mS等级的动作 如tone output, RF TX,有些计时参数的递减等ii. 不需要在中断处理,设立旗标flag等待在主程序屮检查处理(mnintgnd) 约100mS以上的动

43、作I如0.5S计时动作,某些timeout命令需要AP层处理iii. 需耍了解interrupt M用系统多少时间,可以在进入中断时候做一个o utput H 离开中段时候作个outputL來观察,片然这方血町以利用假抬令(IfDebug = 1)來设置,当 系统完成后将此output H/L动作关闭,进入屮断所占用的时间越短越好,原则是只耍能够 在主程序处理的动作 都在屮断里面设定flag弄到主程序(mnintgnd)处理,所以中断/上程 序的比例越低越好(这里也可以透过主程序循环的toggle來观察主循环的绕圈时间)5. EEPROM的读写操作1) EEPR0M的使用有以卜几个问题耍注意i

44、. EEPROM write time需耍一些时间,所有有两种作法,a) write , delay, write不建议使用除非写入资料很少,暂用系统时间少2) write, check busy, write超过 10 byte data 以上ii. 透过 buffer read/writeiii. 24seriesEEP耍特别注意ACK讯号(绝人部份的设计者都失败在ACK信号 的处理,造成系统稳定性不佳),同时上拉电阻的设置对j 24series也是很咆耍的iv. 晶牌较差的EEPROM普遍存在datalost的问题 当有岛电床脉冲的时候(尤 其开机瞬间)很容易将内部资料清除所以 这方面要

45、注意,当然开机那瞬间MCU对FEEP 的output设定也是很页要的很容易在开机瞬间误写错误信息给EEP6. Tone的处理1)可能MCU产生的tone有下列几种i. 配介按键动作的Key tone约100mS single toneii. 电话响铃音来电转接音保留音iii. 标准音乐Do-Re-Mi等iv. 警示音 error tone7. Display的处理1) LCD Display程序的唯一性尤其LCM模块使用更是重要i. 平时LCD都是透过LCD Buffer(RAM)來作为interface,当AP层而冇更动 LCD资料并不直接对LCM硬件操作,而是针对RAM Buffe更动资料

46、 同时设立 LCDREQ flagii. MNLCD里面发现LCDREQ=1时候才进入MNLCD程序运行显示更新,此 浓可有效改善效率与显示的稳定性iii. 相同如果非LCM的操作 有些人认为可以直接更改LCD RAM数值貢接更新 显乐,这也存在相当人的风险,报好的方式述式透过另外一组Buffer來做缓冲iv. 松翰的ICE发展系统仃提供 软件LCD模拟器给客户使用 当客户的LCD 还没仃实体,可以透过模拟器II接在PC画而上显示,配合程序开发IE常方便8. Telecomm 的处理1) Sync (with clock) and Async.2) Sync.类似 SPI 信号 data in

47、, data out, and clock3) Async.本身没有Clock时钟信号一般来说有以卜儿个组成i. Bit sync 位元同步ii. Frame sync 特左的 frame code 來馈尢 frame data 开始iii. Data length资料长度來收集资料iv. Checksum域后浪check sum米验证资料的正确性一般來说同步或异步通信程序 祁是TX容易/RX译码闲难21i. 拍码TX只需耍考虑人笔资料拍码的buffer and pointer彩响程序实时性不 人ii. 接收RX部分就冇点困难盂耍冇较多的技巧考见尤It异步通信更是麻烦5)RF通信里而还要考虎拍

48、码调变的方式某些锁件电路只能利用曼彻斯特编码法 来拍码以去除DC分崑9. Main Loop 的处理1)进入主程序循坏前要有个”前处理"(Pre_Main)來将基本参数设置好 才进入主循 环2)看门狗/条件式看门狗只能够放在主循坏内,町以确保主循环仃效的运彳人当主循 环运行失败,“看门狗”自然发生Reset动作3)主循坏的绕圈时间(实时性系统反应力)i. 牵涉到系统的实时性(real-time)所以绕圈时间越短越好 建议在5mS以内, 利JU IO toggle來观察主循环绕圈时间,如果程序里面有多余的I0就可以留下此IO供日后 生产测试观察使用,如果没冇多余在程序稳定后可以将此观察

49、的IO移除ii. 主循坏绕圈时间也会受到屮断的影响由中断的执行等级高于主循环所以 当中断运行时间越长自然主循环的运行时间也越长,所以中断里面占用时间必须稳定的控 制,不然影响系统实时性/反应性很人iii. 主循环里面每一个物件都要设计良好才能确保一个整体的绕圈时间,每一 个子程序物件进入前,都必须透过旗标判断是否盂耍执行,如MNLCD榨序 进入后龙即 检査是否lcdreq=1,如果在此绕圈动作中没有任何led资料更新,那也就不用浪费时间进 入led sub-routine .另外如EEP储存动作 由会有write data busy问题所以也必定要将 资料分批写入,不然程序会停留在write

50、data ffi环里面影响当时籟体实时性10. Watchdog 的处理1)Watchdog功能说明2)Watchdog方块图说明3)条件式清除watchdog4)使用地方注意事项11. Application 的处理1)透过 APFIFO 读取 APCodei. APFIFO越人越能够了解系统发生过的事件(event)助J:system debug,只 耍在ICE±而stop运行 观察FIFO buffer里而的数值 就可以知道哪些动作进入FIFO发 生过哪些事情ii. 同时系统里面有 keybuffer , led buffer, tx buffer, rx buffer, ee

51、prom buffer, tone buffer利用FIFO and Buffer的观察,软件系统的除错性自然产生2)APCode的编排设计i.由于程序最后可以透过PC跳转 所以APcode的数值设计就卄:常匝耍3)根据不同的status町以展开所令动作令两次跳转动作设计出所令的命令4)程序最后可达到农格化i殳计的境界利用跳转农格将程序的流程几体化12. Power down and wakeup1)省电的考晟(系统耗电应该低J;1uA/5V)i. Input pin :内部Pull-up resistor或是外部设定皆叮ii. Outputiii. Power down失败的情形wake-up pin没冇设置好,power down指令卜达肩9上就唤iW wake-up r使用若会 谋以为无法power donwiv.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论