您當前的位置:首頁 > 體育

微控制器專案開發經驗分享

作者:由 灰機 發表于 體育時間:2020-08-04

0:廢話

寫這個之前,我其實是想寫一篇關於定時器和中斷開發的文章的,主要原因是因為一塊微控制器的話,確實只需要瞭解《GPIO》、《timer》、《interrupt》,就可以基本完成簡單的開發了。但是吧,後來一想介紹這些的文章太多了,不同於GPIO的,這兩個東西值需要明白其實質的含義,就可以執行到各種晶片中。所以我也沒有必要再去寫這種文章了,因為在哪裡都可以獲取足夠的資料去了解清楚“定時器”和“中斷 ”的具體含義。所以我放棄這個,,把我現在正在為公司做的一款51晶片的專案分享一下。。希望共同學習。

1。專案簡介

最近公司為了瘋狂的節約成本,選用了一款51的晶片開發了一塊小的東西。(由於智慧財產權屬於公司,不去過多的說這個專案的事兒。我只是拿我寫的程式碼來分享一下,我在寫小專案的方式。如果你是覺得寫的很不咋的,就避免和我一樣的書寫方法,並同時告訴我,我也可以多學習;如果覺得還有點用,那我就很榮幸了。開發環境利用的kei4。由於專案比較小,所以檔案也不多,工程也不大。

微控制器專案開發經驗分享

工程結構

首先工程程式碼分為兩個部分,一個是系統資料夾:主要包含51的啟動檔案,我自己寫的main檔案,以及晶片公司提供的debug檔案,還有一個包含了晶片所有暫存器資訊的CH554的H檔案。。。。另外一個資料夾device主要就放的是外設的驅動,和API函式。還有一個就是儲存著map的資料夾,map檔案是由自己的ide工具生成的,記錄了編譯以後軟體的東西(比如每個c檔案的佔用大小,每個函式在記憶體的中的位置等等),對map檔案的閱讀方便對程式碼進行最佳化。版本資料夾就不用說了,用來記錄每一次對檔案的修改和維護資訊

2。晶片資料

然後說一下我們選用的這個51晶片。官方手冊是這樣描述著款晶片的。

微控制器專案開發經驗分享

這次程式碼中就使用的CH551這款增強型51微控制器。

2。1 軟體中部分外設在官方手冊的描述情況:

觸控按鍵:

用來輸出密碼,減低或者減少機械按鍵存在使用壽命導致按鍵失效的情況,同時節約機械按鍵的成本

微控制器專案開發經驗分享

定時器:

粗定時器(s),和細定時器(us)兩個定時器

微控制器專案開發經驗分享

看門狗:

保證程式執行的穩定性,避免宕機不可恢復(主要領導說這種晶片必須要養條狗,不然程式飛了都不知道咋辦,容易被投訴)。

軟體復位:

在特定情況下實現軟體復位

微控制器專案開發經驗分享

串列埠:

部分資訊列印輸出,代替軟體除錯功能。由於該晶片無法進入debug模式,所以只能藉助串列埠將程式執行的資訊打印出來,從而提高bug定位和修復的效率。如果沒有任何資訊,一旦程式出現錯誤,就只能用“猜”的方式去定位問題,這顯然不可取(

所以一般來說,利用一個串列埠輸出程式執行時的部分狀態資訊是非常有必要的)

微控制器專案開發經驗分享

中斷響應:

主要用來處理定時器的更新中斷和按鍵中斷

微控制器專案開發經驗分享

3。部分軟體

回到正戲,軟體部分。由於是為公司產品寫的,我只拿一部分來說

微控制器專案開發經驗分享

透過之前說的map檔案我們可以知道,這個晶片核心的使用情況大致是:

內部資料儲存區data(128 byte):使用 56 位元組;外部資料儲存器xdata(1K byte):使用 208 位元組;程式大小code(10K):使用 4K多(4589位元組)。

這些資訊也可以透過編譯輸出視窗看到。

3。1 配置檔案

微控制器專案開發經驗分享

除了晶片公司給的c、h檔案,位元組寫的比較重要的就是一個叫做configuration的檔案了,一般來說,我都會去建立一個這樣的檔案。如果軟體比較龐當,或者適配的型號很多,我也會選擇建立兩個檔案,一個用來配置模組,一個用來建立一些公用且常用的一些宏,資料型別等等。在configuration裡面的兩個宏,一個是軟體低通濾波器的使能開關,一個是看門狗的使能開關。如果想要使用某些裝置,只需要將對應的宏置1,如果想在軟體中禁用某個裝置,只需要置0。也就是說,每一個開關都能將軟體變成兩套的解決方案,一個是否使用低通濾波器過濾資料,一個能夠控制軟體中是否使用看門狗做軟體跑飛監控。關於這兩個宏後面也有說。

微控制器專案開發經驗分享

再比如這一段,我們選用了4G模組和wifi模組(esp8266)同時作為物聯方式,並且軟體適配了HZ這種硬體型號的4G模組。如果是另外的硬體版本,我可能就只有4G,並且使用EC200這種晶片,我將對應的宏配置為相應的0或者1時,就可以完成。我這樣的開發可以快速的適應硬體版本,針對不同型號的裝置就可以出不同的軟體。

在C程式開發時,列舉enum,共用union,結構體struct三種資料型別應該是滿天飛。這三種變數能讓基礎變數歸宿變得明確。如果你還在大量的使用基礎型別作為主要變數來使用的話,那可能需要轉換一下開發思路,或者擴充套件一下知識面了。正常情況下,一個int,一個char很難將某一種例項物件的所有資訊表達清楚。

微控制器專案開發經驗分享

我的程式碼習慣裡面,xx_t : 表示結構體,xx_e:列舉,xx_u 表示共用體。

對於最大的這個結構體device_t 儲存了和使用者相關的所有資訊了。這裡面需要分三個部分,一個是當前操作的按鍵響應,一個是操作以後裝置的響應,另外一個就是用於儲存在記憶體中的歷史資料(具有掉電保護功能)。

列舉列舉了裝置的4中工作狀態,分別是 ……;Module和config大致就是這樣了,能夠實現快速對裝置資訊掌握,軟體的配置、維護等。

3。2 main檔案

另外一個檔案是main。c,裡面儲存了main函式,這個main函式實現了裝置的所有功能。其實我並不喜歡在main裡面寫太多東西的,,我喜歡重新建立一個函式user_main()的函式去實現功能,而C標準的程式入口main函式,我一般用來做裝置的初始化初始化功能而已。但是由於這個晶片資源實在有限,為了避免壓棧過深,我就直接都在main裡面寫了。

微控制器專案開發經驗分享

在main。c檔案中,首先是標頭檔案的包含,檔案的說明,適配的硬體平臺,軟體版本號,建立的日期,建立的作者等資訊。如果你的軟體要對外開放,還應該加上免責,維權什麼的東西的。

微控制器專案開發經驗分享

比如說正點原子的。這一段一般是按照公司的要求寫的,沒得特別的講究。特別是長時間的對軟體維護的時候,這些東西至少可以提供一些資訊,避免時間一長,就完全不知道自己寫的是啥了。。

微控制器專案開發經驗分享

對於我自己寫的,在包含完所需要的標頭檔案之後,就定義了一個device_t的變數和對應的指標,用來儲存裝置與使用者互動的所有資訊。

然後就是其他的外部變數的申明。

關於 static的函式,主要是限制了該函式的使用範圍僅限於該檔案使用。這種也是對於程式碼安全性的考慮,在某些全域性變數和函式來說,如果不想提供給別人使用,都可以加上static來修飾,這樣別人也就無法訪問了,其他開發者看到了全域性的static變數也就知道這個變數或者這個函式不可以使用,這樣也就增加了程式碼的安全性了。然後就是裝置的初始化,包括系統時鐘,看門狗,led燈,timer,touchkey 和 裝置其他需要初始化的東西。

#if WATCHDOG_CONGIF

CH554WDTModeSelect

1

);

CH554WDTFeed

0

);

#endif

#if WATCHDOG_CONGIF

CH554WDTFeed

0

);

#endif

對於看門狗,一個WATCHDOG_CONGIF宏作為看門狗的開關,利用預編譯的方式選擇性的編譯看門狗,是的程式靈活的選擇是否該解決方案裡面要包含這個部件。就不用每次不用是,一行一行的打註釋,需要時又一行一行的取消註釋。

微控制器專案開發經驗分享

同理,在選擇低通濾波器時,也直接寫出了兩套解決方案,在使用濾波器,和不使用濾波器的兩種方案可以透過一個宏進行快速切換。具體宏的定義在上面有說。

微控制器專案開發經驗分享

這個是在passworderr工作模式下,控制led和蜂鳴器的程式。由於led的閃爍和蜂鳴器的鳴叫都是由定時器產生的完成的。也就是說cpu會出現大量的空閒時間。如果利用while(led響應未結束){繼續等待響應結束} – 如果利用這種等待方式去完成led個階段的閃爍,就會浪費大量的cpu,因為等待這段時間cpu什麼也幹不了,就一直檢測每一個閃爍階段是否結束。相當於程序中的阻塞等待。如果利用一個switch…case的方式,將各階段放在每個case裡面,每一個階段執行完成,將下一個階段的狀態表達清楚以後,就去跳到下一個階段利用if去判斷該階段是否結束,如果結束,又下一個階段,如果沒有結束,那就break,把程式碼執行一圈,繼續回到該case下判斷是否結束。這樣cpu就不會因為while而執行大量的空指令,並且還可以同時執行其他的操作。比如,我在這段led閃燈時間,我還需要檢測按鍵是否按下,如果我利用while來等待結束,那我就幹不了其他的事兒了。這樣設計思想和那種非阻塞等待很像。這種方式在微控制器的開發中很常見,只要某一個操作需要較長的時間,並且不由CPU一直控制操作步驟的,都可以這種方式來提高MCU的執行效率。

注意:由於每次進入都應該是上一次的值,所以這種switch中的變數就應該是靜態變數,不會每一次都是初始值。不然每次進入都是初始值,那就永遠跳不到後面的階段去了。

至此,我要分享的和能分享的也就這麼多了。

如果有什麼問題,可以多交流,有什麼不好的也可以多批評指教。

另外,如果你在為你這方面相關的畢業設計,課程設計苦惱,也可以聯絡。

標簽: 晶片  軟體  main  檔案  定時器