Keil软件全面掌握(持续补充)
Options for Target 工程目标选项
- Devie设备
Target目标
1 晶振频率:用于仿真调试用,硬件调试不用管这个。
2 操作系统: 是否选择Keil自带的 RTX 操作系统
3 系统预览文件: 一般是默认使用系统自带,不选择自己定义的。
4 ROM存储地址: ROM存储指的是程序储存的地址,片外、片内两种。程序存储在片内好理解(一般下载程序都是下载到片内FLASH),片外存储程序一般都是项目做大了,或有特殊要求时,片内不够使用了才将程序存储在片外。
5 RAM存储地址:RAM存储地址和ROM道理一样,可以分片内和片外。
6 浮点单元(FPU):STM32F4 系列微控制器具有浮点单元(FPU),但默认情况下可能未启用浮点运算支持。 应用程序中使用了浮点数,确保在 Keil 中启用了浮点单元支持。
7 使用交叉模块优化、使用微库
8 生成代码所选择的编译器
Output输出
1 输出路径:输出路径就是在工程编译的过程中,输出这些文件保存的文件夹。(Keil V5一般默认是保存在Objects文件夹下面)
2 输出可执行文件名 :输出的可执行文件和库的名称就是在这里定义名称
3 输出可执行文件:和输出库是二选一
Debug Infomation:输出调试信息。勾选上这个选项,我们才可以进行调试。
Create HEX File:输出可执行Hex文件
Browse Information:输出浏览信息。勾选上这个我们才能使用go to definition of这个功能
4 输出库:和输出可执行文件是二选一 , 提示:这里输出(生成)的是静态库,并非动态库
- Listing列表
1 输出路径、宽高 :选择列表文件输出的文件夹。可设置文件页面的宽度,长宽。
2 输出汇编列表: 勾选上会输出汇编列表信息(产生后缀为 .lst的文件)。如果工程中没汇编文件,则不会输出信息。
3 C编译列表 :C编译程序列表选项,勾选上可生成.txt, .i文件。
4 链接列表 :可选择生成或禁止生成.map文件。可设置生成代码的详细信息。可选择性的选取输出MAP文件。
- User用户
分析map
2 Section Cross References 指各源文件生成的模块间的相互引用关系。
例如下
main.c文件编译生成的模块main.o中调用了adc.c文件编译生成的模块adc.o z中的ADC1_Handler句柄。
main.o(i.main) refers to adc.o(.bss) for ADC1_Handler
其他的也差不多都是这个意思。
3. Removing Unused input sections from the image 将未使用的函数之类的删除,以减少image映像的大小。
4. Image Symbol Table 映像中涉及的符号表,包括局部符号(Local Symbols)和全局符号(Global Symbols)
KEIL
快捷键
默认快捷键 | 快捷键 |
---|---|
剪切整行 | Ctrl + L |
大小写变换 | Ctrl / Ctrl+Shirt + U |
自由选择范围 | Alt+Shirt+鼠标光标 |
跳转书签 | F12 |
缩进 | Tab |
取消缩进 | Shirt+Tab |
设置 | 自定义快捷键 | 快捷键 |
---|---|---|
Edit:Insert/Remove Bookmark | 书签 | Ctrl + E |
Edit:Go to Next Bookmark | 跳转书签 | Ctrl + Shift + E |
Edit:Clear ALL Bookmark | 清理所有书签 | Ctrl + Shift +Alt + E |
Edit:Advanced:Comment Selection | 多行注释 | Ctrl + Q |
Edit:Advanced:UnComment Selection | 取消多行注释 | Ctrl + W |
Edit:Outing:Collapse ALL Definitions | 全部折叠 | Ctrl +Shift+ Q |
Edit:Outing:Expand ALL Definitions | 全部展开 | Ctrl +Shift+ W |
实用小技巧
- 关闭编译声音
project > options for target>user选项卡最下面有个beep when compelet去掉钩就行了
- 除去L16警告
黑色背景
复制进 global.prop 里
# properties for all file types
indent.automatic=1
virtual.space=0
view.whitespace=0
view.endofline=0
code.page=936
caretline.visible=1
highlight.matchingbraces=1
print.syntax.coloring=1
use.tab.color=1
create.backup.files=0
auto.load.ext.modfiles=0
save.prj.before.dbg=0
save.files.before.dbg=0
function.scanner.project=1
function.scanner.files=1
function.scanner.modules=1
# properties for c/cpp files
syntax.colouring.cpp=1
use.tab.cpp=0
tabsize.cpp=3
line.margin.visible.cpp=1
fold.cpp=1
monospaced.font.cpp=1
# properties for asm files
syntax.colouring.asm=1
use.tab.asm=0
tabsize.asm=4
line.margin.visible.asm=1
monospaced.font.asm=1
# properties for other files
use.tabs=0
tabsize=4
line.margin.visible.txt=0
monospaced.font.txt=1
# setting for code completion and syntax check
cc.autolist=1
cc.highlightsyntax=1
cc.showparameters=1
cc.triggerlist=1
cc.triggernumchars=3
cc.enter.as.fillup=0
cc.usealpha4inactcode=1
cc.alphavalue=50
# autosave for editor files
autosave=0
autosave.interval=5
# vertical edge at right margin
edge.mode=0
edge.column=80
# Specification for text selection and caret line
selection.fore=#000000
selection.back=#86C7F7
caret.fore=#FFFFFF
caret.back=#400000
# Color for vertical edge
edge.colour=#00FF00
# C/C++ Editor files
template.cpp="#define","#define |";"#if","#if |\r\n\r\n#endif";\\
"#include","#include ";"Header","// Header:\r\n// File Name: |\r\n// Author:\r\n// Date:\r\n";\\
"continue","continue;";"do","do\r\n{\r\n\t// TODO: enter the block content here\r\n\t\r\n\t|\r\n} while ();\r\n";\\
"enum","enum |\r\n{\r\n\t\r\n};\r\n";"for","for(|;;)\r\n{\r\n}";\\
"fpointer_type","typedef int (* |F)();\r\n";"function","void function(|)\r\n{\r\n\r\n}\r\n";\\
"if","if (|)";"ifelse","if (|)\r\n{\r\n}\r\nelse\r\n{\r\n}";\\
"struct","struct | \r\n{\r\n\r\n};\r\n";"switch","switch (|)\r\n{\r\n\tcase:\r\n\t\tbreak;\r\n\tcase:\r\n\t\tbreak;\r\n\tdefault:\r\n\t\tbreak;\r\n}";\\
"void","void | ();\r\n";"while","while (|)\r\n{\r\n}";\\
font.monospace.cpp=Courier New
style.cpp.32=font:Courier New,size:12,fore:#F8F8F8,back:#0B161D
style.cpp.4=font:Courier New,size:12,fore:#FF3A83,back:#0B161D
style.cpp.10=font:Courier New,size:12,fore:#FFAA00,back:#0B161D
style.cpp.1=font:Courier New,size:12,fore:#00FF00,back:#0B161D
style.cpp.2=font:Courier New,size:12,fore:#1E9AE0,back:#0B161D
style.cpp.5=font:Courier New,size:12,fore:#FFAA00,back:#0B161D,bold
style.cpp.6=font:Courier New,size:12,fore:#55E439,back:#0B161D
style.cpp.11=font:Courier New,size:12,fore:#F8F8F8,back:#0B161D
style.cpp.9=font:Courier New,size:12,fore:#FFAA00,back:#0B161D
style.cpp.7=font:Courier New,size:12,fore:#55E439,back:#0B161D
style.cpp.34=font:Courier New,size:12,fore:#500000,back:#20FFFF
style.cpp.35=font:Courier New,size:12,fore:#FF0000,back:#FFFFFF
style.cpp.16=font:Courier New,size:12,fore:#B00040,back:#0B161D
style.cpp.12=font:Courier New,size:12,fore:#000000,back:#E0C0E0
style.cpp.86=font:Courier New,size:12,fore:#696969,back:#FFFFFF
# Asm Editor files
font.monospace.asm=Courier New
style.asm.32=font:Courier New,size:16,fore:#F8F8F8,back:#0B161D
style.asm.1=font:Courier New,size:16,fore:#1E9AE0,back:#0B161D
style.asm.2=font:Courier New,size:16,fore:#FF3A83,back:#0B161D
style.asm.3=font:Courier New,size:16,fore:#FFAA00,back:#0B161D
style.asm.4=font:Courier New,size:16,fore:#FFAA00,back:#0B161D
style.asm.5=font:Courier New,size:16,fore:#F8F8F8,back:#0B161D
style.asm.6=font:Courier New,size:16,fore:#FFAA00,back:#0B161D
style.asm.7=font:Courier New,size:16,fore:#0000FF,back:#0B161D
style.asm.9=font:Courier New,size:16,fore:#FFAA00,back:#0B161D
style.asm.10=font:Courier New,size:16,fore:#FFAA00,back:#0B161D
style.asm.11=font:Courier New,size:16,fore:#007F00,back:#0B161D
style.asm.12=font:Courier New,size:16,fore:#55E439,back:#0B161D
style.asm.8=font:Courier New,size:16,fore:#FFAA00,back:#0B161D
# Editor Text files
font.monospace.txt=Courier New
style.txt.32=font:Courier New,size:14,fore:#FFFFFF,back:#000000
编译提示
KEIL 编译警告
警告编号 | 含义 | 英文提示 |
---|---|---|
C202 | 未定义标识符 | undefined identifier |
C206 | 没有包含引用函数的头文件 | missing function-prototype |
C129 | ||
C235 | 条件编译#ifndef忘记写#endif | |
C316 | 235 | unterminated conditionals |
C249 | 数据段过长 | SEGMENT TOO LARGE |
C280 | 定义变量,后面没有赋值 | ‘check_value’: unreferenced local |
C318 | 打不开 | can’t open file |
C290 | 函数有返回值的类型,但你却没有返回一个值 | |
C173 | 函数定义了返回值,但在实现时没有返回实际值 | missing return-expression |
L16 | 某些被定义的函数,没有被使用 | uncalled segment |
L1 | 未解决的外部文件 | UNRESOLVED EXTERNAL SYMBOL |
L2 | 提到L1问题,没有添加头文件 | REFERENCE MADE TO UNRESOLVED EXTERNAL |
L25 | 数据类型不同 | DATA TYPES DIFFERENT |
L104: | 重复定义 | MULTIPLE PUBLIC DEFINITIONS |
MDK 编译警告
警告编号 | 含义 | 英文提示 |
---|---|---|
#1295D | 函数加个void | Deprecated declaration |
#550-D | 没有使用 | |
#177-D | 声明但从未提及 | |
#47-D | 重复定义 | |
#1-D | 需要换新行,c语言新行结束 | last line of file ends without a newline |
解决 编译警告
--diag_suppress=177,1295,550
J-Link
J-Link是SEGGER公司为支持仿真ARM内核芯片推出的JTAG仿真器。配合IAR EWAR,ADS,KEIL,WINARM,RealView等集成开发环境支持所有ARM7/ARM9/ARM11,Cortex M0/M1/M3/M4, Cortex A5/A8/A9等内核芯片的仿真,与IAR,Keil等编译环境无缝连接
J-link调试软件命令
工具 | 功能 |
---|---|
J-link JTAGLoad | |
J-Mem | |
J-link STR9 Commander | |
J-link STM32 Unlock | |
J-link RTT Viewer | |
J-link RTT Logger | |
J-link RTT Client | |
J-link Registration | |
J-link RDI Config | |
J-link License Manager | |
J-link GDB Server | |
J-link DLL Updater | |
J-link Configurator | |
J-Flash SPI |
J-link Commander 调试工具
命令 | 功能 | 备注 |
---|---|---|
h | 停止运行 | |
s | 单步目标芯片 | |
g | go运行 | |
mem32 | 读取32位数据 | mem32 0x08000000 1 |
r | 重启 |
J-Flash 读Flash数据
1、使用J-Flash读单片机的Flash数据
2、使用J-Flash下载程序到单片机