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

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

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

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

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

圖6 虛擬仿真實驗結果顯示
案例處理字符串時采用單個字符處理方式,可以嘗試直接采用字符串的方式進行串口發送接收。
參考代碼如下:
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相結合,避免了和匯編語言在開發單片機時的直接應用,并且利用CubeMX圖形化方法使整個單片機的開發過程規范化、流程化,用戶只需要對應不同的案例實踐編寫相關的C源程序就可以完成整個單片機的開發和實現。本文將Proteus、Keil和CubeMx相結合進行STM32仿真引入單片機實驗課堂在全國屬于首創,筆者所在學校相應的“單片機原理及應用”線上、線下混合課程也已經上線。該方法的線上課程采用標準庫,幫助深入理解驅動程序原理,Proteus、Keil和CubeMx仿真與后續實物實踐所實現的功能能夠做到完全一致,仿真與實踐環環相扣,互為補充,這種新的仿真方法響應國家工程認證教育號召,加強工程訓練,提升大學生創新、創造能力。
本文的仿真實驗方法降低了單片機開發的門檻,使得單片機的開發更加規范、易操作且易理解,激發了廣大學生群體的興趣,使得單片機的創新、創造變得更加簡易。本文通過STM32串口實驗實例具體展示了Proteus、Keil和CubeMx的STM32系列單片機仿真實驗的單片機外圍硬件設計(文中主要是LCD)、軟件設計、設置和仿真調試的整個過程。在實踐過程中,基于Proteus、Keil和CubeMx的STM32系列單片機實驗在線上、線下混合課程中取得了較好的效果和反響,使低年級學生和非本專業學生能動手實際編程完成實踐任務,還可以利用所學知識進行創新性的設計和開發,參加全國藍橋杯競賽、智能汽車競賽。該仿真系統已經在為筆者所在學校參加藍橋杯競賽、智能汽車競賽服務,學校獲得了藍橋杯全國 “優勝學校”榮譽稱號,時至今日學生贏得智能車全國總決賽特等獎2項,全國總決賽一等獎7項,相信在未來越來越多的學科競賽中我們能夠取得越來越好的競賽成績。