1. 程式人生 > >STM32晶片開發之新增外接NOR FALSH擴充套件程式碼空間

STM32晶片開發之新增外接NOR FALSH擴充套件程式碼空間

網上查了很多資料,但都很零碎不是很完整,這裡我係統總結一下從0開始建立一個使用外部NOR Flash的程式的方法。

Nor Flash是通過FSMC匯流排可以直接讀寫的Flash儲存器,掉電不丟失,相比NandFlash成本高,容量小,但可以作為程式儲存器使用,即可以直接在NorFlash上執行程式碼,NandFlash雖然也可以執行程式碼,在至少在STM32中是不支援的,可能ARM7都是不支援的。

STM32本身Flash容量較小,不能建立大型專案,或者在程式碼中有大量資料時就不夠用了,至少在我一直STemWin時就不能全開所有的Demo程式,很不爽。當然你將資料儲存在SD卡或Flash中在通過修改程式碼實現資料的讀取,但中會有直接讀取陣列方便嗎?而且讀取資料也不能一次全部讀出來,不然RAM又不夠用了,得分多次讀,不然就得在外擴RAM,怎麼都沒有以程式碼形式讀取NorFlash方便。

所有就有了這篇文章。

如果要在NorFlash中執行程式碼或放置資料要分下面幾個步驟:

1.生成可以通過JTAG燒寫程式碼到NorFlash的演算法。

2.配置MDK環境,設定外部ROM地址,長度,並新增第一步生成的Flash演算法。

3.配置需要放置在NorFlash中的程式碼選項。

下面再詳細解說一下這些步驟的實現。

這裡以SST39VF160為例。

1. 生成可以通過JTAG燒寫程式碼到NorFlash的演算法

1)      新建一個工作目錄,如:SST39VF160。

2)      將x:\Keil_v5\ARM\Flash\STM32F10x\下的所有檔案拷貝到SST39VF160目錄下。

x是你的MDK安裝的碟符,Keil_v5是你MDK安裝的目錄,老版本是Keil。


     3)      將x:\Keil_v5\ARM\Flash\SST39x160x\下的FlashPrg.c檔案拷貝到SST39VF160目錄下,覆蓋同名檔案。

4)      將x:\ Keil_v5\ARM\Flash\下的FlashOS.h檔案拷貝到SST39VF160目錄下。

5)      開啟STM32Fx.uvprojx專案

6)      開啟檔案FlashDev.c和FlashPrg.c將#include "..\FlashOS.H"改為#include "FlashOS.H"


7)      開啟x:\Keil_v5\ARM\Flash\SST39x160x目錄下的FlashDev.c檔案,其他型號Flash要開啟對於型號的目錄。MDK型號很全,應該都能找到。

8)      複製下面程式碼到FlashDev.c檔案,複製在#include "FlashOS.H"一行後面。


然後修改如下


其中主要注意兩點,一是增加巨集定義SST39x160x,這個隨你喜好起名,只要後面用到時跟這個一致就行。二是將基地址由0x000000改為0x64000000,這個是STM32連線NorFlash的地址,如果你的不是就按照你的實際情況修改。

另外還要修改FlashPrg.c檔案,其中Nor Flash是16位還是8位模式,一定要搞清楚,尤其是在傳送命令和寫資料時。

Nor Flash是掛在FSMC總線上的,該演算法要有FSMC匯流排的初始化,且要寫在初始化函式裡。即

int Init (unsigned long adr, unsigned long clk, unsigned long fnc)

{

base_adr = adr;

FSMC_NOR_Init();

return (0);

}

FSMC_NOR_Init()要你自己寫。

SST39x160x的程式碼如下:

/*

 *  Initialize Flash Programming Functions

 *    Parameter:      adr:  Device Base Address

 *                    clk:  Clock Frequency (Hz)

 *                    fnc:  Function Code (1 - Erase, 2 - Program, 3 - Verify)

 *    Return Value:   0 - OK,  1 - Failed

 */

void FSMC_NOR_Init(void)

{

RCC->AHBENR|=1<<8;       //使能FSMC時鐘    

RCC->APB2ENR|=1<<5;      //使能PORTD時鐘

RCC->APB2ENR|=1<<6;      //使能PORTE時鐘

 RCC->APB2ENR|=1<<7;      //使能PORTF時鐘

RCC->APB2ENR|=1<<8;      //使能PORTG時鐘   

//PORTD複用推輓輸出      

GPIOD->CRH&=0X00000000;

GPIOD->CRH|=0XBBBBBBBB; //D8,9,10,11,12,13,14,15

GPIOD->CRL&=0XFF00FF00;

GPIOD->CRL|=0X00BB00BB; //D0,1,4,5          

//PORTE複用推輓輸出      

GPIOE->CRH&=0X00000000;

GPIOE->CRH|=0XBBBBBBBB; //E8,9,10,11,12,13,14,15

GPIOE->CRL&=0X00000FFF;

GPIOE->CRL|=0XBBBBB000; //E3,4,5,6,7

//PORTF複用推輓輸出

GPIOF->CRH&=0X0000FFFF;

GPIOF->CRH|=0XBBBB0000;  //F12,13,14,15                                                                                         

GPIOF->CRL&=0XFF000000;

GPIOF->CRL|=0X00BBBBBB;  //F0,1,2,3,4,5

//PORTG複用推輓輸出 PG9->NE2                                                                                    

GPIOG->CRH&=0XFFFFFF0F;

GPIOG->CRH|=0X000000B0; //G9

       GPIOG->CRL&=0XFF000000;

GPIOG->CRL|=0X00BBBBBB;//G0,1,2,3,4,5                               

FSMC_Bank1->BTCR[2] =0X00001059;

FSMC_Bank1->BTCR[3] =0X10100705;

FSMC_Bank1E->BWTR[2]=0X0FFFFFFF;

}

然後,開啟專案屬性


按照下面的示意圖修改

修改ROM1地址


修改輸出檔名,當然你不想改也可以,改了只是方便以後查詢識別

定義預編譯巨集定義

完成這些之後進行編譯,就會得到SST39x160x.FLM檔案,將其複製到x:\Keil_v5\ARM\Flash目錄中。

到此我們就有了燒寫SST39VF160的算符檔案。

以後我們就可以選到SST39VF160晶片,如下圖


2. 配置MDK環境,設定外部ROM地址,長度,並新增第一步生成的Flash演算法。

新建一個專案或開啟你現有的專案,不過你的專案一定要有你的NorFlash的初始化程式碼,不然放在NorFlash中的程式碼還是不能執行。

在你的專案中在用的NorFlash的程式碼前必須完成對NorFlash的初始化。

下面介紹一下MDK環境的設定

1)  開啟專案屬性,設定ROM1的地址,注意ROM1不要打鉤。


2)  選擇Norflash晶片





到此MDK環境設定就可以了

3 .配置需要放置在NorFlash中的程式碼選項。

選中你想要放置在NorFlash中的程式碼檔案,或資料夾,右鍵,選中屬性設定。


將Code/Const選則到外部NorFlash上。


這樣的這個檔案的程式碼將會下載到NorFlash中。

也可以通過修改分散檔案的方式實現



到此,你的程式就可以在內部Flash和外部的NorFlash中運行了。

當然一定要在使用前初始化NorFlash。

相關推薦

STM32晶片開發新增NOR FALSH擴充套件程式碼空間

網上查了很多資料,但都很零碎不是很完整,這裡我係統總結一下從0開始建立一個使用外部NOR Flash的程式的方法。 Nor Flash是通過FSMC匯流排可以直接讀寫的Flash儲存器,掉電不丟失,相比NandFlash成本高,容量小,但可以作為程式儲存器使用,即可以直接在

微信小程序開發普通鏈二維碼

arr 生成 手動 cti == rod decode html 官方   本文主要介紹掃普通鏈接二維碼打開小程序,   詳情請看官方文檔https://mp.weixin.qq.com/debug/wxadoc/introduction/qrcode.html 配置普

009-Ambari二次開發新增自定義元件Redis(二)

上一篇我們主要介紹了Ambari新增元件的答題流程並以REDIS為例說明了流程,本篇在上一篇的基礎上,進一步完善說明流程並介紹如何給元件新增metric 掃描二維碼,關注BearData,獲取最新文章 上篇中,我們已經制作出了redis的rpm包,並重新編譯了我們修改後的Ambar

008-Ambari二次開發新增自定義元件Redis(一)

Ambari目前支援的元件有HDFS、YARN、HBase、Hive、Pig、ZooKeeper、Sqoop、Storm、Flume、Tez、Oozie、Falcon、Storm、Altas、Knox、Spark、Ranger、Mahout、Kerberos等,已經涵蓋了從大資料應用的

車機開發新增自定義鍵

S700平臺即安卓5.1.1系統新增額外的自定義鍵值按鍵: 在Android的原生系統中鍵值預設情況下是92個,從0-91;一般情況下,這些鍵值是夠用的,但是如果想擴充的話,還是需要新增新的鍵值的;像我們做車機專案的,新增新按鍵鍵值太易見了,比如將倒車檢測做成新自定義鍵值按鍵,我們需要到多個

Spring boot配置的Tomcat ( 五 )

1.新建專案Spring Initializr,選擇war方式,勾選需要的模組 2.File->Project Structure->Modules 建立webapp 3.建立web.xml,修改成web專案路徑 4.新增外部tomcat

十一、SpringBoot使用的Servlet容器及啟動原理

一、嵌入式和外接Servlet容器對比 嵌入式Servlet容器:應用打成可執行的jar ​優點:簡單、便攜; ​缺點:預設不支援JSP、優化定製比較複雜; 外接的Servlet容器:外面安裝Tomcat---應用war包的方式打包; 二、使用外接的Servlet容

Discuz!開發新增後臺選單和後臺頁面

在 ./source/admincp/menu/ 目錄下建立 menu_mynav.php 檔案 在“管理中心-全域性”中加一個專案,需要在 menu_mynav.php 中給 $menu['global'] 陣列變數,為其新增一個鍵值。如: $menu['global']

mysql 建立資料庫新增建出錯問題總結

建立資料庫新增外建的時候,遇到了如下錯誤,由此總結一下給表新增外建的條件 ERROR 1215 (HY000): Cannot add foreign key constraint1.  兩個欄位的型別或者大小不嚴格匹配。例如,如果一個是int(10),那麼外來鍵也必須設定

IntelliJ Idea外掛開發新增自定義庫(Library)

在一些程式碼工程沒有用ivy,maven這些庫檔案管理工具,jar包要麼和工程檔案放在一起或是存在本地的目錄中然後通過開發工具匯入。還有一種就是庫檔案打包在中介軟體中,開發時需要引入,不方便用ivy,maven進行依賴管理,這時候可能就需要開發一個IntelliJ Idea外

UEditor二次開發新增自定義按鈕

需求 現狀描述:目前預覽正文內容只是文字框放大的樣式 優化方向:建議點選預覽可直接預覽門戶介面的樣式 也就是現狀我們呼叫的是Ueditor自帶的預覽功能,而需求中的預覽功能則相當於要我們重寫預覽按鈕 在之前老版本的Ueditor中新增按鈕很麻煩,具體可以參考

PE中新增程式(轉載)

一、增減外接程式        外接程式在光碟的“外接程式”目錄中,對應的配置檔案是該目錄下的 WinPE.INI 刪除程式只須刪除該軟體在外接程式目錄對應的子目錄,再刪除 WinPE.INI 中相應的 LINK 建立快捷方式的語句行即可。         新增程式正好相反,將綠色軟體放到外接程式目錄中,在

IOS開發新增第三方lib或從其他工程引入lib時的連結錯誤:ld: symbol(s) not found for architecture i386

首先要確保正確的新增步驟 1)拷貝到新project目錄下 2)新增到工程裡 3)在新工程的targets->Build Phases->target dependencies 點選+ 新增lib 3) 在新工程的targets->Summary->

app混合開發新增除錯控制檯vconsole

當內嵌在app內的h5頁面出現錯誤時,無法像在電腦一樣按f12除錯,檢視報錯資訊,這時候就可以用上vconsole簡單的用法是:下載 vConsole 的最新版本或者使用 npm 安裝:npm install vconsole/*index.html */ <!--

嵌入式核心及驅動開發學習筆記(四) 規範化程式碼

前面筆者已實現了使用者程式控制led燈閃爍的驅動程式碼,但是由於程式碼不規範,顯得亂七八糟的,因此需要規範化。如果比較大一點的工程沒有規範的話,也不利於後期的跟新與維護。分析先前的程式不規範點有二: 定義的變數多而且散亂 程式沒有錯誤處理機制 C語言雖然是面向過程的語言,但是

onvif開發利用gSOAP生成onvif客戶端程式碼框架

cd gsoap-2.8 ./configure make sudo make install 命令列模式下敲入命令:wsdl2h -V 檢視gSOAP軟體版本,有版本出現則安裝成功。 2. 利用gSOAP生成onvif客戶端程式碼框架 2.1 在當前目錄下

(6)微信二次開發 微信文本消息口實現

微信 odin link 消息處理 nal puts 算法 帳號 接口實現 p.p1 { margin: 13.0px 0.0px 13.0px 0.0px; text-align: justify; font: 16.0px SimSun } p.p2 { margin:

MVC開發排球計分(六)口的實現

tde ron list cat model 封裝 ora sin erl 接口的實現 接口的用途: 接口是契約,它是方法聲明的集合,封裝了一些類共有的行為(方法)。 即裏面定義方法時只寫到參數部分就用分號結束了;必須有某個/些類來實現接口才會有意義。 實現接口

視頻教程免費分享:嵌入式stm32項目開發心率檢測儀的設計與實現

視頻教程免費分享:嵌入式stm32項目開發之心率檢測儀的設計與實現 本課程主要基於心率檢測儀的設計與實現講解STM32開發技術,STM32開發板廣泛應用於儀器儀表、家用電器、醫用設備、航空航天、專用設備的智能化管理、機器人及過程控制等領域,完成數據監控、數據處理、數據傳遞等功

嵌入式開發hi3519---spi nor flash啟動

flash light thread sta 引導 mod 開發 啟動 emmc author:pkf qq:1327706646 1.官方hi3519默認是硬件3byte 地址模式,配置完ddr始終後,sdkv100.020是可以支持正常啟動,用到低位16Mflash