單片機(jī)實(shí)現(xiàn)模塊化編程:思維+實(shí)例+系統(tǒng)教程(實(shí)用程度令人發(fā)指)
單片機(jī)怎么實(shí)現(xiàn)模塊化編程?思維+實(shí)例+系統(tǒng)教程(實(shí)用程度令人發(fā)指)
\\\插播一條:文章末尾有驚喜喲~///
在剛初始從事研發(fā)工作的那幾年,我主要做單片機(jī)軟件開發(fā)的工作,雖然功能吧都能實(shí)現(xiàn),但是總覺得缺少了點(diǎn)什么。
總是感覺自己寫的程序不夠完美,移植性不夠好,功能也不好擴(kuò)展,每次寫完程序最怕的就是客戶要改功能。
假如程序架構(gòu)寫的不好,一改會(huì)影響到很多功能,哪怕原來是燈每秒閃1次,改成每秒閃3次這種看起來很簡略的功能。
對于程序提升這塊,假如沒有人一個(gè)厲害的人帶你,真的很難提升。
主要難在兩個(gè)方面:
1.你的認(rèn)知
有時(shí)候不是你做了越久,寫的代碼就越好,由于你一直在自己的認(rèn)知水平內(nèi)寫代碼。
假如不提升你的認(rèn)知,代碼自然也不會(huì)提升,所以想要提升代碼水平,首先要提升的是你的認(rèn)知。
2.找不到好的教程或?qū)嵗?/span>
終有一天你要做中大型項(xiàng)目標(biāo)時(shí)候就會(huì)發(fā)現(xiàn),自己的代碼水平和思維要提升了,但是找不到好的教程和方法。
這塊最好的提升辦法就是去找那些大佬寫的代碼,假如說公司比較資深的工程師,有事沒事多請他們吃吃飯,喝喝水搞好點(diǎn)關(guān)系。
一般來說都愿意把自己的代碼分享給你,然后你再看他們寫的代碼,有哪些是值得進(jìn)修的,最重要的是他們實(shí)現(xiàn)功能的思維,然后用代碼怎么去實(shí)現(xiàn)?
假如別人不愿意分享給你,那能夠去挖一下現(xiàn)成穩(wěn)定的,假如說STM32的規(guī)范庫,藍(lán)牙協(xié)議棧等等。
我當(dāng)初的提升方法是在某個(gè)公司做產(chǎn)品的時(shí)候,正好有個(gè)工程師離任了,老大把他寫的代碼給我來維護(hù)。
當(dāng)我第一眼看到他代碼的時(shí)候,覺得寫的很復(fù)雜,感覺在秀技術(shù),完全沒必要這樣去寫。
然后我用他的代碼拿配套的產(chǎn)品來測試,發(fā)現(xiàn)很穩(wěn)定,我嘗試依照我的思維改了以后,就出現(xiàn)了各種問題。
慢慢地,鉆研越深,我越是深刻體會(huì)這位工程師為什么要那樣去寫,自己跟他完全不是一個(gè)級別的。
其實(shí)他的就是基于模塊化編程的思維去做的,當(dāng)時(shí)還沒吃透他的代碼,我是從那家公司離任后又過了幾年才徹底領(lǐng)悟他的代碼。
一、單片機(jī)模塊化編程怎么實(shí)現(xiàn)?
基于他的這種思維和實(shí)現(xiàn)方法,再聯(lián)合我自己多年經(jīng)歷,最后自己又創(chuàng)新了一個(gè)全新的架構(gòu)。
這個(gè)架構(gòu)分為2個(gè)局部:
1.內(nèi)核
內(nèi)核主要是用來管理任務(wù)的,除了管理還提供了一些隊(duì)列算法接口,方便產(chǎn)品使用。
2.模塊化編程思維
對于單片機(jī)產(chǎn)品開發(fā)來說,我覺得能夠分為3層:硬件層、中間層、應(yīng)用層。
我們先來說說中間層和應(yīng)用層。
中間層:就是不算是真正產(chǎn)品的功能代碼,假如說解析某種自定義協(xié)議,協(xié)議解析完以后的數(shù)據(jù)才是真正產(chǎn)品功能數(shù)據(jù)。
上圖就是對云平臺(tái)協(xié)議進(jìn)行解析,假如說解析wifi是否連接的命令的程序,相對應(yīng)用層來說,我們只須要”wifi已連接”和”wifi未連接”這兩個(gè)明確的數(shù)據(jù),而不做詳細(xì)解析程序。
這樣做最大的益處就是,假設(shè)我們換了一家云平臺(tái),應(yīng)用層的程序不用改,只須要改硬件層和中間層程序即可,不至于由于換了一家云平臺(tái),導(dǎo)致整個(gè)產(chǎn)品程序崩盤的問題。
一般來說,假如不是中大項(xiàng)目,我都直接省略中間層,畢竟代碼量大了,會(huì)浪費(fèi)批量出產(chǎn)時(shí)的時(shí)長,也浪費(fèi)單片機(jī)資源。
硬件層:我們重點(diǎn)來說說這個(gè),這個(gè)真的是很多人痛到不能再痛的痛點(diǎn),也是很多工作幾年工程師一直不知道怎么攻克的問題,專門是用來采集單片機(jī)輸寫數(shù)據(jù),或者控制硬件電路輸出。
采集信號(hào)有很多類型,假如說按鍵檢測、ADC檢測、紅外信號(hào)接管、串口接管、SPI、IIC等這種就是屬于硬件層輸寫數(shù)據(jù)。
我拿按鍵輸寫來舉例,先來看看原理圖:
電路非常簡略,就幾個(gè)按鍵串上電阻接了單片機(jī)引腳,按鍵按下就會(huì)有一個(gè)低電平的信號(hào)給到單片機(jī),單片機(jī)就是通過檢測對應(yīng)引腳是否低電平來判斷按鍵是否按下。
回到我們程序局部,按鍵檢測過程我就不講解了,我們的關(guān)鍵在于檢測到某個(gè)按鍵按下以后,要怎么把這個(gè)值傳給應(yīng)用層。
那我是使用了回調(diào)函數(shù)來傳遞的,這樣做的益處就是,真正能做到這個(gè)按鍵硬件層檢測代碼和應(yīng)用層產(chǎn)品程序獨(dú)立,增強(qiáng)移植性。
我們要使用按鍵功能的時(shí)候,直接注冊下按鍵回調(diào)函數(shù)就能夠了,如下圖:
這樣做還是比較靈敏的,不管是應(yīng)用層,還是中間層,哪里須要用到按鍵功能,我就在哪里調(diào)用注冊函數(shù)。
Ok,硬件層采集數(shù)據(jù)根本上都能夠用這種方式來處理,這樣就能做到真正的模塊化,這個(gè)也是我以前一直想不通鉆研了很久的處理方式。
下面說說控制硬件電路輸出,這種輸出型的沒什么好說的,不波及到硬件層的采集數(shù)據(jù)傳遞到應(yīng)用層,直接調(diào)用硬件層的控制接口就行了。
假如說我應(yīng)用層要控制一個(gè)LED燈點(diǎn)亮,代碼簡略到令人發(fā)指!
快捷入門STM32單片機(jī)-軟件篇
關(guān)于這個(gè)STM32的編程開發(fā)環(huán)境Keil,網(wǎng)上有太多相關(guān)的資源了,而且大都講解的非常詳細(xì).所以本篇文章沒意于深層細(xì)節(jié),只會(huì)提供我進(jìn)修時(shí)候的一些體會(huì),幫助你更好的掌握相關(guān)知識(shí).
1.規(guī)范外設(shè)庫(Standard Peripheral Library)
最初始,我們都是對單片機(jī)的寄存器直接進(jìn)行操作,這樣運(yùn)行速讀更快,但是代碼可讀性不高,編程艱難,規(guī)范外設(shè)庫的出現(xiàn)很好地攻克了這個(gè)問題.它提供了一系列的外設(shè)接口(其實(shí)就是封裝好的函數(shù))供我們使用.
1.1下載
在STM32官網(wǎng)下載規(guī)范外設(shè)庫,依據(jù)自己的單片機(jī)型號(hào)進(jìn)行選擇.
圖1.1選擇單片機(jī)型號(hào)
我的單片機(jī)是STM32F103,點(diǎn)擊F1就會(huì)出現(xiàn)下載界面
圖1.2下載規(guī)范外設(shè)庫
1.2文件分析
解壓后能夠看到以下文件:
圖1.3規(guī)范外設(shè)庫中的文件
其中,最最重要的文件是Libraries,里面包含了我們須要的所有庫函數(shù)文件.
Project文件夾中提供了例子和模板,最后一個(gè)HTML文件是幫助文檔,建議進(jìn)修過程中參照這兩個(gè)文檔而不是看其他亂七八糟的教程.
在Libraries中你須要關(guān)注這三個(gè)文件夾里面的文件:
Libraries\CMSIS\CM3\CoreSupport
Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
Libraries\STM32F10x_StdPeriph_Driver
其中,第一個(gè)是核心代碼,第二個(gè)是設(shè)備支持代碼,第三個(gè)是詳細(xì)的外設(shè)的使用.
2.開發(fā)環(huán)境
2.1軟件的名稱
最初始使用STM32個(gè)開發(fā)環(huán)境的時(shí)候,對它的名稱一直很迷惑,后來才發(fā)現(xiàn)Keil是公司的名稱,uversion是KEIL公司開發(fā)的一個(gè)集成開發(fā)環(huán)境(IDE)具有編譯、下載調(diào)試、模擬仿真的功能,MDK(Microcontroller Development Kit)的設(shè)備數(shù)據(jù)庫中有很多廠商的芯片,是專為微控制器開發(fā)的工具.
2.2下載安裝
開發(fā)軟件能夠在Keil的官網(wǎng)下載,選擇第一個(gè)MDK-Arm填寫好相應(yīng)的信息,然后依照提示安裝即可.
安裝成功后,你能夠在Help的下拉菜單中找到uVision Help,同樣的,你應(yīng)該盡量通過看這個(gè)幫助來進(jìn)修整個(gè)軟件的使用.
圖2.1 uVision Help
幫助文檔里詳細(xì)介紹了軟件的界面,文檔構(gòu)造,如何調(diào)試仿真等等所有你想知道的東西.
圖2.2幫助文檔
3.新建一個(gè)工程
剛初始進(jìn)修STM32的時(shí)候,我會(huì)覺得自己新建一個(gè)工程特別麻煩,所以愈加傾向于用別人的模板.但是這樣看似提高了效率,但是具有很大的弊端,由于你不知道別人的文件是如何編排布置的,這給日后的調(diào)試埋下了隱患.所以我建議大家從最初始就把這一關(guān)給攻克掉,每次都自己新建工程.
關(guān)于如何使用Keil新建工程,能夠看這篇文章.
在這里提幾個(gè)自認(rèn)為比較關(guān)鍵的點(diǎn):
?C/C++ define中兩個(gè)宏指令STM32F10X_HD,USE_STDPERIPH_DRIVER之間是逗號(hào)不是句號(hào),一定要看清楚
?C/C++ Include Path要加入每一個(gè)帶有.h文件的文件夾否則會(huì)報(bào)錯(cuò).
?Target中勾選Use MicroLIB,這樣才能夠正常使用print函數(shù)
?Output中勾選Create HEX File以便燒錄程序
4.編譯及調(diào)試
翻開mcuisp軟件,左下角選擇DTR的低電平復(fù)位,RTS高電平進(jìn)BootLoader,然后選擇Project\Objects中的.Hex文件即可燒錄程序,在單片機(jī)上觀看實(shí)驗(yàn)現(xiàn)象.
5.完畢語
關(guān)于單片機(jī)的硬件說明能夠看我之前寫的文章:
13個(gè)基于 STM32的典型項(xiàng)目設(shè)計(jì)實(shí)例
STM32單片機(jī)現(xiàn)已火遍大江南北,各種教程資料也是遍布各大網(wǎng)站論壇,可謂一抓一大把,但大局部都差不多。今天總結(jié)了幾篇電路城上關(guān)于 STM32的制作,不能說每篇都是典型,但都是在其他地方找?
匯編技術(shù)大...發(fā)表于嵌入式
STM32單片機(jī)的啟動(dòng)過程
STM32單片機(jī)的啟動(dòng)過程分享這篇文章,談一下 STM32啟動(dòng)流程。假如讀者朋友已經(jīng)有過匯編相關(guān)根底,能夠夠好了解本文內(nèi)容。匯編語言是比C語言更接近機(jī)器底層的編程語言,能讓我們更好的了解和?
一個(gè)發(fā)表于億配芯城商...
彩蛋:最近有同學(xué)跟我要單片機(jī)的資料,我特意花幾個(gè)月時(shí)間,總結(jié)了我10年產(chǎn)品研發(fā)經(jīng)驗(yàn),資料包幾乎覆蓋了C語言、單片機(jī)、模電數(shù)電、原理圖和PCB設(shè)計(jì)、單片機(jī)高級編程等等,非常適合初學(xué)者入門和進(jìn)階。除此以外,再含淚分享我壓箱底的22個(gè)熱門開源項(xiàng)目,包含源碼+原理圖+PCB+說明文檔,不是市面上打包賣的那種課程,我認(rèn)為教程多未必是好事,10年前我自學(xué)快,除了自身執(zhí)行力以外,還有就是教程少。不要害羞做伸手黨,等你一個(gè)小紅點(diǎn)。后期我也會(huì)組建一些純技術(shù)交流的小圈子,讓大家能認(rèn)識(shí)更多的大佬,有個(gè)好的圈子,你對行業(yè)的認(rèn)知一定是最前沿的。