STM32開發(fā) -- Keil基本使用
一、keil主界面詳解
打開一個工程文件,可以看到如下的界面:
下面我們就一一來介紹下。為了講解專門找到一個keil漢化補丁。也是夠夠的了。
這里的漢化為了方便講解,實際工作中建議還是用英文版本。
下載:keil 4漢化包
1、菜單欄
文件
其中需要注意的是 License Management,破解時需要在這里輸入。
編輯
視圖
工程
閃存
調(diào)試
外圍設(shè)備(仿真)
工具
2、工具欄
文件操作
新建文件夾 Ctrl + N
打開文件 Ctrl + O
保存當(dāng)前文件 Ctrl + S
保存所有文件 無
剪切 Ctrl + X
復(fù)制 Ctrl + C
粘貼 Ctrl + V
文件編輯跳轉(zhuǎn)
撤銷編輯 Ctrl + Z
恢復(fù)編輯 Ctrl + Y
跳轉(zhuǎn)到上一步 Ctrl + -
跳轉(zhuǎn)到下一步 Ctrl + Shift + -
書簽
添加書簽 Ctrl + F2
跳轉(zhuǎn)到上一個書簽 Shift + F2
跳轉(zhuǎn)到下一個書簽 F2
清空所有書簽 Ctrl + Shift + F2
選中行操作
插入縮進(Tab) Tab
取消縮進(Tab) Shift + Tab
確定注釋 無
取消注釋 無
查找文本
查找所有文本 Ctrl + Shift + F
查找文本輸入框 無
查找單個文本 Ctrl + F
增加搜索 Ctrl + I
調(diào)試
打開/關(guān)閉調(diào)試 Ctrl + F5
插入斷點 F9
失能單個斷點 Ctrl + F9
失能所有斷點 無
取消所有斷點 Ctrl + Shift + F9
窗口配置
窗口 無
配置 無
有時會遇到,復(fù)制到keil編輯器中的漢字出現(xiàn)亂碼。
解決方法:
configuration 選項對話框中將 ENCODING 框中設(shè)置成 Chinese GB2312
編譯
編譯當(dāng)前文件(單個) Ctrl + F7
編譯目標文件(修改過的) F7
編譯所有目標文件(重新編譯) 無
編譯多個工程文件(多工程) 無
停止編譯 無
下載軟件 F8
工程選項
工程目標選擇框 無
工程目標選項(配置) Alt + F7
工程項目管理
單工程管理 無
多工程管理 無
管理運行時環(huán)境 無
選擇軟件包 無
安裝軟件支持包 無
二、工程配置
1、首先打開目標選項
2、目標選項介紹
如下的界面,我們來逐一介紹一下各個選項。
Device (設(shè)備)
選擇你所使用的芯片類型
Target (項目)
第1處:晶振頻率。
這個值主要用于仿真調(diào)試用,一般我們使用硬件調(diào)試可以不用管這個值。
第2處:操作系統(tǒng)。
很好理解,是否選擇Keil自帶的RTX操作系統(tǒng),一般我們都不選。
第3處:系統(tǒng)預(yù)覽文件。
這里我們一般是默認使用系統(tǒng)自帶,不選擇自己定義的。
第4處:使用交叉模塊優(yōu)化、使用微庫。
交叉模塊一般我們不使用,微庫這個功能常用與printf函數(shù)。
第5處:ROM存儲地址。
這里的ROM存儲指的是程序儲存的地址,分片外和片內(nèi)兩種。
程序存儲在片內(nèi)好理解(初學(xué)者一般下載程序都是下載到片內(nèi)FLASH),片外存儲程序?qū)τ诔鯇W(xué)者來說比較少見,一般都是項目做大了,或有特殊要求時,片內(nèi)不夠使用了才將程序存儲在片外。常見使用片外的例子“外部NorFlash存儲程序代碼”就會用到片外的存儲地址。
Read/Only MemoryAreas:填寫的是程序的存放地址。起始地址:0x800,0000,這款芯片的flash大小為512K,也就是有0x80000個地址空間。
Read/Write Memory/Areas: 填寫的是程序運行起來的內(nèi)存空間。
起始地址:0x2000,0000,大小為64K,也就是0x1000個地址空間。
Flash和Sram的大小是從器件手冊上查見的。
第6處:RAM存儲地址。
RAM存儲地址和ROM道理一樣,可以分片內(nèi)和片外。常見例子“外部SRAM作為運行內(nèi)存”。
Output(輸出)
第1處:輸出路徑。
輸出路徑就是在工程編譯的過程中,輸出這些文件保存的文件夾。Keil V5一般默認是保存在Objects文件夾下面,我建立工程一般也使用這個默認的路徑?!酒鋬?nèi)容可以全部刪除,最好配置在單獨一個文件夾下面,代碼備份時方便刪除】
第2處:輸出可執(zhí)行文件名。
輸出的可執(zhí)行文件和庫的名稱就是在這里定義。比如我們常見輸出Hex文件,其名稱就是這里定義的。
第3處:輸出可執(zhí)行文件(重點)。
這里和輸出庫是二選一,選擇了輸出可執(zhí)行文件就不能選擇輸出庫。重要一點:輸出這些信息都很費時間,如果都不勾選這些選項,編譯速度會很快。
**Debug Infomation:**輸出調(diào)試信息。勾選上這個選項,我們才可以進行調(diào)試。
**Create HEX File:**輸出可執(zhí)行Hex文件,很多初學(xué)的朋友問:“在哪里設(shè)置生成Hex?”,這里勾選上就行了。
**Browse Information:**輸出瀏覽信息。勾選上這個我們才能使用go to definition of這個功能。很多人問:“為什么我不能跟蹤代碼了”,原因就在這里。
第4處:輸出庫。
拓展一點:這里輸出(生成)的是靜態(tài)庫,并非動態(tài)庫。初學(xué)者可以不用去理解。
Listing(清單)
第1處:輸出路徑、寬高。
選擇列表文件輸出的文件夾??稍O(shè)置文件頁面的寬度,長寬。
第2處:輸出匯編列表。
勾選上會輸出匯編列表信息(產(chǎn)生后綴為 .lst的文件)。如果工程中沒匯編文件,則不會輸出信息。
第3處:C編譯列表。
C編譯程序列表選項,勾選上可生成.txt, .i文件。
第4處:鏈接列表。
可選擇生成或禁止生成.map文件??稍O(shè)置生成代碼的詳細信息??蛇x擇性的選取輸出MAP文件。
User(用戶)
第1處:編輯之前運行用戶程序。
第2處:編譯之前運行用戶程序。
第3處:編譯之后運行用戶程序。
如果想生成*.bin格式的文件:
選中 Run #1,在后邊的文本框中輸入fromelf.exe –bin -o ./bin/test.bin ./test.axf
第4處:編譯之后執(zhí)行條件。
Beep When Complete:編譯完成發(fā)出聲音;
Start Debugging:啟動調(diào)試程序。
C/C++選項
第1處:預(yù)處理(Preprocessor Symbols)
這里主要就是預(yù)定義功能,相當(dāng)于在程序中的#define xxxx。
我上面預(yù)定義STM32F10X_HD,在stm32f10x.h文件中就不用定義了。
第2處:語言代碼生成(Language / Code Generation)
Language/code Generation語言代碼生成,可以理解成編譯、鏈接到最后生成代碼。這部分功能對于代碼優(yōu)化比較重要,初學(xué)者可以不用過多理解,對代碼大小、運行速度等性能要求較高的人就需要深入理解
Optimization:優(yōu)化選擇項,有Level0 - Level3四個選項。
【設(shè)置編譯器命令行:-Onum】
初學(xué)者、在線調(diào)試建議使用Level0,也就是不優(yōu)化,這樣執(zhí)行的效果才和代碼一樣。如果配置成Level3,在線調(diào)試可能有些地方優(yōu)化而不能打斷點。
Optimize for Time:優(yōu)化時間,即優(yōu)化代碼中費時的地方。
【設(shè)置編譯器命令行:-Otime】 --split_sections
比如有些算法,本身代碼量就比較大,運行需要很長時間(假如需要2秒),這個時候勾選上該功能,會發(fā)現(xiàn)運行時間有比較明顯的減少(或許不到1秒時間)。
Split Load and Store Multiple:加載和存儲多個分裂。
【設(shè)置編譯器命令行:–split_ldm】
非對齊數(shù)據(jù)采用多次訪問方式。當(dāng) LMD/STM 指令有 4 個以上產(chǎn)生時,列分裂LMD 和 STM 指令,以減不中斷延遲。
One ELF Section per Function:優(yōu)化每一個函數(shù) ELF 段(建議都勾選上)。
【設(shè)置編譯器命令行:–split_sections】
每個函數(shù)都會產(chǎn)生一個 ELF 段,勾選上,允許優(yōu)化每一個 ELF 段。這個選項可以減少潛在的共享地址、數(shù)據(jù)和函數(shù)之間的字符串。
直白的意思:可以減少代碼量ROM的大?。▋?nèi)存RAM不會減?。?。
舉一個例子,勾選之前和勾選之后,編譯后存儲大小對比:
勾選之前:
Program Size: Code=2540 RO-data=336 RW-data=40 ZI-data=1024
勾選之后:
Program Size: Code=908 RO-data=320 RW-data=40 ZI-data=1024
Strict ANSI C:標準(嚴格)的ANSC。
【設(shè)置編譯器命令行:–strict】
也就是說:編譯時嚴格按照標準的ANSI C進行檢查。
Enum Container always int:枚舉總是int型
【設(shè)置編譯器命令行:–enum_is_int】
很容易理解,我們枚舉時成員變量類型為int型。
Plain Char is Signed:純字符標記為字符。
【設(shè)置編譯器命令行:–signed_chars】
代碼舉例:char a[] = “abcd”; 也就是說將“abcd”標記為字符型。
Read-Only Position Independent:為常量生成獨立的代碼空間。
【設(shè)置編譯器命令行:–apcs=/ropi】
比如:我們定義字庫變量為常量,勾選該選項,會將這些字庫變量放在獨立的代碼空間。
Read-Write Position Independent:為可讀寫代碼生成獨立的代碼空間。
【設(shè)置編譯器命令行:–apcs=/rwpi】
Warnings:警告
【No Warnings設(shè)置編譯器命令行:-W】
No Warnings:不會有警告提示和輸出;
All Warnings:所有警告提示和輸出。
Thumb Mode:Thumb模式。
指定設(shè)置文件或文件夾(組)為Thumb模式。
【注意:在工程中該模式為默認,也就是不能選擇】
No Auto Includes:不自動添加頭文件(一般不勾選)。
不勾選該選項,編譯器就會在Keil安裝路徑尋找你工程中.h文件。
舉例:我們定義uint8_t是定義在stdint.h文件里面的,但是我們工程目錄下一般是沒有stdint.h文件。這時候,編譯器就會在Keil路徑下去尋找stdint.h文件。
C99 Mode:C99標準模式。
【設(shè)置編譯器命令行:–c99】
C語音有標準有多個版本,如C89、C90、C99等。
第3處:包含路徑(Include Paths)
包含路徑是使用Keil(及類似)軟件必須掌握的一項。包含路徑就是指定我們工程中使用文件所在的位置,讓編譯器找到相應(yīng)的文件。是初學(xué)者、高級軟件工程師都必須掌握的一項。
第4處:多功能控件(Misc Controls)
指定沒有單獨的對話框控件。例如:錯誤消息用日本語言來顯示消息?!静怀S谩?/p>
第5處:編譯器控制字符串(Compiler control string)
這里是針對編譯器執(zhí)行的命名,顯示當(dāng)前在編譯器命令行指令。
在上面“第2處:語言代碼生成”中有一個中括號【設(shè)置編譯器命令行:】
里面的命名就顯示在這里。
Asm
第1處:有條件的裝配控制符號(Conditional Assembly Control Symbols)
指定匯編條件,這里類似上一章節(jié)C/C++選項中的預(yù)處理。
第2處:語言代碼生成(Language / Code Generation)
Read-Only Position Independent:為常量生成獨立的代碼空間。
Read-Write Position Independent:為可讀寫代碼生成獨立的代碼空間。
Thumb Mode:Thumb模式。
Split Load and Store Multiple:加載和存儲多個分裂。
Execute only Code:只生成執(zhí)行代碼;
No Auto Includes:不自動添加頭文件(一般不勾選)。
第3、4處同上
Linker(連接器)
第1處:使用分散文件加載對話框Target頁面(Use Memory Layout from Target Dialog)
Make RW Sections Position Independent:使RW段獨立。
【設(shè)置編譯器命令行:–rwpi】
啟用時:變量區(qū)域(包含RW和ZI)具有獨立地址。
禁用時:變量區(qū)域(包含RW和ZI)位于絕對的內(nèi)存地址。
Make RO Sections Position Independent:使RO段獨立。
【設(shè)置編譯器命令行:–ropi】
啟用時:常量和代碼區(qū)域(RO)具有獨立地址。
禁用時:常量和代碼區(qū)域(RO)位于絕對的內(nèi)存地址。
Don’t Search Standard Libraries:不搜索標準庫。
【設(shè)置編譯器命令行:–noscanlib】
禁用默認編譯器運行時庫的掃描。
Report ‘might fail’ Conditions as Errors:報告’might fail’條件認為是錯誤。
【設(shè)置編譯器命令行:–strict】
報告的條件可能導(dǎo)致失敗的錯誤,而不是警告。
X/O Base:X/O基地址。
【設(shè)置編譯器命令行:–xo_base=address】
R/O Base:R/O基地址。
【設(shè)置編譯器命令行:–ro_base=address】
R/W Base:R/W基地址。
【設(shè)置編譯器命令行:–rw_base=address】
disable Warnings:警用警告。
【設(shè)置編譯器命令行:–diag_suppress】
第2處:分散文件(Scatter File)
這里可以加載、查看和編輯分散文件。點擊后面就的三點“…”可以加載文件;點擊“Edit…”查看和編輯對應(yīng)的文件。
Debug(調(diào)試)
第1處:選擇硬件在線調(diào)試
下載調(diào)試器的選擇不用多說,主要說一下后面“Setting”。
很多人常用J-Link下載調(diào)試器,而調(diào)試STM32時,可以使用四線SWD模式。如果使用J-Link進行SWD調(diào)試。這個時候就需要在“Setting”里面選擇“SW”模式,如下如:
第2處:選擇硬件在線調(diào)試
Load Application at Startup:啟動時加載應(yīng)用程序。
Run to main():程序執(zhí)行到main()函數(shù)。
進入調(diào)試模式時,程序自動運行到main函數(shù)處。
Initialization File:加載、編輯初始化文件。
第3處:復(fù)位調(diào)試會話設(shè)置(Restore Debug Session Settings)
這里復(fù)位設(shè)置就是恢復(fù)設(shè)置的意思,如果勾選上,點擊一下“復(fù)位”就會恢復(fù)到之前的狀態(tài)。包括:斷點Breakpoints、窗口Watch Windows、性能分析器 Performance Analyzer、內(nèi)存窗口Memory Window、工具箱Toolbox、系統(tǒng)查閱器System Viewer等。
第4處:DLL文件(最好默認)
這里的配置屬于Keil自身的配置,最好不要修改。
CPU/Driver DLL - Parameter:CPU驅(qū)動文件和參數(shù)。
Dialog DLL - Parameter:會話框DLL文件和參數(shù)。
Utilities(功能)
第1處:配置FLASH菜單命名(Configure Flash Menu Command)
這里是二選一選項,一般我們使用上面的“Update Target Driver for Flash Programming”。
Use Debug Driver:使用調(diào)試驅(qū)動。
Update Target Before Debugging:調(diào)試之前更新目標。
一般都勾選上,因為我們下載程序之前檢測到代碼修改了,就會重新編譯程序(也就是更新目標)
Setting:設(shè)置。
很多人下載程序之后,需要復(fù)位一下程序才運行,原因在于沒有勾選“Reset and Run”,如下圖:
再有這里需要注意,選擇好自己屬于自己的芯片。
我的是STM32F103RC,根據(jù)命名規(guī)則可知 Flash大小 256K,如果不是還需 add
第2處:配置圖像文件的處理(Configure Image File Processing)
這個選項我們不常用,感興趣的朋友可以自行了解一下。
三、軟件設(shè)置
上面這是提了一下,,復(fù)制到keil編輯器中的漢字出現(xiàn)亂碼。
接下來,詳細看一下 Configuration
這里面,我能想到的地方:TAB首行縮進的、更改字體,其他默認。
所以接下來我們只看一個 Editor 就好了。
第1處:General Editor Settings
Encoding:編碼方式選擇。建議選擇 Chinese GB2312
Keil提供十幾種編碼方式供大家選擇,一般我們選擇標準的:Dncode in ANSI.Auto Indent:自動縮進。
也就是換行時自動縮進(對齊)功能,提供3個選項。
None:不對對齊,光標每次換行在第一列。
Smart:靈活對齊(常用)。包含大括號自動對齊。
Block:光標對齊于前一行。
Virtual Spaces:虛擬空間。
光標在上下移動時不管有沒有“空間”都對齊。也就是說光標可以在任何位置。
View White Space:顯示空白(空格)。
也就是顯示一個點為空格。
View End of Line:顯示結(jié)束行。
也就是在行結(jié)束位置顯示換行符
第5處:C/C++ & ASM & Other File
Use syntax coloring:使用語法顏色。不使用語法就等于txt文本那種純黑色
Insert spaces for tabs:符插入空格。
Tab Size:Tab符大小。一個Tab符占幾個空格。
Show Line Numbers:顯示行數(shù)。
Use monospaced Font:使用等寬字體。
Open with Outlining:打開倫廓。
三、編譯、調(diào)試
1、編譯
調(diào)試之前先要編譯
編譯當(dāng)前文件(單個) Ctrl + F7
編譯目標文件(修改過的) F7
編譯所有目標文件(重新編譯) 無
編譯多個工程文件(多工程) 無
停止編譯 無
下載軟件 F8
2、調(diào)試
打開調(diào)試
打開/關(guān)閉調(diào)試 Ctrl + F5
插入斷點 F9
失能單個斷點 Ctrl + F9
失能所有斷點 無
取消所有斷點 Ctrl + Shift + F9
二、調(diào)試工具欄
打開調(diào)試,出現(xiàn)了調(diào)試工具欄
1、復(fù)位,全速運行,停止運行
復(fù)位:讓程序復(fù)位到起點,調(diào)試設(shè)置恢復(fù)到初始狀態(tài)。
全速運行(F5):可以讓程序運行??催\行狀態(tài),也可以在特定位置打斷點,讓程序運行到特定位置,查看運行狀態(tài)。
停止運行:程序全速運行時(有效),點擊該按鈕可讓程序停止運行。
2、運行光標
這些操作,與打斷點和全速運行(F5)結(jié)合著使用。
單步調(diào)試
單步調(diào)試(F11)也就是每點一次按鈕,程序運行一步,遇到函數(shù)會跳進函數(shù)**執(zhí)行。
逐步調(diào)試
逐行調(diào)試(F10)也就是每點一次按鈕,程序運行一行,遇到函數(shù)跳過函數(shù)**執(zhí)行。
跳出調(diào)試
運行到光標處(Ctrl + F10)即將光標放在某一行,點擊該按鈕(或Ctrl + F11),程序執(zhí)行到光標的位置就會停止下來(前提是程序能執(zhí)行到光標的位置)。
跳轉(zhuǎn)到暫停行
這個功能在程序停止運行時有效,主要的作用就是我們打開了很多文件,不知道將程序翻到哪里去了,點擊改按鈕即可知道我們的程序暫停在那個位置。
3、調(diào)試窗口
有兩種方式打開
這里只介紹幾個常用的。
觀察器窗口(Watch Windows)
常用于查看變量的窗口
存儲器窗口(Memory Windows)
查看該存儲器地址的值得變化
串口窗口(Serial Windows)
查看外設(shè)寄存器數(shù)值的窗口
本文轉(zhuǎn)自如下鏈接,并由本公眾號修改匯總,版權(quán)歸作者。
https://blog.csdn.net/qq_29350001/article/details/80396955
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!