通過網盤分享的文件:串口flash編程工具例程.zip
https://pan.baidu.com/s/1oc4oJFO8HVznDo2h3eBvfQ?pwd=CW32
提取碼: CW32
前言
在往期的分享中,我們分享過在cw32L012上運行keil的FLM外部flash下載算法的方法?!?strong>CW32L012實現外部flash下載算法】簡單回顧,在項目開發過程中,當需要掉電保存大量的數據時(幾十上百K字節數據),放到單片機內部flash是不明智的,內部flash資源寶貴,用于存代碼才是最好的,所以我們需要將數據下載到外部flash中。
keil外部flash下載算法,簡單來說它使用SWD調試接口下載,用戶根據keil提供的下載算法模板修改,對接外部flash編程的接口,編譯生成FLM文件,當需要下載時,把待下載數據定義到外部flash的地址范圍中,然后添加該下載算法即可下載,總體來說稍復雜。
經常會有客戶問我們能不能用串口下載更新flash?有沒有用串口OTA更新的方法(包含內部flash),本次分享就利用串口進行flash編程,該方式更加通用。
Keil 外部flash下載的缺陷
每種單片機都需要寫一遍外部flash下載算法,然后生成FLM文件,比較依賴keil開發環境,
下載算法是加載到RAM執行的,算法大小必須小于等于RAM的大小,對于RAM比較小的單片機,很難應用該方法
下載算法加載以后,每次點下載都會完整把外部flash的數據下載一遍,即使你只改變的是局部數據,或者內部flash的代碼,只要下載,都會重新下載一遍,除非每次屏蔽,或者專門做一個下載的工程。
因為使用的是SWD調試接口下載,如果產品不希望引出該接口給客戶使用,或者因為代碼安全原因屏蔽了該接口,下載就比較受限
串口flash編程工具簡介
該工具是基于HTML語言開發,使用串口進行通訊,支持多種波特率,可配置下載的參數,如flash id號、flash 大小、下載扇區號、扇區大小、通訊分包長度 、擦除超時時間和寫入超時時間等。參數均可修改,當修改的不合法時會自動調整到合法數值。文件的選擇不關心文件類型,可以是任意類型,但文件大小要小于flash大小。另外設計有數據校驗、差分更新、進度條和日志顯示功能。
該工具使用自定義串口協議,可能大家比較疑惑為什么不使用現成的modbus協議,或者XYZ-MODEM協議,或者是其他文件傳輸協議?因為主要考慮靈活性、后期可維護性和輕量級的特性,因此自定義協議是最佳選擇。
測試硬件平臺
依舊選擇cw32L012,該單片機有很多優點,高性價比,主頻可達96M,SPI可運行在48M,高速的SPI對于flash的操作是非常吃香的,有更高的通訊帶寬,對比103的18M SPI來說,提升太大了,我們測試讀寫w25q128速度如下:

可以看到cw32l012這款芯片對于讀寫w25q128速度是相當快的,讀取2K的數據也只需要2ms,真的非???,該芯片還有4路DMA,對于需要高速傳輸的場景還可以開啟DMA,但目前測試下來也夠用了,大家有高速SPI的需求可以選擇該芯片哦。
移植教程
有了html上位機還缺嵌入式的通訊代碼,通訊協議細節大家不必關注,已經完成協議的對接,只需要用戶完成所在平臺的以下接口:串口收發接口、待操作flash的讀寫擦除接口,以及一些參數檢查和初始化。Cw32寫的代碼高內聚低耦合,代碼框架良好,函數命名合理,充分考慮了代碼的封裝性和可移植性。
注意:在移植該框架之前必須打通串口收發功能,flash擦除寫入讀取功能,串口接收一幀數據按超時斷幀方法,短幀時間需要在5-20ms之間。我們提供了基于cw32L012的完整的工程,用戶可以參考。
1.準備好串口flash編程算法庫文件
Comm_fmt不必關注,該文件用于構造解析命令體
Sfp_plugin.c為主要關注對象,用戶需要在該文件內實現相關port接口


2.添加.c文件與.h文件的路徑


3.編譯添加的文件
有錯誤和警告自行解決

4.編寫sfp_pligin.c初始化代碼
初始非常簡單,只需要給定一個發送緩沖區就行。

5.對接sfp_pligin.c中串口發送函數
對接你實際通訊用的串口發送接口,這里我們使用的是串口3。
(flash_id 在后面的移植中會一直出現,其設計目的是區分不同flash,當設備有多個flash時,通過判斷該id號去操作不同的flash,如果只操作一個flash,該參數忽略)

6.對接sfp_pligin.c中flash擦除函數
對接你實際的flash擦除函數接口。Addr為擦除的起始地址,len為擦除的總長度,你可以根據要擦除的大小自行決定擦除策略,如可以按最小扇區擦除,也可以判斷如果len達到了32k或64k級別,去調用更大的扇區擦除函數,此處按最小扇區大小擦除。

7.對接sfp_pligin.c中flash寫函數接口
寫函數非常簡單,寫入起始地址,數據,數據長度。

8.對接sfp_pligin.c中flash讀函數接口
讀函數與寫函數參數差不多,不過多介紹。

9.對接sfp_pligin.c中進入編程模式接口
該函數用于提示用戶現在已經請求進入編程狀態,用戶可根據實際情況去調用sfp_plugin_set_prog_allow(SFP_PROG_ALLOW);來允許,或者調用sfp_plugin_set_prog_allow(SFP_PROG_DISALLOW);來拒絕。(此處固定允許編程)

10.對接sfp_pligin.c中退出編程模式接口
該接口用于提示用戶已經退出編程模式了,download_status用戶反饋本次的操作狀態(操作成功、下載中斷、校驗失敗),用戶可判斷其狀態來做一些狀態的指示,例如向GUI線程發送狀態告知用戶下載的結果。

11.對接sfp_pligin.c中檢查編程信息的接口
該接口用于檢查上位機待下載的數據信息,如file_size(下載的大?。瑂tart_addr
(下載的起始地址),packed_len(分包的長度),用戶需要根據自己所在平臺的實際情況判斷,有錯誤就返回錯誤碼,此處可按作者寫的不用改。

12.對接sfp_pligin.c中讀取信息的檢查接口
該接口用于檢查上位機讀取的信息是否合法,如讀取地址,讀取的長度是否超過范圍,同樣可不修改,按作者的方式。

13.對接完畢,編譯檢查
至此,需要對接的函數已經全部完成了,編譯成功即可下一步
14.調用初始化函數
sfp_pligin.h文件中找到該函數調用


15.調用串口接收事件函數
sfp_pligin.h文件中找到該函數調用
在你的串口收到一幀數據的函數中,調用該函數即可,形參傳入接收到的數據指針,接收到的長度。


16.移植已全部完成,可以使用上位機進行測試
HTML上位機使用方法說明
1.使用瀏覽器打開serial_flash_download_tool.html2.選擇串口設置波特率

3.設置下載參數
Flash id : 區分不同的flash設備,只有一個時忽略
Flash 大小:限制文件下載的大小
扇區大?。捍僮鱢lash的最小擦除大?。╪or flash一般都是4096)
扇區號:需要從第幾個扇區開始下載
分包長度:協議分包讀寫的最大值,和串口收發有關(可默認不修改)
擦除超時時間:根據實際flash擦除耗時時間去定義(時間和擦除的大小有關)
寫入超時時間:根據實際flash寫入耗時實際去修改(寫入一般不會太久可不修改)

4.選擇待下載的文件
文件必須小于flash的大小,否則會報錯,選擇以后會統計文件大小,占用多少扇區。

5.點擊開始下載
可配置是否需要校驗,是否啟用差分更新,默認開啟,不需要可以取消勾選。

6.觀察下載進度和日志

總結
本次分享的是用CW32L012的串口去下載外部flash,該方法通用性強,移植便捷,代碼風格好,易于閱讀維護,上位機界面清晰,操作簡單,易于使用,硬件上性能強,有48M SPI 和96M 主頻,喜歡做高速SPI傳輸的客戶一定不要錯過這么高性價比的芯片哦!
最后對于內部flash的操作,也是一樣的呀,只需將flash操作接口換成cw32l012內部flash操作的API,然后寫好bootload,在bootload中運行我們這個框架將數據下載到內部flash,然后校驗固件,成功以后就可以跳轉執行APP代碼了,這不就實現了串口OTA更新了嘛!
-
FlaSh
+關注
關注
10文章
1748瀏覽量
155508 -
串口
+關注
關注
15文章
1618瀏覽量
82806 -
CW32
+關注
關注
1文章
299瀏覽量
1843
發布評論請先 登錄
如何使用新版本J-Flash編程CW32 MCU
使用J-Flash來編程CW32 MCU
【應用筆記】CW32 自舉程序中使用的 ISP 協議
CW32 MCU開發資料匯總(手冊、工具、固件庫)
應用筆記(二)| 武漢芯源CW32自舉程序中使用的ISP協議
cw32和stm32的區別
cw32和gd32的區別
應用筆記-CW32 自舉程序中使用的 ISP 協議
如何使用新版本J-Flash編程CW32 MCU?
【教程】CW32串口flash編程工具分享
評論