




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年創新創業能力評價考試試題及答案
- 2025年財務管理職業能力建設考試試題及答案
- 2025年創意寫作與文學鑒賞考試試卷及答案
- 2025達州中考數學真題
- 職業防護知識培訓
- 家鄉的變遷記事與議論文結合(10篇)
- 2025年蘭州危險運輸題庫答案
- 2025年石家莊危險品運輸從業資格考試題庫完整答案
- 關于未來的議論文7篇
- 2025年湖南出租車上崗證模擬考試0題
- 冠寓運營管理手冊正式版
- 2022年珠海市金灣區體育教師招聘筆試試題及答案
- GB/T 10610-2009產品幾何技術規范(GPS)表面結構輪廓法評定表面結構的規則和方法
- 畢業離校學生證遺失證明
- 智慧停車技術方案
- 土地整理質量評定表
- 【告知牌】某公司全套重大危險源告知牌(7頁)
- 中考數學復習專題二方程與不等式
- 牛津深圳版七年級下冊英語作文匯總
- 供應商管理庫存VMI的實施
- 公司“師帶徒”實施方案
評論
0/150
提交評論