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