孔 霞,郭海如,李幼鳳,萬 興,武云云,胡緒龍
(湖北工程學(xué)院 計(jì)算機(jī)與信息科學(xué)學(xué)院,湖北 孝感 432000)
Proteus 軟件[1-3]是英國 Labcenter electronics 公司研發(fā)的 EDA工具軟件,由 ISIS(原理圖設(shè)計(jì)與仿真平臺(tái))、高級(jí)布線和編輯軟件平臺(tái)(advanced routing and editing software,ARES)組成,能夠在計(jì)算機(jī)上完成從原理圖設(shè)計(jì)、 電路分析與仿真、單片機(jī)代碼調(diào)試與仿真、系統(tǒng)測試與功能驗(yàn)證到 PCB 板生成的完整電子產(chǎn)品研發(fā)過程。Proteus 是目前唯一將電路仿真軟件、PCB 設(shè)計(jì)軟件和虛擬模型仿真軟件進(jìn)行三合一的一個(gè)設(shè)計(jì)平臺(tái),它支持多種處理器類型。在編譯方面,Proteus支持IAR、Keil和MPLAB等多種編譯器。傳統(tǒng)的單片機(jī)仿真實(shí)驗(yàn)平臺(tái)結(jié)合使用 Proteus 軟件和Keil 軟件[4-6],該方法可以設(shè)計(jì)多種類型的實(shí)驗(yàn)項(xiàng)目,擴(kuò)展普通實(shí)驗(yàn)箱無法完成的大型綜合實(shí)驗(yàn)項(xiàng)目,降低實(shí)驗(yàn)室的建設(shè)和維護(hù)成本。然而,該方法在實(shí)踐項(xiàng)目開發(fā)過程中涉及到很多匯編語言文件,項(xiàng)目開發(fā)文件的零散建立方式繁瑣且容易出錯(cuò)。本文在傳統(tǒng)的 Proteus和Keil 仿真實(shí)驗(yàn)平臺(tái)中加入CubeMx軟件[7-8],該軟件用圖形化方法生成工程項(xiàng)目的初始化程序文件,可以避免大量的程序初始化工作,大量減少了用戶的進(jìn)行單片機(jī)開發(fā)、創(chuàng)新的工作量。該方法可以使單片機(jī)的應(yīng)用、開發(fā)和設(shè)計(jì)過程避免匯編語言的參與,對初學(xué)者更加友好,降低了單片機(jī)開發(fā)和設(shè)計(jì)的門檻。
本文的STM32單片機(jī)仿真實(shí)驗(yàn)方法摒棄用匯編語言開發(fā)單片機(jī)的理念,在基于 Proteus和Keil 的仿真實(shí)驗(yàn)平臺(tái)中引入 CubeMx,利用圖形化方法生成工程項(xiàng)目的初始化 C 程序文件。CubeMx 是一款圖形化軟件設(shè)置工具,使用圖形化向?qū)砩?C 初始化代碼文件,用戶僅需編寫具體案例所需的子函數(shù)即可,能夠減少用戶的編程工作量、規(guī)范各個(gè)部件的初始化過程以及流程。新方法可以引導(dǎo)用戶快速入門和上手,在開發(fā)過程中可以規(guī)范項(xiàng)目初始化文件以及開發(fā)流程,幫助用戶更加流暢、有規(guī)劃地進(jìn)行單片機(jī)的開發(fā)和設(shè)計(jì)。因此,筆者所在學(xué)校線上、線下混合式單片機(jī)課程線上課程擬采用Proteus、Keil 和CubeMx軟件仿真STM32[7-13]系列單片機(jī),并以全國大學(xué)生藍(lán)橋杯競賽、智能汽車競賽為著力點(diǎn)(嵌入式競賽以STM32 單片機(jī)作為考核對象),該實(shí)驗(yàn)仿真與后續(xù)實(shí)物實(shí)踐所實(shí)現(xiàn)的功能完全一致,仿真實(shí)驗(yàn)與實(shí)踐實(shí)驗(yàn)環(huán)環(huán)相扣,可以逐步增強(qiáng)工程實(shí)踐要求,提升同學(xué)動(dòng)手、動(dòng)腦能力,擴(kuò)展學(xué)生的視野,能夠大膽創(chuàng)新。這種模式的仿真、實(shí)踐實(shí)驗(yàn)相結(jié)合側(cè)重實(shí)踐和創(chuàng)新能力的開發(fā),為相關(guān)的學(xué)科競賽創(chuàng)新做了很好的鋪墊。
利用Proteus、Keil和CubeMx軟件,設(shè)計(jì)并實(shí)現(xiàn)了一種新的單片機(jī)仿真方法。其中,Proteus是普遍適用的EDA工具,是集電路仿真、PCB設(shè)計(jì)和虛擬模型為一體的設(shè)計(jì)平臺(tái)。CubeMX是一款圖形化軟件設(shè)置工具,允許使用圖形化向?qū)砩蒀初始化代碼,用戶僅需編寫一些具體案例所需的子函數(shù)即可,它能夠減少和規(guī)范各個(gè)部件的初始化過程以及流程。本文以串口通信實(shí)驗(yàn)為實(shí)例,闡述CubeMX、Keil和Proteus在STM32系列單片機(jī)實(shí)驗(yàn)實(shí)踐中的應(yīng)用,具體對STM32F103R6款芯片進(jìn)行系統(tǒng)的仿真和程序設(shè)計(jì)。本文實(shí)例可以直接應(yīng)用于藍(lán)橋杯競賽中,也可以推廣到單片機(jī)到其他應(yīng)用領(lǐng)域。
以“STM32串口”實(shí)驗(yàn)為例,介紹如何使用CubeMX配置STM32串口操作初始化文件。然后根據(jù)實(shí)驗(yàn)設(shè)計(jì)完成相關(guān)的程序編碼,并在Proteus中進(jìn)行仿真運(yùn)行和驗(yàn)證,完成線上仿真實(shí)驗(yàn)后用戶能夠通過實(shí)物焊接電板進(jìn)行藍(lán)橋杯競賽和智能汽車競賽的創(chuàng)新實(shí)踐。STM32串口實(shí)驗(yàn)中,通過通過虛擬串口軟件連接Proteus中的STM32和串口助手,編碼從STM32發(fā)送信息,在串口助手上查看接收字符;在串口助手中發(fā)送字符串到開發(fā)板,在LCD中顯示相應(yīng)的字符串信息。
這里實(shí)例選擇STM32芯片型號(hào):STM32F103R6,串口實(shí)驗(yàn)原理圖如圖1所示。硬件部分由PA2、PA3引腳作為系統(tǒng)的外部中斷線,PB8、PB9、PB10、PB11和PB12作為LCD顯示輸出線,完成字符的傳輸和顯示。
在總體的原理設(shè)計(jì)之后,建立項(xiàng)目工程所需的流程化和規(guī)范化的項(xiàng)目文件,就是以下所述的步驟 1和步驟 2實(shí)現(xiàn)的內(nèi)容。步驟 3是具體串口收發(fā)信息時(shí)對每個(gè)字符進(jìn)行實(shí)時(shí)處理的流程和實(shí)施方法、設(shè)置說明。軟件仿真設(shè)計(jì)的總體流程圖如圖2所示,具體實(shí)施步驟、設(shè)置內(nèi)容見步驟 3中的1) ~ 6)。

圖2 總體流程圖
步驟1 CubeMX配置。在實(shí)驗(yàn)配置中,LCD液晶屏需要加載驅(qū)動(dòng)文件,時(shí)鐘源選擇內(nèi)部高速時(shí)鐘,除了串口配置之外,其他配置和Proteus和Keil 中的LED燈實(shí)驗(yàn)配置一致。具體如下:1)啟動(dòng)CubeMX軟件,新建工程并命名;2)依據(jù)原理圖中的處理器,選擇型號(hào)為STM32F103R6的處理器;3)配置時(shí)鐘源及端口在時(shí)鐘樹選擇內(nèi)部晶振作為高效時(shí)鐘;4)配置串口USART2,波特率設(shè)為19200,數(shù)據(jù)流向設(shè)為發(fā)送信號(hào)和接收信號(hào),同時(shí)配置中斷分組和串口中斷優(yōu)先級(jí),將UASRT2全域中斷的優(yōu)先級(jí)設(shè)為1;5)設(shè)置工程輸出配置參數(shù),自動(dòng)生成代碼,打開建好的工程文件,進(jìn)入工程后打開main函數(shù)所在的文件夾。
步驟2 工程移植。將LCD的驅(qū)動(dòng)文件“l(fā)cd.c”、“l(fā)cd.h”和“ascii.h”復(fù)制到工程相關(guān)的文件夾,將其中的.c文件加載到工程中。
步驟3 編程實(shí)現(xiàn)。
1) 在main.c源程序文件中的添加預(yù)處理命令包含LCD相關(guān)的頭文件,進(jìn)行LCD初始化,具體參照圖3,其中第108行代碼開啟串口接收中斷,用戶可以在所建工程的main.c目錄下找到相應(yīng)的頭文件。第109行代碼是用戶自己編寫所需傳送的字符的函數(shù),用戶可依據(jù)需要編寫和修改該函數(shù),但是應(yīng)當(dāng)有等待發(fā)送完成、檢查字符結(jié)束標(biāo)志等。

圖3 LCD初始化設(shè)置程序
2) 建立編寫所需發(fā)送信息的函數(shù),如圖3所示,第109行代碼是用戶自己編寫所需傳送的字符的函數(shù)的調(diào)用,通過調(diào)用該函數(shù)實(shí)現(xiàn)數(shù)據(jù)的發(fā)送,用戶可依據(jù)需要編寫和修改該函數(shù),但是應(yīng)當(dāng)有“等待發(fā)送完成”、“檢查字符串結(jié)束標(biāo)志”等。
等待接收完成可以通過判斷全局變量標(biāo)志位RXOVER 實(shí)現(xiàn),接收完成后,標(biāo)志位RXOVER需要在main函數(shù)中清零,以便下次使用,核心代碼如下。
/* USER CODE BEGIN WHILE */
while (1)
{if(RXOVER==1) //接收是否完成
{ LCD_Disp_Strings(LCD_PAGE6, 5, (uint8_t*)USART_RXBUF, 15, BACK_REVERSE);
/清空接收緩沖區(qū)
RXOVER=0; //清除接收標(biāo)志
HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);//使能接收中斷
}
/* USER CODE END WHILE */
3) 編寫中斷服務(wù)程序,串口的接收相關(guān)函數(shù)查找方法如上所述,實(shí)例中,中斷文件中變量的定義和服務(wù)程序如圖4所示。

圖4 中斷文件變量的定義與中斷服務(wù)程序
接收字符完成時(shí),需要在中斷服務(wù)程序中對RXOVER置“1”,接收中斷服務(wù)程序流程如圖5所示,中斷服務(wù)程序核心代碼如下。

圖5 接收中斷服務(wù)程序流程圖
/* USER CODE BEGIN USART2_IRQn 1 */
HAL_UART_Receive_IT(&huart2,(uint8_t *)aRxBuffer,1);//串口接收,每次接收1位
if(接收完成)
{ RXCUNT=0;//接收緩沖區(qū)字節(jié)數(shù)清“0”
RXOVER=1;// 接收完成標(biāo)志位置“1”;
}
else
{ 接收字符;
++RXCUNT; //接收緩沖區(qū)字節(jié)數(shù)+1
}
/* USER CODE END USART2_IRQn 1 */
4) 編譯鏈接,編譯鏈接之后,已經(jīng)將.hex文件加載到Proteus中,還需要設(shè)置其中的串口和終端波特率為19200。
5) 安裝虛擬串口,增加虛擬串口。
6) 打開串口助手,選擇端口號(hào)并設(shè)置波特率為19200,串口打開后,指示燈變?yōu)榧t色。
仿真實(shí)驗(yàn)運(yùn)行后,能夠在虛擬終端接收到編程需要發(fā)送的字符。實(shí)例仿真中,輸入單個(gè)字符6次后,液晶屏能夠看到接收到的5個(gè)字符(輸入的最后一個(gè)是終止符),結(jié)果如圖6所示。

圖6 虛擬仿真實(shí)驗(yàn)結(jié)果顯示
案例處理字符串時(shí)采用單個(gè)字符處理方式,可以嘗試直接采用字符串的方式進(jìn)行串口發(fā)送接收。
參考代碼如下:
uint8_t rx[100];
char str[40];
sprintf(str, "Welcome to HBEU ");
HAL_UART_Transmit(&huart2,(unsigned char *)str, strlen(str), 50);
HAL_Delay(500);
HAL_UART_Receive_IT(&huart2, rx, 5);
本文采用Proteus、Keil和CubeMx相結(jié)合,避免了和匯編語言在開發(fā)單片機(jī)時(shí)的直接應(yīng)用,并且利用CubeMX圖形化方法使整個(gè)單片機(jī)的開發(fā)過程規(guī)范化、流程化,用戶只需要對應(yīng)不同的案例實(shí)踐編寫相關(guān)的C源程序就可以完成整個(gè)單片機(jī)的開發(fā)和實(shí)現(xiàn)。本文將Proteus、Keil和CubeMx相結(jié)合進(jìn)行STM32仿真引入單片機(jī)實(shí)驗(yàn)課堂在全國屬于首創(chuàng),筆者所在學(xué)校相應(yīng)的“單片機(jī)原理及應(yīng)用”線上、線下混合課程也已經(jīng)上線。該方法的線上課程采用標(biāo)準(zhǔn)庫,幫助深入理解驅(qū)動(dòng)程序原理,Proteus、Keil和CubeMx仿真與后續(xù)實(shí)物實(shí)踐所實(shí)現(xiàn)的功能能夠做到完全一致,仿真與實(shí)踐環(huán)環(huán)相扣,互為補(bǔ)充,這種新的仿真方法響應(yīng)國家工程認(rèn)證教育號(hào)召,加強(qiáng)工程訓(xùn)練,提升大學(xué)生創(chuàng)新、創(chuàng)造能力。
本文的仿真實(shí)驗(yàn)方法降低了單片機(jī)開發(fā)的門檻,使得單片機(jī)的開發(fā)更加規(guī)范、易操作且易理解,激發(fā)了廣大學(xué)生群體的興趣,使得單片機(jī)的創(chuàng)新、創(chuàng)造變得更加簡易。本文通過STM32串口實(shí)驗(yàn)實(shí)例具體展示了Proteus、Keil和CubeMx的STM32系列單片機(jī)仿真實(shí)驗(yàn)的單片機(jī)外圍硬件設(shè)計(jì)(文中主要是LCD)、軟件設(shè)計(jì)、設(shè)置和仿真調(diào)試的整個(gè)過程。在實(shí)踐過程中,基于Proteus、Keil和CubeMx的STM32系列單片機(jī)實(shí)驗(yàn)在線上、線下混合課程中取得了較好的效果和反響,使低年級(jí)學(xué)生和非本專業(yè)學(xué)生能動(dòng)手實(shí)際編程完成實(shí)踐任務(wù),還可以利用所學(xué)知識(shí)進(jìn)行創(chuàng)新性的設(shè)計(jì)和開發(fā),參加全國藍(lán)橋杯競賽、智能汽車競賽。該仿真系統(tǒng)已經(jīng)在為筆者所在學(xué)校參加藍(lán)橋杯競賽、智能汽車競賽服務(wù),學(xué)校獲得了藍(lán)橋杯全國 “優(yōu)勝學(xué)?!睒s譽(yù)稱號(hào),時(shí)至今日學(xué)生贏得智能車全國總決賽特等獎(jiǎng)2項(xiàng),全國總決賽一等獎(jiǎng)7項(xiàng),相信在未來越來越多的學(xué)科競賽中我們能夠取得越來越好的競賽成績。