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

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


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


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

4.編寫(xiě)sfp_pligin.c初始化代碼
初始非常簡(jiǎn)單,只需要給定一個(gè)發(fā)送緩沖區(qū)就行。

5.對(duì)接sfp_pligin.c中串口發(fā)送函數(shù)
對(duì)接你實(shí)際通訊用的串口發(fā)送接口,這里我們使用的是串口3。
(flash_id 在后面的移植中會(huì)一直出現(xiàn),其設(shè)計(jì)目的是區(qū)分不同flash,當(dāng)設(shè)備有多個(gè)flash時(shí),通過(guò)判斷該id號(hào)去操作不同的flash,如果只操作一個(gè)flash,該參數(shù)忽略)

6.對(duì)接sfp_pligin.c中flash擦除函數(shù)
對(duì)接你實(shí)際的flash擦除函數(shù)接口。Addr為擦除的起始地址,len為擦除的總長(zhǎng)度,你可以根據(jù)要擦除的大小自行決定擦除策略,如可以按最小扇區(qū)擦除,也可以判斷如果len達(dá)到了32k或64k級(jí)別,去調(diào)用更大的扇區(qū)擦除函數(shù),此處按最小扇區(qū)大小擦除。

7.對(duì)接sfp_pligin.c中flash寫(xiě)函數(shù)接口
寫(xiě)函數(shù)非常簡(jiǎn)單,寫(xiě)入起始地址,數(shù)據(jù),數(shù)據(jù)長(zhǎng)度。

8.對(duì)接sfp_pligin.c中flash讀函數(shù)接口
讀函數(shù)與寫(xiě)函數(shù)參數(shù)差不多,不過(guò)多介紹。

9.對(duì)接sfp_pligin.c中進(jìn)入編程模式接口
該函數(shù)用于提示用戶(hù)現(xiàn)在已經(jīng)請(qǐng)求進(jìn)入編程狀態(tài),用戶(hù)可根據(jù)實(shí)際情況去調(diào)用sfp_plugin_set_prog_allow(SFP_PROG_ALLOW);來(lái)允許,或者調(diào)用sfp_plugin_set_prog_allow(SFP_PROG_DISALLOW);來(lái)拒絕。(此處固定允許編程)

10.對(duì)接sfp_pligin.c中退出編程模式接口
該接口用于提示用戶(hù)已經(jīng)退出編程模式了,download_status用戶(hù)反饋本次的操作狀態(tài)(操作成功、下載中斷、校驗(yàn)失敗),用戶(hù)可判斷其狀態(tài)來(lái)做一些狀態(tài)的指示,例如向GUI線程發(fā)送狀態(tài)告知用戶(hù)下載的結(jié)果。

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

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

13.對(duì)接完畢,編譯檢查
至此,需要對(duì)接的函數(shù)已經(jīng)全部完成了,編譯成功即可下一步
14.調(diào)用初始化函數(shù)
sfp_pligin.h文件中找到該函數(shù)調(diào)用


15.調(diào)用串口接收事件函數(shù)
sfp_pligin.h文件中找到該函數(shù)調(diào)用
在你的串口收到一幀數(shù)據(jù)的函數(shù)中,調(diào)用該函數(shù)即可,形參傳入接收到的數(shù)據(jù)指針,接收到的長(zhǎng)度。


16.移植已全部完成,可以使用上位機(jī)進(jìn)行測(cè)試
HTML上位機(jī)使用方法說(shuō)明
1.使用瀏覽器打開(kāi)serial_flash_download_tool.html2.選擇串口設(shè)置波特率

3.設(shè)置下載參數(shù)
Flash id : 區(qū)分不同的flash設(shè)備,只有一個(gè)時(shí)忽略
Flash 大?。合拗莆募螺d的大小
扇區(qū)大?。捍僮鱢lash的最小擦除大?。╪or flash一般都是4096)
扇區(qū)號(hào):需要從第幾個(gè)扇區(qū)開(kāi)始下載
分包長(zhǎng)度:協(xié)議分包讀寫(xiě)的最大值,和串口收發(fā)有關(guān)(可默認(rèn)不修改)
擦除超時(shí)時(shí)間:根據(jù)實(shí)際flash擦除耗時(shí)時(shí)間去定義(時(shí)間和擦除的大小有關(guān))
寫(xiě)入超時(shí)時(shí)間:根據(jù)實(shí)際flash寫(xiě)入耗時(shí)實(shí)際去修改(寫(xiě)入一般不會(huì)太久可不修改)

4.選擇待下載的文件
文件必須小于flash的大小,否則會(huì)報(bào)錯(cuò),選擇以后會(huì)統(tǒng)計(jì)文件大小,占用多少扇區(qū)。

5.點(diǎn)擊開(kāi)始下載
可配置是否需要校驗(yàn),是否啟用差分更新,默認(rèn)開(kāi)啟,不需要可以取消勾選。

6.觀察下載進(jìn)度和日志

總結(jié)
本次分享的是用CW32L012的串口去下載外部flash,該方法通用性強(qiáng),移植便捷,代碼風(fēng)格好,易于閱讀維護(hù),上位機(jī)界面清晰,操作簡(jiǎn)單,易于使用,硬件上性能強(qiáng),有48M SPI 和96M 主頻,喜歡做高速SPI傳輸?shù)目蛻?hù)一定不要錯(cuò)過(guò)這么高性?xún)r(jià)比的芯片哦!
最后對(duì)于內(nèi)部flash的操作,也是一樣的呀,只需將flash操作接口換成cw32l012內(nèi)部flash操作的API,然后寫(xiě)好bootload,在bootload中運(yùn)行我們這個(gè)框架將數(shù)據(jù)下載到內(nèi)部flash,然后校驗(yàn)固件,成功以后就可以跳轉(zhuǎn)執(zhí)行APP代碼了,這不就實(shí)現(xiàn)了串口OTA更新了嘛!
-
FlaSh
+關(guān)注
關(guān)注
10文章
1747瀏覽量
155489 -
串口
+關(guān)注
關(guān)注
15文章
1618瀏覽量
82792 -
CW32
+關(guān)注
關(guān)注
1文章
299瀏覽量
1843
發(fā)布評(píng)論請(qǐng)先 登錄
CW32量產(chǎn)燒錄工具
如何使用新版本J-Flash編程CW32 MCU
使用J-Flash來(lái)編程CW32 MCU
【應(yīng)用筆記】CW32 自舉程序中使用的 ISP 協(xié)議
CW32 MCU開(kāi)發(fā)資料匯總(手冊(cè)、工具、固件庫(kù))
應(yīng)用筆記(二)| 武漢芯源CW32自舉程序中使用的ISP協(xié)議
cw32和stm32的區(qū)別
cw32和gd32的區(qū)別
應(yīng)用筆記-CW32 自舉程序中使用的 ISP 協(xié)議
如何使用新版本J-Flash編程CW32 MCU?
【教程】CW32串口flash編程工具分享
評(píng)論