您現在的位置是:首頁 > 棋牌

STM32工程模板建立之 FLASH 目標(四)

  • 由 魚鷹談微控制器 發表于 棋牌
  • 2021-12-26
簡介如果有工程比較龐大,編譯速度很慢,而有些程式碼一般情況下是不修改的,如官方庫函式,此時也可以去掉 Always Build 勾選,這樣它就不會總是編譯了,事實上如果你使用點選“全部編譯”按鈕的話,它還是會對它們進行編譯):然後你可以看到你的

做好的flash怎麼改尺寸

在前面的基礎上開始建立 FLASH 目標。

開啟工程管理面板:

STM32工程模板建立之 FLASH 目標(四)

新建目標,然後可以發現右邊的 group 和 Files 自動將 Simulation 目標的內容複製過來了,注意這只是它們的包含關係,並不是將實際的檔案進行了複製(在實際的資料夾中你會發現 main。c 檔案還是隻有一個)。點選 OK,即完成了目標的建立。(可以拖動工程目標、組、檔案以更改排列順序,不過在一個目標裡更改,另一個目標也會進行相應的更改)

STM32工程模板建立之 FLASH 目標(四)

這樣一來,在一個工程內就存在兩個目標了:Simulation & Flash(Debug)。如下圖:

STM32工程模板建立之 FLASH 目標(四)

注意兩個目標之間的檔案關係是一樣的,如果將一個目標檔案移除,那麼另一目標也會移除。比如說在 Flash(Debug) 目標中將 main。c 透過以下方式移除。

STM32工程模板建立之 FLASH 目標(四)

那麼在 Simulation 中也會顯示已移除該檔案。

STM32工程模板建立之 FLASH 目標(四)

那麼檔案都一樣,這樣兩個目標有什麼用呢?據我所知有兩種方式可以得到兩個不同的目標:

1、

增加宏定義

在 Options 中增加宏定義(事實上 Options 的所有設定都是針對所選擇的目標而言的,比如當前 Flash(Debug)目標的 Options 更改了,另外一個目標 Simulation 是不會改變的)。

STM32工程模板建立之 FLASH 目標(四)

但是使用宏定義的前提是你的程式碼中必須有相關的切換程式碼,比如宏定義 ENABLE_USART1,那麼程式碼必須能夠根據這個宏來分別編譯的你的程式碼,否則的話,你設定的這個宏將沒有一點意義。注意,在 Options 中定義的宏是全域性有效的,也就是說你,目標內的所有檔案都能識別到這個宏,所以這個宏必須是獨一無二的才可。

2、

配置檔案屬性

透過如下方法可以配置檔案的屬性,可以讓你的檔案不屬於某一個目標,這樣它就不會參與編譯了。

開啟檔案的 Options

STM32工程模板建立之 FLASH 目標(四)

去掉 Include in Target Build 勾選(再介紹一下另外幾個選項:是否總是編譯、總是不編譯、改變時編譯。如果有工程比較龐大,編譯速度很慢,而有些程式碼一般情況下是不修改的,如官方庫函式,此時也可以去掉 Always Build 勾選,這樣它就不會總是編譯了,事實上如果你使用點選“全部編譯”按鈕的話,它還是會對它們進行編譯):

STM32工程模板建立之 FLASH 目標(四)

然後你可以看到你的檔案增加了下面這樣一個圖示(一個檔案的 Options 是否是預設的配置,可以透過這個檔案圖示來看出,灰色部分表示檔案和預設的 Options 不一致,如果看到了這個標誌,而這個工程你又不熟悉,那麼最好開啟檔案的 Options 選項看看到底有何不同才是,而紅色標誌表示這個檔案已不包含在目標裡了,不會參與編譯):

STM32工程模板建立之 FLASH 目標(四)

之前說過在目標的 Options 的宏定義是影響目標檔案的,那麼有沒有讓你的宏定義只設置單獨對一個檔案有效呢?有,就是在檔案的 Options 的 C/C++ 介面中設定即可。

STM32工程模板建立之 FLASH 目標(四)

這樣你設定的宏定義只對本檔案有效。

檢視一個檔案是否定義(或識別)了某一個宏定義,可以在對應的檔案內加入以下宏來確定一個定義是否存在於這個檔案中。比如看一個檔案是否認識 Debug 這個宏:

STM32工程模板建立之 FLASH 目標(四)

這樣如果這個檔案能識別 Debug,那麼就會在編譯視窗輸出警告,如果這個定義很關鍵,也可以輸出 error 資訊,如 #error “Debug is defined”,這樣你就不得不重視它了。因為如果你不設法解決掉這個錯誤的話,是不能輸出目標檔案的。

STM32工程模板建立之 FLASH 目標(四)

這些都是基本的知識,接下來繼續設定和 Simulation 不一樣的目標。

Flash(Debug)目標和 Simulation 目標最大的區別就是下載。和 RAM 目標不同,掉電不會消失,因為這個目標的程式碼是會下載到 Flash(Debug)中的。

STM32工程模板建立之 FLASH 目標(四)

這個是配置下載的 FLASH 地址和 RAM 地址,一般採用預設即可。如果你需要韌體升級功能則需要修改這裡。

STM32工程模板建立之 FLASH 目標(四)

在 Debug 選項中選擇硬體除錯,除錯工具選擇 ST-Link,勾選 Run to main(),這樣下載完成後自動執行到 main 函式中。為了充分利用 KEIL 強大的除錯功能,需要新增如下引數:

TARMSTM。DLL

-pSTM32F103RE

現在進入 Setting 介面。如果連線了 ST-Link,那麼這裡是會顯示資訊的。並且我一般使用序列下載,所以選擇 SW 模式。其他預設即可。

STM32工程模板建立之 FLASH 目標(四)

再看另一個 Trace 選項,這個是用來進行程式碼和資料跟蹤的。 詳情看這裡:ITM除錯

然後是 Flash Download 選項:

STM32工程模板建立之 FLASH 目標(四)

一般來說都會勾選 Reset and Run,這樣下載後就會自動執行,否則你只能重新上電或者按復位按鍵才能執行程式了。而新增的程式設計演算法最好和實際的晶片容量一致,比如 STM32F103RET6 FLASH 大小為 512K,這裡就選擇這個。當然這個程式設計演算法我記得是可以自己編寫的,以後有時間可以研究一下。

這樣一來,Flash(Debug)目標就算完成了。

現在需要在上面版本的基礎上再增加一個 Release 版本,就是用於產品程式碼正式釋出的版本,這個版本要求執行效率高,所以可以從兩個方面入手:引數檢查功能關閉和提高程式碼的最佳化程度。

但是現在有個問題,就是已經有兩個目標了,如何才能在 Flash(Debug)目標基礎上建立而不是在 Simulation 基礎上建立呢?

透過選擇當前目標即可:

STM32工程模板建立之 FLASH 目標(四)

透過以上四步即可在 Flash(Debug)目標的基礎上增加一個 Flash(Release)目標了。

目標建立好了,現在首先關閉該目標的引數檢查功能。先選擇當前目標為 Flash(Release),然後進行配置:

STM32工程模板建立之 FLASH 目標(四)

還可以透過以下方法設定當前目標:

STM32工程模板建立之 FLASH 目標(四)

這樣一個新的目標就誕生了。但是因為這個目標的程式碼最佳化級別更高,程式碼量更少,所以如果程式碼書寫不嚴謹,那麼可能就會出現問題,主要可能就是有的資料沒有使用 volatile 申明,那麼程式碼執行過程中就可能出現問題,這一點要引起注意,如果在 Debug 版本執行沒有問題,但是在 Release 版本出現了問題,很可能是這個原因。

推薦閱讀:

STM32工程模板建立之 KEIL 開發平臺設定(一)

喜歡我的筆記就來關注魚鷹吧

Top