目錄
- 環境搭建與安裝
- 基礎入門:第一個項目
- 項目管理與配置
- 調試技術詳解
- 高級應用與優化
- 常見問題與解決方案
一、環境搭建與安裝
1.1 系統要求
- 操作系統:Windows 7/8/10/11(64位推薦)
- 處理器:Intel Pentium 4 或更高
- 內存:最低2GB,推薦4GB或以上
- 硬盤空間:至少2GB可用空間
1.2 軟件安裝步驟
步驟1:下載安裝包
- 訪問Keil官方網站下載MDK安裝包(MDK5xx.EXE)
- 或從國內鏡像/雲盤獲取安裝包(注意驗證文件完整性)
步驟2:安裝主程序
- 右鍵點擊安裝程序,選擇"以管理員身份運行"
- 點擊 Next 進入安裝嚮導
- 勾選 "I agree to all the terms..." 接受許可協議,點擊 Next
- 修改安裝路徑(建議改為D盤等非系統盤,如
D:\Keil_v5),點擊 Next - 填寫註冊信息(可隨意填寫):
- First Name: 任意
- Last Name: 任意
- Company: 任意
- Email: 任意格式
- 點擊 Next 開始安裝,等待進度條完成
- 取消勾選 "Show Release Notes",點擊 Finish
步驟3:軟件註冊(License激活)
- 打開Keil uVision5,點擊菜單 File → License Management
- 複製 CID(Computer ID)框中的代碼
- 運行註冊機程序(需管理員權限),將CID粘貼到對應位置
- Target選擇 ARM,Prof. Developers選擇 Professional
- 點擊 Generate 生成許可證代碼(LIC)
- 複製LIC代碼,粘貼到Keil的 New License ID Code (LIC) 框中
- 點擊 Add LIC,顯示 "LIC Added Successfully" 即激活成功
步驟4:安裝設備支持包(DFP)
Keil採用Pack機制管理不同廠商的芯片支持:
- 打開Keil,點擊工具欄 Pack Installer 圖標(或菜單 Project → Manage → Pack Installer)
- 在左側 Devices 欄選擇芯片廠商(如STMicroelectronics)
- 在右側選擇具體芯片系列(如STM32F1 Series)
- 點擊 Install 按鈕安裝對應的DFP(Device Family Pack)
- 等待安裝完成,關閉Pack Installer
國內用户提示:Pack下載可能較慢,可提前從Keil官網下載
.pack文件,雙擊本地安裝
二、基礎入門:第一個項目
2.1 創建新項目(以STM32為例)
步驟1:新建工程
- 打開Keil uVision5,點擊菜單 Project → New uVision Project...
- 選擇項目保存路徑(建議新建專用文件夾,如
D:\Projects\LED_Blink) - 輸入項目名稱(如
LED_Blink),點擊 保存
步驟2:選擇目標設備
- 在 Select Device for Target 對話框中展開廠商列表
- 選擇 STMicroelectronics → STM32F1 Series → STM32F103C8
- 點擊 OK 確認
步驟3:添加啓動文件和庫
- 彈出 Manage Run-Time Environment 對話框
- 勾選必要組件:
- CMSIS → CORE(核心支持)
- Device → Startup(啓動文件)
- Device → GPIO(如需使用GPIO)
- 點擊 Resolve 自動解決依賴關係
- 點擊 OK 完成配置
步驟4:創建源文件
- 在 Project 窗口中右鍵點擊 Source Group 1
- 選擇 Add New Item to Group 'Source Group 1'...
- 選擇 C File (.c),命名為
main.c - 點擊 Add 創建文件
步驟5:編寫第一個程序(LED閃爍)
#include "stm32f10x.h"
// 簡單延時函數
void delay_ms(uint32_t ms) {
for(uint32_t i = 0; i < ms * 8000; i++) {
__NOP(); // 空操作指令
}
}
int main(void) {
// 使能GPIOC時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// 配置PC13為推輓輸出
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStruct);
while(1) {
GPIO_SetBits(GPIOC, GPIO_Pin_13); // LED滅
delay_ms(500);
GPIO_ResetBits(GPIOC, GPIO_Pin_13); // LED亮
delay_ms(500);
}
}
2.2 編譯與下載
編譯項目
- 點擊工具欄 Build 按鈕(或按 F7)
- 查看 Build Output 窗口,確認 "0 Error(s), 0 Warning(s)"
- 生成的.hex文件位於項目目錄的
Objects文件夾中
下載到開發板
- 連接ST-Link調試器到電腦和開發板
- 點擊工具欄 Options for Target 按鈕(或按 Alt+F7)
- 切換到 Debug 標籤,選擇 ST-Link Debugger
- 點擊 Settings,確認Port為 SW(Serial Wire)
- 點擊 OK 保存設置
- 點擊 Download 按鈕(或按 F8)下載程序
- 觀察開發板LED是否開始閃爍
三、項目管理與配置
3.1 工程選項詳細配置(Options for Target)
Target選項卡
- Xtal (MHz):設置外部晶振頻率(如8.0MHz)
- Operating system:選擇是否使用RTOS(如RTX)
- System Viewer File:指定SVDF文件用於外設寄存器查看
Output選項卡
- Create HEX File:勾選生成.hex文件用於燒錄
- Browse Information:勾選啓用代碼瀏覽和跳轉
- Select Folder for Objects:指定編譯輸出目錄
C/C++選項卡(關鍵配置)
- Define:添加預定義宏,如:
USE_HAL_DRIVER(使用HAL庫)STM32F103xB(芯片型號定義)
- Optimization:優化級別選擇
- Level 0:無優化(調試推薦)
- Level 3:最高優化(發佈版本)
- C99 Mode:勾選啓用C99標準支持
- Include Paths:添加頭文件搜索路徑(如
./Inc,./Drivers)
Debug選項卡
- Use Simulator:使用軟件仿真(無需硬件)
- Use Debugger:選擇硬件調試器(ST-Link/J-Link/ULINK等)
- Settings:配置調試接口參數(SWD/JTAG)
3.2 多文件項目管理
文件組織結構建議
Project/
├── Core/
│ ├── Inc/ # 頭文件
│ └── Src/ # 源文件
├── Drivers/ # 庫文件
├── Middleware/ # 中間件
├── Startup/ # 啓動文件
└── Output/ # 編譯輸出
添加文件到工程
- 在Project窗口右鍵點擊目標組(如 Source Group 1)
- 選擇 Manage Project Items...
- 點擊 Add Files... 選擇.c/.s文件
- 或使用 Add New Group 創建新的文件組(如
Drivers,Middleware)
3.3 使用Run-Time Environment(RTE)
RTE是Keil MDK的軟件組件管理系統:
- 點擊 Project → Manage → Run-Time Environment
- 瀏覽可用的軟件組件:
- CMSIS:核心支持、DSP庫、NN庫
- Device:啓動文件、外設驅動
- Keil Middleware:文件系統、網絡、USB協議棧
- Board Support:板級支持包
- 勾選所需組件,點擊 Resolve 自動檢查依賴
- 點擊 OK 自動添加文件到工程
四、調試技術詳解
4.1 基礎調試操作
啓動調試會話
- 點擊 Debug → Start/Stop Debug Session(或按 Ctrl+F5)
- 或點擊工具欄 Debug 按鈕進入調試模式
斷點設置
- 設置/取消斷點:在代碼行號左側單擊,或右鍵選擇 Insert/Remove Breakpoint
- 條件斷點:右鍵斷點選擇 Breakpoint Properties...,設置條件表達式(如
i == 100) - 臨時斷點:設置後執行一次自動刪除
單步執行
- Step Over (F10):執行當前行,不進入函數內部
- Step Into (F11):執行當前行,進入函數內部
- Step Out (Ctrl+F11):執行完當前函數,返回調用處
- Run to Cursor (Ctrl+F10):運行到光標所在行
4.2 變量與內存查看
Watch窗口(變量監視)
- 進入調試模式後,打開 View → Watch Windows → Watch 1
- 在 Name 列輸入變量名(如
counter,GPIOA->IDR) - 按 Enter 顯示當前值,可實時觀察變量變化
- 支持表達式:如
(float)adc_value / 4096 * 3.3
Memory窗口(內存查看)
- 打開 View → Memory Windows → Memory 1
- 在地址框輸入地址(如
0x20000000查看SRAM) - 支持多種顯示格式:Hex、ASCII、Float等
- 可直接修改內存值(雙擊數值)
寄存器查看
- 打開 View → Registers Window 查看CPU寄存器
- 打開 View → Peripherals 查看外設寄存器(需正確配置SVD文件)
4.3 高級調試功能
邏輯分析儀(Logic Analyzer)
- 打開 View → Analysis Windows → Logic Analyzer
- 點擊 Setup... 添加觀察信號
- 輸入變量名或地址(如
PORTA,0x4001080C) - 設置顯示類型(Bit、Analog等)
- 運行程序,實時觀察波形變化
調用棧(Call Stack)
- 打開 View → Call Stack Window 查看函數調用層級
- 雙擊函數名可跳轉到對應代碼位置
- 用於分析程序崩潰時的調用路徑
串口調試(Serial Window)
- 打開 View → Serial Windows → UART #1
- 自動捕獲程序中UART1的輸出數據
- 也可用於模擬輸入數據到串口
五、高級應用與優化
5.1 編譯優化配置
優化級別選擇
在 Options for Target → C/C++ → Optimization 中選擇:
| 級別 | 説明 | 適用場景 |
|---|---|---|
| Level 0 | 無優化,調試信息最完整 | 開發調試階段 |
| Level 1 | 基本優化,保留大部分調試信息 | 初步優化測試 |
| Level 2 | 高優化,可能影響調試 | 性能測試階段 |
| Level 3 | 最高優化,調試信息可能丟失 | 最終發佈版本 |
代碼大小優化技巧
- 勾選 One ELF Section per Function:刪除未使用的函數
- 使用
__attribute__((unused))標記可能未使用的變量 - 啓用 Link-Time Optimization (LTO)(如編譯器支持)
5.2 使用Middleware中間件
Keil MDK-Professional提供豐富的中間件組件:
添加中間件步驟
- 打開 Manage Run-Time Environment
- 選擇 Keil Middleware 類別
- 勾選需要的組件:
- File System:FAT文件系統支持
- Network:TCP/IP協議棧
- USB Device:USB設備協議棧
- USB Host:USB主機協議棧
- GUI:圖形用户界面(emWin)
- 配置組件參數(通過對應的配置文件)
- 編寫應用代碼調用API
示例:添加FAT文件系統
#include "rl_fs.h"
// 初始化文件系統
fsInitialize();
// 掛載SD卡
fsMount("M0:", "SD:");
// 文件操作
FILE *fp = fopen("M0:test.txt", "w");
fprintf(fp, "Hello Keil!\n");
fclose(fp);
5.3 腳本編程與自動化
使用調試腳本(.ini文件)
創建調試配置文件實現自動化操作:
// debug.ini 示例
FUNC void Setup(void) {
SP = _RDWORD(0x08000000); // 設置棧指針
PC = _RDWORD(0x08000004); // 設置程序計數器
XPSR = 0x01000000; // 設置xPSR
}
FUNC void GPIO_Init(void) {
_WDWORD(0x40021018, 0x00000010); // 使能GPIOC時鐘
_WDWORD(0x40011004, 0x00100000); // 配置PC13
}
Setup(); // 調用初始化函數
GPIO_Init();
在 Options for Target → Debug → Initialization File 中指定該腳本。
自定義編譯後操作
在 Options for Target → User 標籤中配置:
- Run #1:編譯前執行的命令
- Run #2:編譯後執行的命令
- 示例:自動生成.bin文件
fromelf --bin --output output.bin output.axf
六、常見問題與解決方案
6.1 安裝與註冊問題
| 問題 | 解決方案 |
|---|---|
| 註冊時提示 "LIC is invalid" | 確認CID複製完整(無空格),檢查註冊機Target選擇是否正確 |
| Pack安裝失敗 | 以管理員身份運行Keil,或手動下載.pack文件雙擊安裝 |
| 找不到設備 | 確認已安裝對應廠商的DFP包,重啓Keil |
6.2 編譯錯誤
| 錯誤提示 | 解決方案 |
|---|---|
| "undefined symbol" | 檢查是否添加了對應的.c文件到工程,或缺少庫文件 |
| "cannot open source input file" | 在C/C++選項中添加正確的Include Paths |
| "No space in execution regions" | 芯片Flash/RAM不足,優化代碼或更換大容量型號 |
| "multiple definition" | 檢查是否有重複定義的變量或函數,使用extern聲明 |
6.3 調試問題
| 問題 | 解決方案 |
|---|---|
| 無法連接調試器 | 檢查接線(SWDIO/SWCLK/GND),確認驅動已安裝,重啓調試器 |
| 程序不運行或跑飛 | 檢查啓動文件是否正確,向量表地址配置,時鐘配置 |
| 斷點無效 | 確認代碼已編譯並下載,優化級別設為0,檢查Flash斷點數量限制 |
| 變量值顯示異常 | 檢查變量是否被優化(volatile聲明),確認作用域正確 |
6.4 中文顯示與編碼
-
編輯器中文亂碼:
- 點擊 Edit → Configuration → Editor
- Encoding選擇 Chinese GB2312 (Simplified) 或 UTF-8
-
printf輸出中文亂碼:
- 確保串口工具編碼與Keil一致
- 使用
printf("%s", "中文\r\n");格式
附錄:學習資源
官方資源
- Keil官方文檔中心:www.keil.com/support/man_docs.asp
- Keil學習平台:www.keil.com/learn(視頻教程)
推薦書籍
- 《ARM Cortex-M3與Cortex-M4權威指南》
- 《嵌入式系統設計與實踐》
國內社區
- 正點原子、野火電子等STM32教程
- CSDN、知乎Keil相關專欄
本手冊基於Keil官方Getting Started指南及行業實踐經驗編寫,涵蓋從軟件安裝、基礎項目創建、調試技巧到高級中間件應用的完整學習路徑。建議初學者按照章節順序實踐,每個階段都確保掌握後再進入下一階段。