单片机程序设计编程规范

上传人:微*** 文档编号:113303732 上传时间:2022-06-25 格式:DOCX 页数:34 大小:80.03KB
收藏 版权申诉 举报 下载
单片机程序设计编程规范_第1页
第1页 / 共34页
单片机程序设计编程规范_第2页
第2页 / 共34页
单片机程序设计编程规范_第3页
第3页 / 共34页
资源描述:

《单片机程序设计编程规范》由会员分享,可在线阅读,更多相关《单片机程序设计编程规范(34页珍藏版)》请在装配图网上搜索。

1、单片机程序设计编程规范本规范适用于松翰科技8-bit MCU 部门汇编程序编写准则,同样适用于代理商及重要客户工程师编程规范参考。本规范的目的为统一编程风格,保证程序编 写质量,提高程序的可移植性和维护性。大部分的规范严格,品质要求高的软件公司对员工编写代码的风格都有硬性 规定,例如缩排的使用, TAB 的长度,函数变量的命名方式。这些规定的明显好处是可以统一规范不同程序员所编制的代码,提升程序代码的可读性与可维护 性,同时统一格式的编程风格也为 code review 提供方便。目录设计总则二、排版风格 三、程序可读性及可维护性四、注释 五、变量命名规则六、常量命名规则 七、标号命名规则八、

2、文件命名规则及文件分割 九、标准程序模块十 . 附录、设计总则1 .程序质量的评佶程序的优劣可以从两个方面进行评估,定量指标和定性指标。定量指标包括:1) 程序代码执行效率;2) 程 序占用资源多少。定性指标包括:1) 可调试性,即是否方便排除程序语法错误;2) 可 测试性,即是否方便验证程序功能的正确性;3) 可 维护性,即是否方便程序的修改和升级;4) 可移植性;5) 可读性。2、程序架构为了便于维护和移植,推荐使用层次化的软件设计方法。可把整个软件分为三层: 应用层、界面层和底层驱动层各层之间的关系如下图所TJX 。层次化设计说明:1) 底层驱动层主要包含直接和硬件相关的驱动程序,如数码

3、管显示、按键、 峰鸣器、继电器和电机控制等。底层的各个模块间要保持各自的独立性,不产生直接的数据交互,底层也不直接访同应用层,如果有需要,都要通过界面层进行数据交互。2) 界面层主要提供数据交互,为应用层和庇层驱动之间以及庇层驱动层各模块之间提供数据的交互。3) 应用层主要完成具体功能的实现,它要通过界面层控制底层驱动层各模块来完成所需功能,而不能越过界面层直接访问/S层驱动层。所有的用户接口要在 应用层来实现。buffer or parameter) ,例如在中断的处理中,应用程序不需要资料中断的堆4) 个好的架构必须将底层硬件包装起来,为应用程序提供一组丰富的函数 操作栈如何保护不需要知道

4、地址操作,只需要读取中断产生的旗标动作。5) 在即时性软件系统里面, 对达到高效率的实时性与反应力,所以程序使用 大量的事件触发方式来设计任务。事件有可能来自外部的触发(key , rxdata , sensor detect,)也可能是系统内部自行产生的 (Timer, alarm, flag), 与事件触发方 式相对应的是定时查询方式(polling), 般来说 polling 效率较差因为有多余的动 作而且系统反应时间与查询 polling 时间间隔有关,但是在小型的 MCU 系统里面 用 Polling 方式反而简单许多。3. 设计基本原则1) 尽量减少各个子程序功能模块间的耦合度(

5、耦合度是指一个程序的执行对 启一个程序的影响力 ) ,保证各自的独立性。一般情况下,建议子程序模块功能 的划分要尽可能细化,功能尽量单一,减少子程序模块间的数据交互。2) 在满足功能需求的情况下,可适当牺牲代码的执行速度,以保证程序的透 明度。3) 主要子程序模块间的交互, 要通过特定的界面跟应用层进行沟通, 可使用 FIFO (Firstin. First out)或是Buffer两种方式。每种子程序模块都可以有自己的FIFO。例如:就按雒来说,一般有 Key buffer. Key FIFO 或直接进入 APFIFO三种设计方式。Key buffer : 般用于保存数字按褪信息。例如:在电

6、话机的设计中,需要记录 按雒内容用于 LCD 显示、最后数字确认、数字存储等,这时候需要把按雒值的 信息(0123456789*#)记录在 Key buffer 中。Key FIFO: 些功能按键可以将相应信息列入到 Key FIFO 中, 等待应用层的取用,这样可根据不同的工作模式进行不同的处理及动作。这些类似的观念可以应用在许多周边中:输入类: Key 、 RF Data input, UART data input. Switch input 等。输出类: LCD display 、 LED display, UART data output 等。APPFIFO (应用界刷层):主要是将

7、发生的事件储存在APPFIFO里面等待适当的时间依序处理,不然有可能造成系统在某一程序物件里面循环,从而降低系统 的实时性(Real-Time )o4)每个子程序模块只能有唯一一个程序入口地址在程序的首部,只能有唯一个程序由口地址在程序的尾部。例如:以下的写法是不规范的(两个RET 出口,存在调试时不易设立断点,程序可读性降低等问题):lable:bObtsO fz clr y应该改为(只有一个由口位置,标号为lable90,便于程序检查):lable:bObtsO fzjmp lable90? ?clr ylable90:5) 上 电复位时要对所有的 RAM 空间进行初始化(建议用户寄存器清

8、零,系 统寄存器进行必要设定),不要使用未经初始化的变量。 RAM 未经过完整的初始 化,容易导致程序执行的不确定性,这一不良现象往往在批量生产中有所体现。 (这点是工程师经常犯错的地方 , 须特别注意)6) 系 统中如果需要等待一些未知的应答信号,如通信或等待输入信号时,必 须进行超时或异常处理,以防止程序进入“死等”状态。例如在红外接收中,由于信号的突然消失或干扰从而无法得到一帧完整或正 确的信息,这时需要复位接收程序的入口条件并退由接收程序,而不是一直等待信号的来临。不然无法进行下次接收甚至会影响到其它程序的执行。7) 通 过对系统数据结构的划分与组织的改进,以及对程序算法的优化来提高

9、空间效率。这种方式是解决软件空间效率的根本办法。8) 保证循环体内的工作量最小化。应仔细考虑循环体内的语句是否可以放在循环体之外,使循环体内工作量最小,从而提高程序的执行效率。9) 在多重循环中,应将最忙的循环放在最内层。10) 中断处理程序应尽量愆。有效的作法为:在中断中进行标记,在主程序 中进行处理。但一些实时性要求较蒿的程序例外。此外,进入中断时应该保存涉及到的变量和寄存器。11) 看 门狗的正确使用。看门狗主要用于微控制器死机时的时间溢出复位,需要程序适时清除。正确的处理方式为:整个系统程序中尽量保证只有一处清看 门狗位置,而且应处在主循环的主干位置。切记不可在定时中断中清狗,因为微控

10、制器有时只是在主循环中死掉。(所有AC 电源的应用程序都必须强迫加入看 门狗选项尤其是条件式的看门狗有利于系统发生异常后的重启动)二排版风格1、程序采用缩进风格编写,缩进为 1个Tab键,1个Tab键定义为8个空格位。2 、 程序中的标号要从第一列开始书写。以开头的预编译命令也要从第一列 开始书写,其他预编译命令采用缩进风格编写。例如:1) 以 开头的预编译命令要从第一列开始书写,其他预编译命令采用缩 进风格书写。?LIST ;从第一列开始书写INCLUDESTD macro l.h.CONSTNUMBER EQU 55h.DATAwkOO DS 1.CODEORG Oh2) 标号要从第一列开

11、始书写。main:;从第一列开始? ?jmp main; 缩进8个空格位3) 变量或常量的定义采用缩进风格。例如:.DATAkeybuf DS 1.CONSTNUMBER EQU 84)定义变量或常量时, 变量色或常量名与命令符之间使用2个Tab键(相 当于16个空格位)分开,命令符与后面的操作数用1个Tab键(相当于8个空格 位)分开。例如:keybuf DS 1NUMBER EQU 55h5) 操作码与操作数之间用 1 个 Tab 键(相当于 8 个空格位)分开。例如:ORG 80hmov a,NUMBERtable:DW I234h6) ) 程序中两个操作数之间用一个“,”作为分隔符,“

12、 # ”号与立即数之 间不需要分隔符。例如:Mov a,#55h7) 标号要单独占一行。8) 相对独立的程序块之间必须加空行。例如:ORG10hINCLUDE sys.asmINCLUDE i nt. asmINCLUDEkey. asm9)程序语句后面若有注释,所有的注释要遵守上下对齐的原则例如:bOniovl,#7fhmova.#00应该书写为:bOmovL#7fhmova,#00;use dpOx(hl) pointer;set pointer = 007fli;use dpOx(hl) pointer;set pointer = 007fli三、程序可读性与可维护性1?程序中的语句、标

13、号、变量使用小写英文字母,常量与预编译命令使用大写英文字母,以便和一般的语句进行区分。例如:NUMBER EQU 55h.DATAaccbuf DS 1.CODEmova,#NUMBER2?表示不同进制的立即数,要在立即数后面加上不同的进制符号。例如:mov久 #00100011bmova, #23h不建议使用:mova,#Ox233?一般情况下?变量和常量要分开定义.不要混在一起。变量在 “.DATA段 中定义,采用命令符“D6,常量在” .CONST ”段中定义,采用命令符“EQU。例如: .CONSTNUMBER.DATAEQU10AccbufDS14.程序中不使用未定义或意义不明确的常

14、量G例如:下面的赋值方法要避免使用:? ?mova,#3在常量中做定义movr,a? ?建议采用如下赋值方法:.CONSTNUMBEREQU? ?.CODE;不要直接使用意义不明确的数字3;循环次数mova,#NUMBERmovr,a5?整个程序的结尾要以“ ENDP语句结束。6?当一段代码在程序中有多个地方使用时,建议采用子程序调用或宏命令的方式代。如此,对该代码段的修改就可在一处完成,增强代码的可维护性。7.程序中关系较为密切的子程序代码尽可能相邻。来替&避免程序中的垃圾代码,预留代码应以注释的方式由现。程序中的垃圾代码不 外的空间,而且还可能影响到程序的功能与性能,很可能给程序的测试、

15、必要的麻烦。仅占用额维护等造成不四.注释1 ?程序应该包括两个部分注释,说明部分和语句注释般情况下,源程序有效注释NUMBER量必须在 30%以上。EQU102?说明部分成日简要说明,1)源文件说明部分位于每个源文件的最前面,主要描述:文件名、作者、生 期、联络方式、功能描述、版本号、软硬件平台、版权说明、修改记录等的 以英文书写。例如:;文件名作者旧期;邮箱地址;功能描述;版本号;软硬件平台File name:Author:Date:Email:Description:Version:Hardware &IDECopyright (C), SONIX TECHNOLOGY Co., Ltd.

16、History:;修改记录.设计原算法简述、使用2)子程序说明部分位于每个子程序的最前面,主要描述:子程序名称、功能 理、所用变量、入口条件、由信息、调用模块、堆栈层数、影响资源、 说明和修改记录等。例如:Subroutine:Description:Principium:Calls:Variables:Input:Output:Stack:;子程序名称 ;子程序功能的描述 ;程序设计原理 ;被本子程序调用的子程序清单 ;本子程序中所用到的临时变量 ;子程序调用所需要基本参数的说明;子程序调用后运算结果的说明 ;占用的堆栈层数History:; 修改记录5AC /3?边写代码边注释,修改代码的

17、同时修改相应注释. 以保证注释与代码的一致性。不再有用的注释要删除。4?要避免在注释中使用缩写,特别是非常用缩写。5?程序在必要的地方必须有注释. 注释要准确、易懂、简洁。注释要有意义.如果有需要,还要详细描述相关含义。例如 :以下是无意义的注释mov a,#5把 5 赋给 accmov wk00,a;把 acc赋给 wkOO应该如下注释:mov a,#5 ;设置循环次数为 5次mov wk00,a 6?注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)的相邻位置. 不可放在下方,如放于上方则需与其上面的代码用空行隔 开。例如 :clr wkOO ;Check Rea

18、d index = FiFo Limit cmprs a,r;Is Read index = LimitJmp f7?注释格式尽量统一,对多行注释建议使用“庐*/ ,对单行的注释建议使用“ A“ ; ”。8?注释应考虑程序易读及外观排版因素,语言尽量统一。对不能进行准确英文表达的建议使用中文。9?对有含义的变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释,说明其含义。五、变量命名规则写命1 ?变量的名称要采用有意义的英文单词小写缩写。可以采用以下几种方式进行缩名:1)去掉所有不在词头的元音字母。如screen可以简写为scrn。2) 使用每个单词的头几个字母。如 channela

19、ctivation 可以简写为chanactivo3) 使用变量名中具有典型意义的单词。如 numberofcycle 可以简写为cyclenumbero4) 去掉无用的单词后缀ing 、 ed等。如 pagingrequest可以简写为 pagreqo5) ) 尽量使用标准或惯用的缩写形式,缩写应该保持一致性。如 serialperipheralinterface 可以简写为 spio6) 部门已经完成函式的变量名称,如果没有特别原因,发展人员延续使用以 增加可读性2. 在定义部分要加入注释来说明变量的含义。3?变量的定义要在 .DATA段中。4. 变量标识符的长度不超过16 个字符。5?序

20、会用到起码三种变量1) 全局变量名称前面不加任何修饰。2) 局部变量利用 wkOO , wkOl ? .wkOn 来表示,每个独立程序里面用到的 Local var.可有效节省RAM。3)中断局部变量中断里面用的Interrupt local var.利用IwkOO, IwkOl以作为 区隔(注意中断使用的变量必定要小心的跟主程序区隔开,不然影响系统稳定性相 当大)。 例如:.DATA? ?accbuf ds 1 ;全局变量Lnumber ds6?位定义。程序多处会经常对寄存器的某一位进行操作,可以在变量定义时对需要用到的位进行定义,建议名称以“f_ 开头。7?临时工作寄存器的定义。程序中经常

21、需要用到一些临时存储数据的寄存器,我们称之为临时工作寄存器,这些临时工作寄存器的命名方法为“wk加上一个 二位数字组成,这个数字可以从“0叫始随着需要定义的临时工作寄存器的数量的增加而增加。需要特别说明的是,临时工作寄存器的使用可以大量节省RAM空间,但是要注意相应的生命周期,必须在子程序退由之前,将空间释放以便其它子程序使用。&在中断处理程序中用到的寄存器,为了和一般的临时工作寄存器作以区分,可以在寄存器前面加英文字母 “i来命名。在使用时需要加以注意,不要和主程序中的变量复用。例如:.DATA? ?wkOOds1wkOlds1wk02ds1iwkOOds1;中断中要用到的临时工作寄存器iw

22、kOlds1;中断中要用到的临时工作寄存器.CODEMov a,rMov wkOO.a a,wk01 r,amovmov六、常量命名规则? ?1 ?常量的名称要采用有意义的英文单词大写缩写2?常量要定义在“ .CONS股中。3?在定义部分要加入注释来说明常量含义。4?量标识符的长度不超过16个字符5?系统寄存器中常用到的某些位可以再额外进行定义,但要有意义:P.keyl EQU P1.0; P_打头表示为 Port定义Pm_keyl EQU Plm.O :Pm_打头表示为 Port方向定义 ? ? ?七 . 标号命名规则1 ?标号的名称要采用有意义的英文单词小写缩写。2?子程序标号定义。在同一

23、个子程序中,所有的标号应该有规律可寻。建议第一个标号为子程序名,下面所用到的标号用子程序名添加数字表示,从而便于今后 程序的添加和修改。数字尽量使用两位数,在子程序的退出位置,数字一般为 90” 。例如:在一段按褪扫描程序中,如下的标号是不可取的。Label:LabelOKLabelFailLabelQuitLabelfun:LabelEnd:Ret(设计师要花许多精神命名label,同肘不容易看由子程序的结构关西,所以建议在 子程序里面别在花精神命名,都用号码表示)(详细的动作都用注解来说明)应该改 为: ?* 木 * 木木 * 木 木 * 木 木 * 木 木 * 木 木 * 木;Sub-r

24、outine , Name : label ?Label:If the condition fail then go to Label90 ;program begin hereLabel 10:; 注解都写在这里Label20: 最后结尾结束的 label 都用 90 当做结尾 : 有助于程序的阅读Label90:Ret 3?为了使程序的结构更加清晰,子程序的命名要尽量能显示由相互间的调用关系。由main主循环中直接调用的程序,要以“mnj乍为标号的开头,下面仅 列由一些常用的子程序名称,其它类似情况可同样处理。mn_app;系统应用程序mnjntgnd;中断与主程序之间的界面子程序mn_k

25、ey;按键扫描子程序mn_1cd;LCD显示子程序mn_1ed;LED显示子程序mn_tone;声音处理子程序mn_epp;EEPROM 读写操作mn_bio;基本输入/输由控制mn_adc:ADC输入及处理mn_debug:debug 处理程序4 ?短序的几个常用入口地址命名如下:自巾入reset中断入口:isr主程序入口 : main例如:二org8jmpsr;ISR (InternjptServiceRoutine)org10;有效程序开始地址reset:?;进入主程序前的一些准备工作(预处理)premain:? ?; 主程序循环圈main:? ?Jmp main、 文件名的命名规则及文

26、件分割1?在一个项目中要包括两种文件:源文件和头文件。源文件是程序体,扩展名为“.asm ”,头文件包括了变量、常量、宏命令的定义,扩展名为”.inc 。”2?头文件的命名头文件用三个不同的文件来分别定义常量、变量、宏命令,其命名方法如下: 常量定义文件:xxx_equ.inc变量定义文件:xxx_ram.inc宏命令定义文件: xxx_macro.inc其中,xxx 表示 I 页目的名称。例如:作一个电话机的完整程序,头文件可如下定义:常量定义文件: phone_equ.inc变量定义文件: phone_ram.inc宏命令定义文件: phone_macro.inc3?源文件分为主文件、子文

27、件。主文件包括了项目的主程序,它描述了芯片信息、CODEOPTION 信息及项目包含的其它子文件模块。子文件是由各个子程序模块组成,功能相近的子程序要放在一个文件中,文件名可以用“项目名+模块功能的缩写+扩展名”表示。下面列举一些常用的文件名主程序文件:xxx_main.asm常用的子文件定义:中断服务程序模块: xxx_int.asm进程处理模块:xxx_pro.asm系统处理程序:xxx_sys.asm按键处理模块:xxx_key.asmLCD 显示模块:xxx_lcd.asm其中,XXX表示项目的名称。一九、标准程序模块常用功能模块尽量采用附件提供的标准程序,如果无法使用标准的程序模块,

28、那么所编写的程序一定要符合规范要求。所提供的标准程序如下,详细的源代码在附录中。1. nm. _key2. mn. jnulkey3. mn. Jone4. mn. Jed5. mn. _i2c6. mn. _sio7. mn. _lwire8. inn. _uart9. wr_ fifo10. rd_ fifo11. ram2ram12. ron i2ram13. mat th;单键扫描子程序;多雒处理子程序;声音处理子程序;LCD显示子程序;I2C操作子程序;SIO操作子程序;单总线操作子程序:UART子程序;写 FIFO;读 FIFO:RAM至U RAM的数据传递:ROM到RAM的数据传

29、递;基本运算程序实例说明1 ?初始化1)当程序上电复位时,一个完整的用户寄存器初始化或清零动作是非常重要 否则容易造成程序执行的不确定性。例如:pre_clrRAM:bOmovy,#0;清 RAM bankObOmovz,#48Clryzdeemszjmpbclryzret2)系统寄存器必须进行初始化,比如说I/O 方向和输由电平等。需要特是输生的初女台化必须按照下列顺序来处理:(1)设定相应I/O 口输由高低电平(2)将相应I/O 为输由口如此可确保MCU的I/O 口从输入模式转为时不会有脉冲的存在。而在I/O 口控制频繁变化(如通信)时更要引 起注意。例如:(3) mov a,# 1111

30、1111b别说明的输生模式;如果pl.O和pl原来为输入高电平,当直接切换为输生方式时会有高电平脉冲的输出,而这不是所希望的。bOmovp2m,amov比# 11111100bbOmovp2,amova.#00001100bbOmovp2,a;这样处理pl.O和pl就避免了离电平脉冲的输由mova,#l 1111111b;bOmovp2m,a开机时后 IO toggle 的作法:利用暂时没有用到的IO做toggle可有效观察以下几点1) 系统是否正常开机2)是否发生 reset or watchdog reset现象3) 程 序是否重头运行观察IO toggle pulse width可以了解

31、Internal RC频率的准确性或是协助调整外部RC数值以上方法可以有效协助量产生产问题开机时后 Test Mode 的作法:Test Mode必须在开机时后按下莫些组合按键同时通过de-bounce才可进入test mode2?按键处理1) 般来说 key 的处理是所有程序的基础教科书里面所教导的 key 处理观念 大多以 delay 循环与多次检查来处理弹跳事件,但是此种方法由于导入delay 循 环大大降低系统实时性,而大多使用者都没有警觉此何题依然延续此观念设计key scan and de-bounce技巧,此份文件详细叙述key 处理观念。2) 家电产品中经常用到抗干扰的测试EF

32、T ,会从电源端打入噪声测试系统抗噪声能力,如果key处理不好会有key误动作产生,一般使用者会在key scan地 方加入电容以减低此问题的产生,但是此方法还是无法完全避免此同题同时还增加硬件成本,这里提由的de-bounce观念可以完全解决此问题。3) 按 键处理很多程序员都合将系统的程序设计与 key 程序结合没有分开结构 , 这造 成很多程序就以 key 程序变成程序主体来运行,这里提出将key 动作得出的 keycode 到fifo (first in first outa中使得AP系统得以在有空闲的时候才处理 key code动作,程序架构自 然形成。4)一般来说key处理都只侦测

33、key down,但是在莫些系统确有 key down and keyup的 要求,这方面可以透过 key in buffer的储存new/old buffer XOR比对得 至 key event,更深一层 的技巧侦测多按键处理更是需要利用 new/old buffer XOR 来处理合理的按键处理一般包括 按键扫描、按键弹跳处理、按键输出转换等环节。例如:mn_key:call keyin ;读取按键输入将资料储存在 keyinbuf 里面Call keychk ; 按雒弹跳处理Call keycvt ; 弹跳处理后,将按键扫描码转换储存到 FIFO 里面 !keyin-按褪扫描,其主要负

34、责将外部按键信息读入到内部buffei?中。常用的按雒-般包括:直接按雒、 M*N 矩阵式扫描按键、三角形按键、扩充按键、 按褪与其它周边共享 I/O 脚位等,部分场合还要考虑睡眠和按键的唤醒功能。下 面进行分别说明:1 ) 直接按键最简单的按键方式,通常作法利用 MCU 里面的 pull-up 电阻上拉,外面按键落地,平时没有按键的时候,MCU input端口读到Hi,按键按下时候读到Low,如下图所示:2 ) M*N 矩阵式扫描按键最典型的按键扫描方式,有分Single key , multi-key 扫描。单按键扫描:一个时间只允许一个按键动作同时也只读取一个按雒。多按键扫描:一个时间允

35、许一个以上的key 按下,但是只读取最新按下的 按键。扫描注意事项:一般来说扫描的作法有Output port and input port 配合Output port 1110110110110111依序送出 0信号让 input port 读取,但此时可能发生两件冲突事件需要注意如果用output 0 and output 1的组合来送由 scan pattern当客户同时按下同一排两组按褪的时候,会有短路现象、传统作法是加入二极管diode 来保护,现在单片机的作法则是利用 output d input pull-up R 的方式来达成。见图面说明但是当使用 Input pull-up

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

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

38、00mS ,比如说 key 按下后 Hi 变成Low这时候程序侦测到输入有异动便开启检查时间机制,当程 序连续检查100ms都发现 Low没有改变的时候便发生 key event,此时才有按 褪发生。10 ) 关于de-bounce 的程序验证可透过修改弹跳时间测试,比如说故意将弹跳时间改lsec.观察在一秒内的按键动作是否都不成立,只有按雒持续达一秒以上才有动作产生,确认后再将弹跳时间改回。?keycvt - - 按键输出转换,其主要负责将确认的按褪信息进行转换和存储。1) KeyCVT主要工作将经过 de-bounce的keybuffer跟之前所得到的 key相 比对, 看看新的key e

39、vent为何,转换由来后存储到 keybuffer or keyfifo甚至直接进 入apfifo2)将key code储存到fifo中是一个非常重要的观念,这里展示由Key处理是一个独立的物件程序,他的运行跟其他程序都没有相关,唯一对外的界面inteface就是万fo。而key的处理方式端看当时系统的status还有AP设计的流 程才做由相对应的工作Task。3?计时系统计时系统一般包括定时器初始化和定时设置及处理两部分。1) 定时器初始化部分又包括:(1) 定时器控制寄存器的设定(2) 相关用户寄存器的设定(3) 定时时间的初始化2) 定时设置及处理:由于系统里面会经常在不同的时间点执行不

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

41、10ms的时基,再利用计算的方法作由100ms、 1000ms 的定时。(2)累加法:此方法适用于对时间没有特别要求的场合。下面以四位位元依次累加来说明做法: 假设变量 timeslot 以每 5ms 的时间来累加:timeslot= 0 0 0btimeslot= 0 0 1b ;bitO=l, 5ms 动作timeslot= 0 10b ;bitl=l, 产牛 10ms flagtimeslot= 0 1 1 b ;bitO=l, 执行 5ms 动作,此时不再检查 bitltimeslot= 10 0b ;bit2=l, 产生 20ms flagtimeslot= 10 1b ;bitO=

42、l, 执行 5ms 动作timeslot= 110b ;bitl = l, 执行 10ms 动作timeslot= 111b ;bitO=l, 执行 20ms 动作timeslot= 0 0 0b ; 没有动作由上面例子的规律来看,一个时间只会有一个时间任务产生,从而不会有太多 的肘间单位。4?中断和主程序的处理1) Push and Po网作要确实完整1. 请参照不同母体的建议作法2) 透过 mnintgnd 副程序来操作i. Interrupt中产生的动作可以在中断中直接处理(又急又准的需求)约mS等级的动作如tone output, RFTX,有些计时参数的递减等ii. 不需要在中断处理

43、,设立旗标flag等待在主程序中检查处理(mnintgnd)约100ms以上的动作:如 0.5S计时动作,奥些timeout命令需要AP层处理iii. 需要了解 interrupt 暂用系统多少时间,可以在进入中断时候做一个 output H离开中段时候作个output L 来观察,当然这方面可以利用假指令(If Debug = 1 )来设置,当系统完成后将此output H/L 动作关闭,进入中断所占用 的时间越短越好,原则是只要能够在主程序处理的动作都在中断里面设定flag等到主程序(mnintgnd)处理,所以中断/主程序的比例越低越好(这里也可以透过主程序循环的toggle来观察主循环

44、的绕圈时间)o5. EEPROM 的读写操作1) EEPROM 的使用有以下几个问题要注意i. EEPROM write time 需要一些时间,所有有两种作法,a) write , delay , write 不建议使用除非写入资料很少 , 暂用系统时间少2) write, check busy, write 超过10 byte data 以上ii. 透过 buffer read/writeiii. 24 series EEP要特别注意ACK讯号(绝大部份的设计者都失收在ACK信号的处理,造成系统稳定性不佳),同时上拉电阻的设置对于24series也是很重 要的iv.品牌较差的EEPROM普

45、遍存在datalost的同题当有蒿电压脉冲的时候 (尤 其开机瞬 间)很容易将内部资料清除,所以这方面要注意,当然开机那瞬间MCU对于EEP的output设定也是很重要的很容易在开机瞬间误写错误信息给EEPO6. Tone 的处理1) 可能 MCU 产生的tone 有下列几种1. 配合按键动作的 Key tone 约 1 OOmS single toneoii?电话响铃音来电转接音保留音。iii ?标准音乐Do-Re-Mi 等。iv. 警示音error toneo7. Display 的处理1) LCD Display 程序的唯一性尤其LCM 模块使用更是重要i.平时LCD都是透过LCD Bu

46、ffer(RAM)来作为interface,当AP层面有更动 LCD资料并 不直接对 LCM 硬件操作,而是针对RAM Buffer 更动资料同时设立 LCDREQ flag oii. MNLCD 里面发现 LCDREQ=1 时候才进入 MNLCD 程序运行显示更新, 此 法可有效改善效率与显示的稳定性。iii. ?相同如果非LCM 的操作有些人认为可以直接更改 LCD RAM 数值直接 更新显示,这也存在相当大的风险,最好的方式还式透过另外一组Buffer 来做 缓冲iv. 松翰的 ICE 发展系统有提供软件 LCD 模拟器给客户使用当客户的 LCD还没有实体,可以透过模拟器直接在PC画面上

47、显示,配合程序开发非常方便。8. Telecomm 的处理1) )Sync (with clock) and Async.2) Sync.类似 SPI 信号 data in, data out, and clock3) Async.本身没有Clock时钟信号一般来说有以下几个组成i. Bit sync 位元同步ii. Frame sync特定的 frame code来锁定 frame data 开始iii. Data length资料长度来收集资料iv. Checksum最后靠check sum来验证资料的正确性4) 般来说同步或异步通信程序都是TX 容易 /RX 译码困难i .拍码TX只需要

48、考虑大笔资料拍码的buffer and pointer影响程序实时性不大。ii ?接收 RX 部分就有点困难需要有较多的技巧考量尤其异步通信更是麻烦。5) RF 通信里面还要考虑拍码调变的方式某些硬件电路只能利用曼彻斯特编码法来拍码以去除 DC 分量9. Main Loop 的处理1)进入主程序循环前要有个前处理”(Pre.Main)来将基本参数设置好才进入主循环2) 看门狗 / 条件式看门狗能够放在主循环内,可以确保主循环有效的运行,当主循环运行失败,“看门狗”自然发生Reset动作3) 主循环的绕圈时间 ( 实时性系统反应力 )i?牵涉到系统的实时tt(real-time)所以绕圈时间越短

49、越好建议在5mS以内,利用IOtoggle来观察主循环绕圈时间,如果程序里面有多余的IO就可以留下 此IO供日后生产测试观察使用 , 如果没有多余在程序稳定后可以将此观察的 IO 移除。ii ?主循环绕圈时间也会受到中断的影响 , 由于中断的执行等级高于主循环所 以当中断运行时间越长自然主循环的运行时间也越长,所以中断里面占用时间必 须稳定的控制,不然影响系统实时性/ 反应性很大个子iii ?主循环里面每一个物件都要设计良好才能确保一个整体的绕圈时间,每一程序物件进入前,都必须透过旗标判断是否需要执行,如 MNLCD 程序进 入后立即检查是否 lcdrcq=l , 如果在此绕圈动作中没有任何l

50、ed 资料更新,那也 就不用浪费时间进入ledsub-routine。启外如EEP储存动作由于会有 write data busy问题所以也必定要将资料分批写 入,不然程序会停留在write data循环里面 影响当时整体实时性。10. Watchdog 的处理I ) Watchdog 功能说明2) Watchdog 方块图说明3) 条 件式清除 watchdog4) 使 用地方注意事项II .Application 的处理1) 透过 APFIFO 读取 APCodei. APFIFO越大越能够了解系统发生过的事件(event)有助于system debug只 要在ICE上面stop运行观察F

51、IFO buffe r里面的数值就可以知道哪些动作进入FIFO发生过哪些事情ii. 同时系统里面有keybuffer , led buffer, tx buffer , rx buffer , eeprom buffer ,tone buffer 利用 FIFO and Buffer 的观察,软件系统的除错性自然产生2) APCode 的编排设计i?由于程序最后可以透过PC跳转所以APcode的数值设计就非常重要。3) 根 据不同的status 可以展开所有动作有两次跳转动作设计出所有的命令4) 程 序最后可达到表格化设计的境界利用跳转表格将程序的流程具体化12. Power down and

52、 wakeup1) 省电的考量(系统耗电应该低于 1UA/5V )i. Input pin : 内部 Pull-up resistor 或是外部设定皆可ii. Outputiii. Power down 失收的情形wake-up pin 没有设置好, power down 指令下达后 马上就唤醒 wake-up ,使用者会误以为无法 power donwiv. Power down进入Sleep mode软件要做一个前处理pre_sleep程序1) 设立所有 input and output pin2) Turn off ADC 还有其他外围3) 设立 wake-up 条件 P1W or Ti

53、mer green wake-up mode4) Wakeupi. Reset wakeup但是程序重头开始运行有时候多CPU系统里面或者在单按褪状态的时候,利用按键 resetii. Wakeup pin 唤醒 如 Pl, 有分 falling edge wake-up and event change wake-up 13.Slow mode and green mode RTC 的处理1) Slow mode低速运行此模式利用MCU里面内建的32Khz RC震荡i. IC normal mode 进入 slow mode 主要目的在于省电 (slow inode 15uA/3V)ii.

54、Slow inode 中 IC 还是开启所有周边运行利用低速运彳亍来减低耗电iii. Normal进入Slow mode并不需要太特别的设定主要还是考量IO与周边 耗电的设置iv. Slow mode 回到 Normal inode 就要注意高速时间起振delay stable 问题2) Turn on the External/High X tai3) Wait the External x , tai Stable这是必须做的动作否则会有不稳定的现彖4) Switch back the normal mode5)一般来说delay时间约在mS等级建议设计270ms,最好用示波器观察起振时间

55、再决定delay time , 不同的 x tai 会有不同的起振稳定时间14.ADC 周边的处理l)DNLand INL 的观念i. Missing Code 是 ADC 比较通常的问题ii. DNL 可以反映出 missing code 的特质iii. INL 反映出线性度的性能2) 平 均化处理1 .在ADC的应用这是非常重要的AC 应用里面由于电源会有噪声产生或是 EFT 环境,此时ADC 可能读到瞬 间噪声,当作某些关键数值判断(如充电器充电电压判断)很有可能提早停止动 作所以必须透过 数值运算后再进行判断3) 读取 ADC 数值等待时刻不可去作OUPUT 动作,由于微小的 outp

56、ut 动作都 会引起 VDD的噪声此时adc得到数值可能不稳定建议 ADC读起时候利用回圈 等待(配合timeout机制 保护)4) ADC 参考电压设计5) Power down 时候必须注意的事项i. Turn off the ADC hardwareii. 注意 ADC channel 输入信号的准位ADC port 里面只有软件设定enable 那一 pin 高阻抗其他的脚位都是输入, 如果有信号位于半电压1/2 VDD 时候会有输入漏电流产生 , 可以硬件解决同时 松翰某些新款母体都具备有隔离暂存器可以设定,见以下范例15. 状态迁移的技巧1) 长秒数ON/OFF 切换左图标明如何运

57、用 state 来做出长秒数的开关动作State = 0;关闭所有动作开启此 on/off 动作必须设定以下指令Time = 0;时间重头开始State = 1;程序从状态一开始关的动接着程序会自动在两个状态里面切换,切换后设定时间的长度,同时执行相作?最后设定下一个状态的指标state . 右图标明程序配合timer 自动递减 , 当 time=0 时候代表整个动作自动停止。Time 0 的时候此程序会自动递减如果状态较多的情况每一个状态里面用 State = state + 1,最后一个状态里面直接设定State =初始值,当初始值=0 就是单次执行这状态迁移,如果初始值=1 那这状态迁移就会不断的循环!关闭此程序的方式也非常简单,就是设定State = 0 o一般设计人员最常用错误方式,就是用delay循环方式来完成,此种方式大大降低程序的灵活性与实时性! 务必要记住程序尽量不使用 delay loop !

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!