通過網盤分享的文件:cw32外部flash下載算法源碼.zip
鏈接: https://pan.baidu.com/s/1-svjiviNAkuxRShuk0rNEg?pwd=CW32 提取碼: CW32
文件說明
2.cw32l012_exflash_down 為cw32平臺下的實際測試工程源代碼
3.cw32l012_w25qxx.FLM 為生成的FLM下載文件
Q:什么是外部flash 下載算法?
外部flash或者內置的片上flash,都是編譯器通過調用寫好的FLM文件來實現下載,單片機內部的安裝pack包就會有(官方實現),外部flash的情況比較復雜,例如用的哪種flash,用的什么接口,都是不定的,沒有辦法寫好一個通用的下載算法,這里也只是介紹一個通用的方法,實際需要按情況修改。
注意本例程的FLM文件信息如下
1.基于CW32L012
2.使用W25Q128作為外置flash
3.使用SPI3 資源,IO 分配為
SPI3_CS PA8
SPI3_SCK PA9
SPI3_MISO PA10
SPI3_MOSI PA11
4.額外使用了一個開關IO ,PA6 為打開外設的電源控制IO
5.本案例用的外部16mz晶振
Q:外部flash對單片機的性能有要求嗎?
沒有太大要求。下載算法是加載到RAM中的,對flash 沒有要求,RAM通常4K或者以上就可以運行下載算法(當然你的代碼要簡潔)。例如你的RAM是4K 你的下載算法生成的代碼空間就要小于4K,8K就小于8K。
Q:為什么需要外部flash算法?
外部flash算法是用來節省內部flash空間的,在一些應用中,圖片數據,字模數據比較占用單片機內存空間,在內存小的單片機中,是存不下這些數據的,通過在一些設置和下載算法,可以將工程中的常量保存到外部flash。
Q:為什么不用其他方式對外部flash下載數據?
1.用文件系統方式。會增加復雜度,增加性能占用。對于性能低的單片機,需要快速傳輸的數據不適合再走文件系統的接口。
2.用其他方法直接下載數據,比如專門下載數據的工程,或者專門的編程器,這些方案是可以,但是一方面是下載就非常麻煩,另一方面是對于數據的絕對地址管理起來費勁。
下載算法實現需要準備:
1.官方單片機的庫文件(或者準備一個工程模板)
2.對應的flash驅動文件
3.Keil對于下載算法編寫的工程模板
具體步驟大致分為以下幾步
1.復制keil官方下載算法工程,同時復制FlashOS.H文件到工程根目錄,然后還需要去配置對應的單片機型號,添加CMSIS的核心文件,最后修改一下文件包含路徑使其能編譯。編譯器最好用AC6,選擇代碼空間優化。





2.修改flashDev.C中的文件,使其符合實際應用需求

3.添加對應單片機的庫文件并編譯,注意:
a.因為下載算法生成的是與位置無關的代碼,添加進去的所有文件,所有函數都會參與編譯,因此只可以添加需要的文件,文件中有用不到的函數還需要屏蔽!!!
b.注意不需要啟動文件!!!

▲這里只添加用的到的文件

▲這里大部分用不到的代碼都屏蔽
4.添加對應型號的flash驅動,并能正常編譯

▲Spi 底層外設初始化Nor flash 驅動函數
5.編寫初始化my_main函數,初始化外設,并能正常編譯


6.編寫flashPrg.c文件,需要實現以下函數,有缺失的自行補齊。這一步是最關鍵的,最核心的。
http://a.int Init (unsigned long adr, unsigned long clk, unsigned long fnc)

http://b.int UnInit (unsigned long fnc)

http://c.int EraseChip (void)

http://d.int EraseSector (unsigned long adr)

http://e.int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf)

http://f.int BlankCheck (unsigned long adr,unsigned long sz,unsigned char pat)

g.unsigned long Verify(unsigned long adr,unsigned long sz,unsigned char *buf)

對應為初始化、去初始化、全片擦除、扇區擦除、扇區寫入、擦除檢測、校驗。
以上這些函數都要有,但函數內部有些可以不去實現。
正常編譯到這一步就完成了。
7.配置編譯文件輸出路徑
cmd.exe /C copy "Objects%L" ".@L.FLM"
cmd.exe /C copy ".@L.FLM" "C:user_appkeil5ARMFlash@L.FLM"
注意:第二條的路徑和keil安裝路徑有關,需要根據實際情況修改。

8.正常編譯結果如下

下載算法使用
1.添加下載算法

2.配置下載算法所使用的RAM空間大小為實際RAM的大小

3.將需要放到外部flash的資源獨立一個c文件保存,并配置存儲地址
例如下圖測試文件,定義兩個const類型的字符串,指定存儲地址為0x9000000開始。

4.編譯查看是否分配到外置flash上
如下圖,識別到一個16M的外置flash,已經使用了3.66%,實際數據是一些圖片數據,一共有600K字節。

5.如何讀取這個數據呢
和普通spi flash 一樣,仍然要發送命令的方式來讀取,只不過地址為顯性的一個地址,也不需要人為去記。
例如下面這個測試程序
定義了兩個const類型的數據,數據讀取時,直接取地址符取出編譯器分配的地址,然后減去一個基地址偏移0x90000000,然后得到的地址就是實際nor flash 需要發送訪問的地址


6.實際測試串口打印驗證
如下圖的測試結果,地址就是我們要求的0x9000000開始的,數據讀出來的也是實際存儲的數據

-
單片機
+關注
關注
6074文章
45368瀏覽量
664662 -
FlaSh
+關注
關注
10文章
1720瀏覽量
154831 -
算法
+關注
關注
23文章
4764瀏覽量
97310 -
編譯器
+關注
關注
1文章
1670瀏覽量
51138
發布評論請先 登錄
在STLinkV2用下載算法將程序下載到外部flash報錯怎么解決?
堅持繼續布局32位MCU,進一步完善產品陣容,96Mhz主頻CW32L012新品發布!
studio有沒有通過更改下載算法,同時下載到內部flash和外部flash?
**CW32L012****開發評估板的第一個程序**
CW32L012小型機器人控制評估板活動 四足機器人+智能小車 開箱評測
首創CW32L083GCC工程模版
ubuntu下面用vscdoe實現CW32L031的工程創建、編譯、下載與調試
STM32H750外部Flash下載算法的資料和工程文件免費下載
工程師筆記|通過 KEIL 制作 QSPI 接口的外部 Flash 下載算法
CW32L052 FLASH存儲器
堅持繼續布局32位MCU,進一步完善產品陣容,96Mhz主頻CW32L012新品發布!
使用芯源CW32的CW32L012開發評估板做了spi屏幕驅動
CW32L012小機器人的電機控制

CW32L012實現外部flash下載算法
評論