張君涵,唐 灝,張玉華
(河海大學 江蘇 常州 213000)
對于STM32 工程師以及STM32 產(chǎn)品用戶常常要面臨更新固件。此時如果手邊沒有或受環(huán)境限制不能使用電腦或電腦上沒有下載固件的軟件以及驅(qū)動則會極大影響開發(fā)者和用戶的體驗。STM32 單片機一般自帶引導加載程序(Bootloader),在不改變其自帶Bootloader 程序時可以利用應用編程(in-application programming,iap)技術通過串口燒寫程序[1]下載固件。這是自動下載USB下載功能實現(xiàn)的基礎。FPGA 有較快的數(shù)據(jù)運算速度以及豐富的IP 核,可以利用異步先進先出隊列(first input first output,F(xiàn)IFO)實現(xiàn)跨時鐘域讀寫操作。STM32 系列單片機作為全球應用最廣泛的單片機,在工程、學習中都有十分重要的作用。開發(fā)一款用USB 設備充當中間設備,可隨時給STM32 單片機燒寫固件的自動下載USB,對STM32 單片機開發(fā)是十分有意義的。
本文所設計的STM32 單片機主要由STM32 模塊、w25q128 Flash 存儲芯片、FPGA 開發(fā)板3 個部分構成。STM32 與PC 機通信,控制數(shù)據(jù)的輸入與輸出。Flash 儲存數(shù)據(jù),搭載FATS 文件系統(tǒng)。FPGA 負責數(shù)據(jù)的暫時儲存,調(diào)整時序,與下位機的通信[2]。電路連接見圖1。
STM32F1 系列是一款具有高性能的CPU、72MHz 的晶振頻率、眾多的定時器和儲存器的單片機,它豐富的儲存器,為識別算法提供了充足的運算空間。并且還擁有多個通信接口、高性能、低價格、低功耗等特點??梢赃x擇串行調(diào)試和JTAG 接口調(diào)試,更加方便程序下載與驗證。非常適合本次設計要求[3]。
W25Q64 是大容量SPI Flash 產(chǎn)品,其容量為64 Mb。該25Q 系列的器件在靈活性和性能方面遠遠超過普通的串行閃存器件。W25Q64 的擦寫周期多達10 W 次,可將數(shù)據(jù)保存達20 年之久,支持2.7 ~3.6 V 的電壓,支持標準的SPI,還支持雙輸出/四輸出的SPI,最大SPI 時鐘可達80 MHz。其容量足夠搭載fats文件系統(tǒng)與一般程序的存儲,價格比W25Q128 便宜1 倍多,非常適合大規(guī)模生產(chǎn)使用。
STM32f1 與Flash 芯片采取集成的方法,使系統(tǒng)結構更小巧、便捷,也預留了燒錄接口,可以后期更新固件,實現(xiàn)其他功能。原理圖設計見圖2。
2.2.1 PCB 設計
PCB 設計使用了Altium Designer 軟件。由于電路結構較為簡單,不涉及高頻信號處理,在對PCB 布局上把小巧作為設計核心。在這塊4 cm×3 cm 的PCB 板上,集成了Flash 模塊、STM32f103 主控版、燒錄結構,基本符合了USB 設計的預期。PCB 設計圖見圖3。
2.2.2 3D 效果圖
3D 效果圖由AD18 直接生成,即為PCB 板完成生產(chǎn),焊接后得到的實物圖。預留了io 口,可以根據(jù)用戶需要添加外設。3D 效果圖見圖4。
即現(xiàn)場可編程門陣列,它是在PAL、GAL、CPLD 等可編程器件的基礎上進一步發(fā)展的產(chǎn)物。它是作為專用集成電路(ASIC)領域中的一種半定制電路而出現(xiàn)的,既解決了定制電路的不足,又克服了原有可編程器件門電路數(shù)有限的缺點。本實驗用的是靈思Artix 7 系列FPGA,使用了時鐘分頻、UART、異步FIFO 3 個模塊實現(xiàn)功能,其中異步FIFO 模塊是本實驗的核心。為了盡可能節(jié)約資源,3個模塊均使用軟件方法編寫。
本實驗采用的供電模組是TP4056 充電電源模塊板與3.7 V 聚合物鋰電池。同時給STM32 與FPGA 供電,也引出管腳可以給下位機暫時供電。此模塊體積小,重量輕,價格便宜,使用便捷,可以重復使用。實物圖見圖5。
STM32 復位之后,如果檢測到Boot1 引腳為低電平,boot0 引腳為高電平,芯片就執(zhí)行內(nèi)部固話的ISP 引導程序,接收來自上位機的命令和數(shù)據(jù)。
ISP 的過程:(1)確定BOOT0、BOOT1 引腳的狀態(tài)。
(2)芯片連接復位后,通過串口發(fā)送一個0x7f,等待STM32 回復。如果收到了0X79,表示連接成功了,可以進入下一步操作;否則,必須檢測BOOT0、BOOT1 引腳,并重新復位STM32。
(3)讀取ID 版本號發(fā)送0x020xFD。命令發(fā)送之后,等待STM32 ISP 程序回復,如果接收到0x79,讀取成功。
(4)擦除芯片發(fā)送一個雙字節(jié)命令0x44+0xBB,讓芯片執(zhí)行擦除動作,等待回復0x79,然后再發(fā)送0xFFFF+0x00 命令,讓芯片全片擦除。如果接收到0x79,表明全片擦除成功。
(5)開始燒錄程序。首先發(fā)送雙字節(jié)指令0x31+0xCE回復0x79,則繼續(xù)用多字節(jié)命令(5 個字節(jié))發(fā)送一個32位的地址,此地址就是等待寫入數(shù)據(jù)的地址,注意4 個字節(jié)對齊。收到回復0x79 之后,就可以發(fā)送N 個字節(jié)數(shù)據(jù)了(注意N 最大為256)。重復以下過程,直到把所有代碼發(fā)送出去[4]。
FatFs 是用于小型嵌入式系統(tǒng)的通用FAT/exFAT 文件系統(tǒng)模塊。FatFs 模塊是按照ANSI C 編寫的,并且與磁盤I/O 層完全分開。因此,它獨立于平臺。它可以并入資源有限的小型微控制器中。搭載fats 系統(tǒng)的設備只需調(diào)用簡單幾個函數(shù)就能實現(xiàn)對內(nèi)存的管理。此實驗利用STM32cubemx 軟件,利用hal 庫自動給STM32 單片機搭載fats 系統(tǒng),實現(xiàn)對Flash 內(nèi)存空間的管理。
USB 是通用串行總線的縮寫,是目前使用非常廣泛的總線標準,s以其支持熱插拔、方便攜帶、容易使用、標準統(tǒng)一、傳輸速度快、價格便宜等優(yōu)勢在當前的嵌入式系統(tǒng)應用中占有相當大的份額。此項目采用ST 公司的STM32 微處理器,集成了USB 控制模塊,無需外加其他邏輯控制電路,簡化了微處理器與PC 之間的硬件電路設計,提高了系統(tǒng)的可靠性;使用hal 固件庫,實現(xiàn)了自定義USB 設備固件[5]。
FIFO 是指先進先出。通過FPGA 實現(xiàn)的異步FIFO 實現(xiàn)的數(shù)據(jù)跨時鐘域的轉(zhuǎn)換,使得輸出數(shù)據(jù)的速度不受輸入數(shù)據(jù)速度的影響。為了消除跨時鐘域可能出現(xiàn)的亞穩(wěn)態(tài),本實驗采取二進制轉(zhuǎn)換成格雷碼[6],與打兩拍的操作,大大降低了亞穩(wěn)態(tài)出現(xiàn)的概率。此外,此FIFO 設計增加了滿空指示的功能。過空滿指示燈亮滅情況,可以巧妙地判斷出當前系統(tǒng)的工作狀態(tài),這也是本系統(tǒng)的亮點之一。
異步FIFO 實現(xiàn)核心代碼如下[7]:
assign wr_adr_gray = (wr_adr_ptr >> 1) ^ wr_adr_ptr;
assign rd_adr_gray = (rd_adr_ptr >> 1) ^ rd_adr_ptr;
always@(posedge wr_clk or negedge rst_n)begin
if(!rst_n)begin
rd_adr_gray1 <= 'd0;
rd_adr_gray2 <= 'd0;
end
else begin
rd_adr_gray1 <= rd_adr_gray;
rd_adr_gray2 <= rd_adr_gray1;
end
end
always@(posedge rd_clk or negedge rst_n)begin
if(!rst_n)begin
wr_adr_gray1 <= 'd0;
wr_adr_gray2 <= 'd0;
end
else begin
wr_adr_gray1 <= wr_adr_gray;
wr_adr_gray2 <= wr_adr_gray1;
end
end
assign empty = (rd_adr_gray == wr_adr_gray2)?1'b1:1'b0;
Assign full=(wr_adr_gray[data_depth:data_depth-1] !=rd_adr_gray2[data_depth:data_depth-1])&&(wr_adr_gray[data_depth-2:0]==rd_adr_gray2[data_depth-2:0]);
endmodule
仿真結果:對異步FIFO 的設計使用了xilink 公司的vivado 軟件。在軟件內(nèi)部控制讀寫使能信號,可以清楚地看到異步FIFO 里輸入數(shù)據(jù)和輸出數(shù)據(jù)保持一致,數(shù)據(jù)保持時間發(fā)生改變,空滿信號高低電平變化符合設計預期。仿真結果見圖6。
寫數(shù)據(jù)來源于STM32 串口發(fā)送的數(shù)據(jù),讀數(shù)據(jù)是通過串口向下位機發(fā)送的數(shù)據(jù)。寫時鐘與STM32 波特率保持一致,本實驗把STM32 發(fā)送數(shù)據(jù)結束信號上升沿作為FPGA異步FIFO 寫時鐘。讀時鐘可以隨意設定,但是波特率要保證在1 200 ~115 200 以內(nèi)。讀時鐘脈沖由FPGA 內(nèi)部分頻電路產(chǎn)生。當檢測到下位機的應答信號后即可拉高讀使能,開始向下位機發(fā)送數(shù)據(jù)。寫使能由STM32 產(chǎn)生,當要發(fā)送數(shù)據(jù)時,拉高寫使能信號線,F(xiàn)PGA 開始接收數(shù)據(jù)[8]。FPGA 總體設計框架見圖7。
STM32 模塊預先給Flash 搭載FATS 系統(tǒng),并通過模擬USB 與電腦完成交互,通過iic 總線控制Flash 的讀寫,把從電腦上讀取的文件儲存到Flash 芯片里。燒錄時STM32從Flash 中讀取數(shù)據(jù),通過串口發(fā)送給FPGA 模塊。FPGA 通過異步FIFO 實現(xiàn)數(shù)據(jù)輸入和輸出速度的轉(zhuǎn)換,并通過串口發(fā)送給下位機,實現(xiàn)燒寫功能。軟件設計總體框架見圖8。
本設計思路的初衷是解決燒錄過程帶來的時間浪費。利用高性能FPGA 數(shù)據(jù)處理速度解決了STM32 單片機性能低無法滿足輸出數(shù)據(jù)速度恒定的問題,開發(fā)了一款可以用于STM32 單片機程序儲存并可以自動燒錄的USB。但是由于技術和設備的限制,該USB 目前只能燒錄極為簡單的代碼,并且存儲的速度較慢。但是經(jīng)過硬件改良和算法的優(yōu)化后,一定能在工程運用和教學科研中發(fā)揮巨大作用。