陳梅芬,吳佳駿,王漢章
(廈門海洋職業(yè)技術(shù)學(xué)院,福建 廈門 361100)
近年來(lái),隨著信息技術(shù)的發(fā)展,特別是物聯(lián)網(wǎng)及人工智能技術(shù)的發(fā)展,對(duì)嵌入式從業(yè)人員的需求與日俱增。許多本科院校及職業(yè)院校都有開設(shè)《嵌入式程序設(shè)計(jì)》或相關(guān)課程[1]?!肚度胧匠绦蛟O(shè)計(jì)》是一門綜合性較強(qiáng)的課程,既需要硬件基礎(chǔ)知識(shí),也需要軟件基礎(chǔ)知識(shí)。隨著嵌入式技術(shù)的快速發(fā)展,高職的《嵌入式程序設(shè)計(jì)》的教學(xué)也顯現(xiàn)出一些問(wèn)題,特別是如何使得培養(yǎng)出來(lái)的學(xué)生更容易滿足嵌入式行業(yè)的需求,本文以矩陣鍵盤項(xiàng)目為例,說(shuō)明了項(xiàng)目式教學(xué)法在課程中的運(yùn)用。
在高職院校中,《嵌入式程序設(shè)計(jì)》一般是安排在大二階段進(jìn)行學(xué)習(xí),它的先修課程一般有《模擬電路》、《數(shù)字電路》、《單片機(jī)程序設(shè)計(jì)》或《C語(yǔ)言程序設(shè)計(jì)》,需要學(xué)生掌握的知識(shí)儲(chǔ)備較多,很多學(xué)生在先前課程的學(xué)習(xí)中并不都能很好地掌握這些先修課程,造成學(xué)生在學(xué)習(xí)《嵌入式程序設(shè)計(jì)》課程時(shí)有畏難情緒[2]。
嵌入式的技術(shù)發(fā)展很快,有時(shí)候就會(huì)出現(xiàn)學(xué)校課堂上講的知識(shí)點(diǎn)跟不上業(yè)界技術(shù)的發(fā)展。這就要求我們?cè)谑褂庙?xiàng)目教學(xué)法的時(shí)候,要盡量的從企業(yè)實(shí)際應(yīng)用的案例中提取有效的項(xiàng)目,并與嵌入式相關(guān)的知識(shí)點(diǎn)較好地融合。
可以將《嵌入式程序設(shè)計(jì)》的教學(xué)過(guò)程分為三個(gè)階段,基礎(chǔ)教學(xué)、進(jìn)階教學(xué)和綜合教學(xué)[3]。從幾年的教學(xué)經(jīng)驗(yàn)來(lái)看,學(xué)生經(jīng)常會(huì)在進(jìn)階教學(xué)的階段碰到困難,最大的困難是代碼已按照自己的思路寫出來(lái)了,在Keil軟件也編譯通過(guò),但HEX文件下載到開發(fā)板后就是工作不正常,此時(shí)卻找不到好的方法來(lái)解決問(wèn)題,也不知道程序運(yùn)行到哪里了。
鍵盤應(yīng)用是人機(jī)交互中最常用的方法之一,也是構(gòu)造各種實(shí)際的嵌入式應(yīng)用系統(tǒng)的基本元素。矩陣式鍵盤的接口是由行線與列線組成,按鍵位于行、列的交叉線上,這種方法的優(yōu)點(diǎn)相比較獨(dú)立鍵盤,可以節(jié)約IO資源,相對(duì)于專用芯片式鍵盤,可以節(jié)約成本,因而其在各種嵌入式系統(tǒng)中得到了廣泛的應(yīng)用[4-5]。矩陣鍵盤項(xiàng)目是《嵌入式程序設(shè)計(jì)》課程進(jìn)階教學(xué)中碰到的第一個(gè)較難的項(xiàng)目,順利地解決這個(gè)項(xiàng)目,對(duì)學(xué)生繼續(xù)學(xué)習(xí)本門課程也會(huì)有很大的幫助。
在業(yè)界,一個(gè)嵌入式系統(tǒng)的項(xiàng)目通常是由一個(gè)團(tuán)隊(duì)來(lái)完成的,通常按照?qǐng)D1的流程來(lái)實(shí)現(xiàn)。在啟動(dòng)一個(gè)嵌入式系統(tǒng)的項(xiàng)目后,先是要對(duì)項(xiàng)目的需求進(jìn)行分析,輸出系統(tǒng)的設(shè)計(jì)目標(biāo)文檔,接著要對(duì)設(shè)計(jì)目標(biāo)文檔進(jìn)行評(píng)審,評(píng)審?fù)ㄟ^(guò)后,團(tuán)隊(duì)成員分工合作,輸出軟硬件設(shè)計(jì)方案文檔,軟硬件設(shè)計(jì)方案文檔評(píng)審?fù)ㄟ^(guò)后,就可以開始具體的硬件實(shí)現(xiàn)與軟件設(shè)計(jì),最后是系統(tǒng)驗(yàn)證及驗(yàn)證覆蓋率的分析。
圖1 嵌入式系統(tǒng)的項(xiàng)目實(shí)現(xiàn)流程
由于在課程教學(xué)過(guò)程中,課程的學(xué)時(shí)有限以及學(xué)生專業(yè)知識(shí)水平與企業(yè)工程師專業(yè)知識(shí)水平的差距,我們通常會(huì)將企業(yè)項(xiàng)目實(shí)現(xiàn)流程進(jìn)行簡(jiǎn)化,以適應(yīng)教學(xué)需求。在教學(xué)過(guò)程中,項(xiàng)目的設(shè)計(jì)目標(biāo)通常是已經(jīng)確定好了,項(xiàng)目中所用的硬件電路也通常用的是開發(fā)板的既定的電路,所以在教學(xué)過(guò)程中的項(xiàng)目實(shí)現(xiàn)流程中,前兩步對(duì)設(shè)計(jì)的要求會(huì)少一些,更多的是去理解它們。在軟件設(shè)計(jì)知識(shí)儲(chǔ)備階段中,老師須幫助學(xué)生建立實(shí)現(xiàn)項(xiàng)目所需的一些知識(shí)儲(chǔ)備,如在矩陣鍵盤項(xiàng)目中,在這一階段,學(xué)生要懂得矩陣鍵盤實(shí)現(xiàn)的一些基本方法,循環(huán)掃描法與行列反轉(zhuǎn)法。軟件設(shè)計(jì)完以后,學(xué)生需要對(duì)運(yùn)行結(jié)果進(jìn)行分析,判斷所設(shè)計(jì)系統(tǒng)是否滿足設(shè)計(jì)目標(biāo)。如圖2所示,為教學(xué)過(guò)程中的項(xiàng)目實(shí)現(xiàn)流程。
圖2 教學(xué)過(guò)程中的項(xiàng)目實(shí)現(xiàn)流程
此次矩陣按鍵項(xiàng)目的系統(tǒng)設(shè)計(jì)目標(biāo)為實(shí)現(xiàn)5×5按鍵的掃描,將對(duì)應(yīng)的按鍵值打印到串口上。
矩陣鍵盤項(xiàng)目用的主控CPU為STM32F103VE,STM32F103VE帶有Cortex-M3內(nèi)核,共有5組16位的GPIO接口,5組USART接口。矩陣鍵盤的電路如圖3所示,當(dāng)有按鍵按下,相應(yīng)的行線與列線就會(huì)連接,如當(dāng)S101鍵按下時(shí),K_PA0與K_COLOUT4就會(huì)相連接。此次項(xiàng)目使用到了STM32F103VE的USART1,對(duì)應(yīng)的IO口為PA9/USART1_TX和PA10/USART1_RX。
圖3 矩陣鍵盤電路
矩陣式鍵盤根據(jù)不同的軟件掃描方式,通??煞譃檠h(huán)掃描法與行列反轉(zhuǎn)法。循環(huán)掃描法的原理是讓CPU不停地去掃描鍵盤的行線與列線,如可讓列線固定為輸出端口,行線固定為輸入端口,同一個(gè)時(shí)刻列線的輸出中只有一根線的輸出為低電平,當(dāng)行線有采集在低電平時(shí),就說(shuō)明有按鍵按下,此種方法,結(jié)構(gòu)簡(jiǎn)單,行線與列線的輸入輸出模式固定,但掃描耗費(fèi)的時(shí)間較長(zhǎng)[6]。行列反轉(zhuǎn)法是通過(guò)行線與列線的互換來(lái)確定按鍵,行線與列線的輸入輸出模式需要變化,但其檢測(cè)速度較快,因而得到了廣泛的應(yīng)用。
如圖4所示,為行列反轉(zhuǎn)法按鍵檢測(cè)流程,先是設(shè)置列端口為輸出,數(shù)值為0,行端口為帶上拉的輸入;讀取行端口的數(shù)值存儲(chǔ)在row_data中;接著設(shè)置行端口為輸出,數(shù)值為0,列端口為帶上拉的輸入;讀取列端口的數(shù)值存儲(chǔ)在col_data中;根據(jù)row_data與col_data就可以判斷出按鍵的數(shù)值。
圖4 行列反轉(zhuǎn)法按鍵檢測(cè)流程
多數(shù)按鍵采用的是機(jī)械式的彈性開關(guān),機(jī)械式的開關(guān)經(jīng)常會(huì)引入抖動(dòng),抖動(dòng)過(guò)程的長(zhǎng)短是由按鍵的機(jī)械特性決定,一般是10~20 ms,我們可以采用多次采樣的方法來(lái)實(shí)現(xiàn)軟件去抖。隔一定的時(shí)間去采一次按鍵的檢測(cè)數(shù)值,程序里面會(huì)存儲(chǔ)三個(gè)采樣的數(shù)值,key(當(dāng)前按鍵的數(shù)值),key_history1(上一次按鍵檢測(cè)的數(shù)值),key_history2(上上次按鍵檢測(cè)的數(shù)值),當(dāng)我們檢測(cè)到(key!=0)&&(key_history1==key)&&(key_history2==0)的條件為真的時(shí)候,就可以判斷此時(shí)按鍵按下,這里的按鍵采樣間隔時(shí)間可以根據(jù)需要采用定時(shí)器或者主函數(shù)的循環(huán)來(lái)實(shí)現(xiàn)。
在1.3小節(jié)里講到學(xué)生在編寫程序的時(shí)候碰到問(wèn)題不知如何解決,在教學(xué)的過(guò)程中,筆者發(fā)現(xiàn)串口是嵌入式系統(tǒng)中非常重要的一個(gè)調(diào)試工具,學(xué)生在課程學(xué)習(xí)的進(jìn)階階段的初期,就應(yīng)該把串口架設(shè)起來(lái),架設(shè)起來(lái)后,就可以將相應(yīng)的調(diào)試信息用printf打印到串口上了,可以解決不知道程序運(yùn)行到哪里的問(wèn)題。
在USART1的驅(qū)動(dòng)代碼中加入如下的代碼,就可以使用printf函數(shù),將相應(yīng)的調(diào)試信息打印在USART1上。
//加入以下代碼,支持printf函數(shù),而不需要選擇use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//標(biāo)準(zhǔn)庫(kù)需要的支持函數(shù)
struct __FILE
{
int handle;
};
FILE __stdout;
//定義sys_exit()以避免使用半主機(jī)模式
void _sys_exit(int x)
{
x=x;
}
//重定義fputc函數(shù)
int fputc(int ch,FILE *f)
{
while((USART1->SR&0X40)==0);//循環(huán)發(fā)送,直到發(fā)送完畢
USART1->DR=(u8) ch;
return ch;
}
#endif
如圖5所示,為矩陣鍵盤項(xiàng)目的運(yùn)行結(jié)果,當(dāng)有一個(gè)按鍵按下時(shí),CPU會(huì)檢測(cè)到相應(yīng)的鍵值,并將鍵值打印到串口上,相應(yīng)的程序調(diào)試信息也可以打印到串口上。
圖5 矩陣鍵盤項(xiàng)目運(yùn)行結(jié)果
在多項(xiàng)職業(yè)院校技能大賽中,都有嵌入式程序設(shè)計(jì)相關(guān)技能的考核要求,如嵌入式技術(shù)應(yīng)用開發(fā)賽項(xiàng)、電子產(chǎn)品設(shè)計(jì)及制作賽項(xiàng)、集成電路開發(fā)及應(yīng)用賽項(xiàng)等。對(duì)于參加技能競(jìng)賽訓(xùn)練的學(xué)生,對(duì)他們的要求會(huì)比普通學(xué)生的要求高一些,在對(duì)他們進(jìn)行項(xiàng)目教學(xué)時(shí),除了按照?qǐng)D2的流程進(jìn)行訓(xùn)練外,還需要增加一項(xiàng)代碼風(fēng)格檢查,如圖6所示。當(dāng)代碼風(fēng)格檢查不通過(guò)時(shí),須返工,經(jīng)過(guò)幾次的迭代,學(xué)生的嵌入式系統(tǒng)編程能力就可以得到明顯的提高。
圖6 競(jìng)賽訓(xùn)練中項(xiàng)目實(shí)現(xiàn)流程
代碼風(fēng)格檢查過(guò)程的關(guān)鍵是規(guī)則的設(shè)定,嵌入式程序的代碼風(fēng)格規(guī)則的范圍很廣,不同的企業(yè)可能也會(huì)有不同的要求,這里以高職學(xué)生在進(jìn)入技能競(jìng)賽訓(xùn)練前期經(jīng)常出現(xiàn)的一些代碼風(fēng)格問(wèn)題進(jìn)行總結(jié),如下:
1) 變量的命名需取有意義的名字,可以采用駝峰命名法或者下劃線命名法。
2) 中斷函數(shù)里面不允許做太多復(fù)雜的操作,不允許出現(xiàn)大段的延時(shí)。
3) 在main函數(shù)中盡量少用大段的延時(shí)。
4) 在寫某個(gè)硬件模塊驅(qū)動(dòng)的時(shí)候,要考慮到使用者的易用性,要做好驅(qū)動(dòng)使用者與硬件溝通的橋梁。在工程文件里,一般一個(gè).c文件應(yīng)對(duì)應(yīng)一個(gè).h文件。
5) 一般是系統(tǒng)中所有的硬件全部初始化完了,才將總中斷打開(特殊的應(yīng)用不一定要遵守這條規(guī)則)。
6) 復(fù)雜的邏輯,建議用狀態(tài)機(jī)來(lái)控制,這樣不容易出錯(cuò)。
通過(guò)學(xué)生們提交的課程總結(jié)報(bào)告中,可以發(fā)現(xiàn)將項(xiàng)目式的教學(xué)法運(yùn)用到課程中,提高了學(xué)生們對(duì)這門課的興趣,幫助學(xué)生們解決在課程中碰到的困難,學(xué)生們?cè)陧?xiàng)目的實(shí)現(xiàn)過(guò)程中獲得了成就感。將改進(jìn)后的項(xiàng)目教學(xué)法應(yīng)用于技能競(jìng)賽訓(xùn)練中,可以明顯地提高學(xué)生的專業(yè)技能能力。筆者將改進(jìn)后的項(xiàng)目教學(xué)法應(yīng)用于學(xué)生電子產(chǎn)品設(shè)計(jì)及制作賽項(xiàng)、集成電路開發(fā)及應(yīng)用賽項(xiàng)的訓(xùn)練中,學(xué)生獲得了2021年全國(guó)職業(yè)院校技能大賽集成電路開發(fā)及應(yīng)用賽項(xiàng)一等獎(jiǎng),2022年福建省職業(yè)院校技能大賽電子產(chǎn)品設(shè)計(jì)及制作賽項(xiàng)一等獎(jiǎng)。