
在前面的基礎(chǔ)上開始建立 FLASH 目標(biāo)。
打開工程管理面板:
新建目標(biāo),然后可以發(fā)現(xiàn)右邊的 group 和 Files 自動將 Simulation 目標(biāo)的內(nèi)容復(fù)制過來了,注意這只是它們的包含關(guān)系,并不是將實(shí)際的文件進(jìn)行了復(fù)制(在實(shí)際的文件夾中你會發(fā)現(xiàn) main.c 文件還是只有一個)。點(diǎn)擊 OK,即完成了目標(biāo)的創(chuàng)建。(可以拖動工程目標(biāo)、組、文件以更改排列順序,不過在一個目標(biāo)里更改,另一個目標(biāo)也會進(jìn)行相應(yīng)的更改)
這樣一來,在一個工程內(nèi)就存在兩個目標(biāo)了:Simulation & Flash(Debug)。如下圖:
注意兩個目標(biāo)之間的文件關(guān)系是一樣的,如果將一個目標(biāo)文件移除,那么另一目標(biāo)也會移除。比如說在 Flash(Debug) 目標(biāo)中將 main.c 通過以下方式移除。
那么在 Simulation 中也會顯示已移除該文件。
那么文件都一樣,這樣兩個目標(biāo)有什么用呢?據(jù)我所知有兩種方式可以得到兩個不同的目標(biāo):
1、
增加宏定義
在 Options 中增加宏定義(事實(shí)上 Options 的所有設(shè)置都是針對所選擇的目標(biāo)而言的,比如當(dāng)前 Flash(Debug)目標(biāo)的 Options 更改了,另外一個目標(biāo) Simulation 是不會改變的)。
但是使用宏定義的前提是你的代碼中必須有相關(guān)的切換代碼,比如宏定義 ENABLE_USART1,那么代碼必須能夠根據(jù)這個宏來分別編譯的你的代碼,否則的話,你設(shè)置的這個宏將沒有一點(diǎn)意義。注意,在 Options 中定義的宏是全局有效的,也就是說你,目標(biāo)內(nèi)的所有文件都能識別到這個宏,所以這個宏必須是獨(dú)一無二的才可。
2、
配置文件屬性
通過如下方法可以配置文件的屬性,可以讓你的文件不屬于某一個目標(biāo),這樣它就不會參與編譯了。
打開文件的 Options
去掉 Include in Target Build 勾選(再介紹一下另外幾個選項(xiàng):是否總是編譯、總是不編譯、改變時編譯。如果有工程比較龐大,編譯速度很慢,而有些代碼一般情況下是不修改的,如官方庫函數(shù),此時也可以去掉 Always Build 勾選,這樣它就不會總是編譯了,事實(shí)上如果你使用點(diǎn)擊“全部編譯”按鈕的話,它還是會對它們進(jìn)行編譯):
然后你可以看到你的文件增加了下面這樣一個圖標(biāo)(一個文件的 Options 是否是默認(rèn)的配置,可以通過這個文件圖標(biāo)來看出,灰色部分表示文件和默認(rèn)的 Options 不一致,如果看到了這個標(biāo)志,而這個工程你又不熟悉,那么最好打開文件的 Options 選項(xiàng)看看到底有何不同才是,而紅色標(biāo)志表示這個文件已不包含在目標(biāo)里了,不會參與編譯):
之前說過在目標(biāo)的 Options 的宏定義是影響目標(biāo)文件的,那么有沒有讓你的宏定義只設(shè)置單獨(dú)對一個文件有效呢?有,就是在文件的 Options 的 C/C++ 界面中設(shè)置即可。
這樣你設(shè)置的宏定義只對本文件有效。
查看一個文件是否定義(或識別)了某一個宏定義,可以在對應(yīng)的文件內(nèi)加入以下宏來確定一個定義是否存在于這個文件中。比如看一個文件是否認(rèn)識 Debug 這個宏:
這樣如果這個文件能識別 Debug,那么就會在編譯窗口輸出警告,如果這個定義很關(guān)鍵,也可以輸出 error 信息,如 #error ?“Debug is defined”,這樣你就不得不重視它了。因?yàn)槿绻悴辉O(shè)法解決掉這個錯誤的話,是不能輸出目標(biāo)文件的。
這些都是基本的知識,接下來繼續(xù)設(shè)置和 Simulation 不一樣的目標(biāo)。
Flash(Debug)目標(biāo)和 Simulation 目標(biāo)最大的區(qū)別就是下載。和 RAM 目標(biāo)不同,掉電不會消失,因?yàn)檫@個目標(biāo)的代碼是會下載到 Flash(Debug)中的。
這個是配置下載的 FLASH 地址和 RAM 地址,一般采用默認(rèn)即可。如果你需要固件升級功能則需要修改這里。
在 Debug 選項(xiàng)中選擇硬件調(diào)試,調(diào)試工具選擇 ST-Link,勾選 Run to main(),這樣下載完成后自動運(yùn)行到 main 函數(shù)中。為了充分利用 KEIL 強(qiáng)大的調(diào)試功能,需要添加如下參數(shù):
TARMSTM.DLL
-pSTM32F103RE
現(xiàn)在進(jìn)入 Setting 界面。如果連接了 ST-Link,那么這里是會顯示信息的。并且我一般使用串行下載,所以選擇 SW 模式。其他默認(rèn)即可。
再看另一個 Trace 選項(xiàng),這個是用來進(jìn)行代碼和數(shù)據(jù)跟蹤的。????詳情看這里:ITM調(diào)試
然后是 Flash Download 選項(xiàng):
一般來說都會勾選 Reset and Run,這樣下載后就會自動運(yùn)行,否則你只能重新上電或者按復(fù)位按鍵才能運(yùn)行程序了。而添加的編程算法最好和實(shí)際的芯片容量一致,比如 STM32F103RET6 FLASH 大小為 512K,這里就選擇這個。當(dāng)然這個編程算法我記得是可以自己編寫的,以后有時間可以研究一下。
這樣一來,F(xiàn)lash(Debug)目標(biāo)就算完成了。
現(xiàn)在需要在上面版本的基礎(chǔ)上再增加一個 Release 版本,就是用于產(chǎn)品代碼正式發(fā)布的版本,這個版本要求運(yùn)行效率高,所以可以從兩個方面入手:參數(shù)檢查功能關(guān)閉和提高代碼的優(yōu)化程度。
但是現(xiàn)在有個問題,就是已經(jīng)有兩個目標(biāo)了,如何才能在 Flash(Debug)目標(biāo)基礎(chǔ)上建立而不是在 Simulation 基礎(chǔ)上建立呢?
通過選擇當(dāng)前目標(biāo)即可:
通過以上四步即可在 Flash(Debug)目標(biāo)的基礎(chǔ)上增加一個 Flash(Release)目標(biāo)了。
目標(biāo)建立好了,現(xiàn)在首先關(guān)閉該目標(biāo)的參數(shù)檢查功能。先選擇當(dāng)前目標(biāo)為 Flash(Release),然后進(jìn)行配置:
還可以通過以下方法設(shè)置當(dāng)前目標(biāo):
這樣一個新的目標(biāo)就誕生了。但是因?yàn)檫@個目標(biāo)的代碼優(yōu)化級別更高,代碼量更少,所以如果代碼書寫不嚴(yán)謹(jǐn),那么可能就會出現(xiàn)問題,主要可能就是有的數(shù)據(jù)沒有使用 volatile 申明,那么代碼運(yùn)行過程中就可能出現(xiàn)問題,這一點(diǎn)要引起注意,如果在 Debug 版本運(yùn)行沒有問題,但是在 Release 版本出現(xiàn)了問題,很可能是這個原因。
提前看文章,歡迎關(guān)注公眾號:魚鷹談單片機(jī)