【Keil5-萌新指南】创建一个拥有个人风格的Keil5工程模板及一些Keil5的基本设置
<h1>这篇文章将会教你如何创建一个拥有个人风格的Keil5工程模板,同时也介绍一些Keil5的基本设置</h1><h2>第一步 当然是创建一个工程文件夹啦~</h2>
<p><img src="data/attachment/forum/202412/07/212118f8xvbvj0z0d25xvs.png" alt="image-20241207132953272" /></p>
<pre><code>新建完文件夹后,命名一下即可。
</code></pre>
<h2>第二步 细分编译器模式(可以略过)</h2>
<pre><code>对于AI8051U来说,可以支持8位模式(C51)和32位模式(C251),既然是为了创建基础工程模板,我们可以再创建一个细分文件夹,如下可以区分不同的模式:
</code></pre>
<p><img src="data/attachment/forum/202412/07/212117jbydlpvdqbyfxeyr.png" alt="image-20241207133612833" /></p>
<h2>第三步 工程文件分类</h2>
<pre><code>想要获得一个简洁、规整的工程目录,这一步十分重要!!!
</code></pre>
<pre><code>我个人习惯创建"Drivers"(驱动)、"Output"(输出)、"Project"(工程)、"User"(用户)这4类目,当然还会包含一个"keilclean.bat"和"readme.txt"文件。
</code></pre>
<ul>
<li>Drivers:用于存放各种驱动文件,如iic.c、spi.c、i8080.c</li>
<li>Output:用于存放keil5编译时的链接文件和输出文件</li>
<li>Project:用于区分和存放各种编译器的工程文件</li>
<li>User:用于存放用户层的文件</li>
<li>keilclean.bat:清除keil5的链接文件</li>
<li>readme.txt:工程说明文件</li>
</ul>
<p><img src="data/attachment/forum/202412/07/212117o58spvw5lzqr8p5e.png" alt="image-20241207135528362" /></p>
<h2>第四步 进一步细分文件类目</h2>
<pre><code>在第三步进行了一级目录的细分,为了进一步划分文件的用图和类别,再进行二级细分。
</code></pre>
<h3>1、Drivers</h3>
<pre><code>该文件夹主要是用于存放各种驱动文件的,我对各种驱动文件再次做了划分:"BSP"(基础驱动)、"COMM"(官方提供的一些支持文件)、"Hardware"(外设驱动)、"Library"(官方提供的库函数)、"Middlewares"(中间层驱动文件)、"SYS"(系统级底层文件)。
</code></pre>
<p><img src="data/attachment/forum/202412/07/212117t1yz57dde1n01pt5.png" alt="image-20241207140453364" /></p>
<ul>
<li>BSP:存放芯片所支持的各种外设驱动文件,如iic、spi、i8080、pwm、uart等等</li>
</ul>
<p><img src="data/attachment/forum/202412/07/212117oq61nmzueeg1j5a1.png" alt="image-20241207140820626" /></p>
<p><img src="data/attachment/forum/202412/07/212117q9moev94q644d91z.png" alt="image-20241207140859691" /></p>
<ul>
<li>COMM:存放官方提供一些驱动支持包,如usb.h、usb_cdc_32.lib</li>
</ul>
<p><img src="data/attachment/forum/202412/07/212118y7s7zb5l5m7i00ee.png" alt="image-20241207141020189" /></p>
<ul>
<li>Hardware:存放各种硬件外设的驱动文件</li>
</ul>
<p><img src="data/attachment/forum/202412/07/212118ylb4ciwqlww1dlw4.png" alt="image-20241207141105206" /></p>
<p><img src="data/attachment/forum/202412/07/212118grd3a0y3ssmjaiaa.png" alt="image-20241207141117138" /></p>
<ul>
<li>Library:存放库函数支持包</li>
<li></li>
<li>Middlewares:存放各种中间层驱动文件,如RTOS、Modbus等等</li>
<li></li>
<li>SYS:存放系统级调用文件,如config、delay等等</li>
</ul>
<p><img src="data/attachment/forum/202412/07/212118skcnfoaaoaw8ok4f.png" alt="image-20241207141404810" /></p>
<h3>2、Output</h3>
<pre><code>该文件夹主要用于存放编译时的输出文件和链接文件,暂时只接触了Keil5,暂不做细分了
</code></pre>
<h3>3、Projects</h3>
<pre><code>该文件夹主要用于区别各种不同的编译器,如Keil5、SDCC、IAR等等,这里创建了一个"Keil5_C251"的文件夹,代表使用的是Keil5编译器。
</code></pre>
<p><img src="data/attachment/forum/202412/07/212119mo5aowpfoya0azji.png" alt="image-20241207142122012" /></p>
<h3>4、User</h3>
<p>主要用于存放用户层的文件,如主函数、屏幕界面等等</p>
<h2>第五步 新建Keil5工程</h2>
<pre><code>1、打开Keil5,可以看见是一个空白的界面(也可能是你上一次打开的工程,这个不用在意)
2、选择Project(工程)目录
3、新建一个工程
</code></pre>
<p><img src="data/attachment/forum/202412/07/212331jszop47fap7mccxf.png" alt="image-20241207134120179" /></p>
<pre><code>4、找到刚刚创建的工程文件夹,创建一个工程名,保存即可
</code></pre>
<p><img src="data/attachment/forum/202412/07/212332lrspw6lzdr766j7w.png" alt="image-20241207142715156" /></p>
<pre><code>5、更换芯片支持包为STC MCU,找到对应的芯片型号,这里是AI8051U-32bit
</code></pre>
<p><img src="data/attachment/forum/202412/07/212332eqxmmxkfmmrlmnn5.png" alt="image-20241207142845444" /></p>
<p><img src="data/attachment/forum/202412/07/212332yybraal6dlcpaqaq.png" alt="image-20241207142919165" /></p>
<pre><code>6、成功创建工程
</code></pre>
<p><img src="data/attachment/forum/202412/07/212332i8g4vqd45vkv55vl.png" alt="image-20241207144611493" /></p>
<pre><code>注:其中工程名称是不能修改的了。
目标名称文件夹名称可以修改,也可以创建多个
自定义文件夹名称可以修改,也可以创建多个
</code></pre>
<h2>第六步 优化细分工程内文件目录</h2>
<pre><code>可以参考第三步、第四步进行分类。这里点开一个类似箱子堆的图标。
</code></pre>
<p><img src="data/attachment/forum/202412/07/212333ntf1fuwgzf3lf28w.png" alt="image-20241207143859266" /></p>
<pre><code>1、刚打开是这样的,什么都没有,双击名称可以修改名称。
</code></pre>
<p><img src="data/attachment/forum/202412/07/212333bhg0rp7n0zbgs07z.png" alt="image-20241207144707789" /></p>
<p><img src="data/attachment/forum/202412/07/212334woefw8lnr8m3b3mb.png" alt="image-20241207145126642" /></p>
<pre><code>注:第一个类目,貌似可以在同一个工程内,创建多个项目,通过点击"Set as Current Target"进行切换。
</code></pre>
<pre><code>2、第一个类目可以命名成一个项目名称,主要在第二类目中进行分类,最后点击OK即可,大概如下:
</code></pre>
<p><img src="data/attachment/forum/202412/07/212333t9w6sft9twwsfrbf.png" alt="image-20241207145842892" /></p>
<pre><code>3、导入文件(创建文件在后面)
</code></pre>
<pre><code>此时文件夹创建完成了,但是没有任何C文件和H文件
</code></pre>
<p><img src="data/attachment/forum/202412/07/212330of6wn5qmx9mfa6ov.png" alt="image-20241207150022438" /></p>
<pre><code>可以双击对应类目的文件夹进行导入文件
</code></pre>
<pre><code></code></pre>
<p><img src="data/attachment/forum/202412/07/212330qpqz7npx8p0cy8xy.png" alt="image-20241207150127901" /></p>
<pre><code>选择当前工程文件夹下,对应类目的文件夹,一定要确定是当前工程文件路径。(以后复制工程模板时,有可能是在模板工程路径下,然后就会发现莫名其妙的少了一些文件)
</code></pre>
<pre><code></code></pre>
<p><img src="data/attachment/forum/202412/07/212330v5bli5olj97j6d5l.png" alt="image-20241207150239706" /></p>
<pre><code>选择对应的文件,双击导入即可。
</code></pre>
<p><img src="data/attachment/forum/202412/07/212330l5hr62805v2surh5.png" alt="image-20241207150650710" /></p>
<pre><code>此时就可以看见目录中出现了main.c这个文件
</code></pre>
<pre><code></code></pre>
<p><img src="data/attachment/forum/202412/07/212330dsu1aafozf1ffffa.png" alt="image-20241207151501808" /></p>
<pre><code>4、创建文件
</code></pre>
<pre><code>如果没有可以导入的文件怎么办?想创建一个文件重新写
</code></pre>
<pre><code>右键一个文件夹,选择"Add New...."
</code></pre>
<p><img src="data/attachment/forum/202412/07/212332wljzzuufggq7j7tg.png" alt="image-20241207151802125" /></p>
<pre><code>选择需要创建的文件类型,命名后"Add"即可
</code></pre>
<p><img src="data/attachment/forum/202412/07/212332pyctmmfdrjryi2dj.png" alt="image-20241207152436424" /></p>
<pre><code>可以看见出现我们刚刚创建的文件了,接下来就可以愉快的编程啦
</code></pre>
<p><img src="data/attachment/forum/202412/07/212333k8ox7moreiime0g0.png" alt="image-20241207152110615" /></p>
<pre><code>###这里我直接导入已经写好的代码文件,最终效果如下:
</code></pre>
<p><img src="data/attachment/forum/202412/07/212334ucpvwswjmcp4spzg.png" alt="image-20241207153054566" /></p>
<h2>第七步 工程设置(可参考AI8051U手册第6章)</h2>
<pre><code>这一步打开"魔术棒",对工程进行一些设置
</code></pre>
<p><img src="data/attachment/forum/202412/07/212421qqpp3j9rafrpra93.png" alt="image-20241207153256712" /></p>
<h3>1、Target</h3>
<pre><code>根据手册推荐,可以设置成这样
</code></pre>
<p><img src="data/attachment/forum/202412/07/212421spulihu0s888hxxe.png" alt="image-20241207153424138" /></p>
<pre><code>注:80251的指令模式有“Binary”和“Source”两种模式,Ai8051U系列目前只支持“Source”模式由于Ai8051U系列单片机在中断中的压栈和出栈都是4字节模式,建议“4Byte InterruptFrame Size”选项也打上钩
</code></pre>
<pre><code>注:Memory Model是指存储器模式,80251有5种模式:
</code></pre>
<p><img src="data/attachment/forum/202412/07/212422ufoo7hebo5fzed1h.png" alt="image-20241207154158848" /></p>
<pre><code>注:Code Rom Size是指代码大小模式,80251有5种模式:
</code></pre>
<p><img src="data/attachment/forum/202412/07/212422nznhueueosqno6dm.png" alt="image-20241207154518926" /></p>
<h3>2、Output</h3>
<pre><code>设置如下:
</code></pre>
<p><img src="data/attachment/forum/202412/07/212421i9tp7olt8omp007x.png" alt="image-20241207155118671" /></p>
<pre><code>修改输出文件的默认位置
</code></pre>
<pre><code></code></pre>
<p><img src="data/attachment/forum/202412/07/212421ma8hd9pod88qw9i8.png" alt="image-20241207155246095" /></p>
<pre><code>选择一开始创建的"Output"文件夹,确认即可
</code></pre>
<p><img src="data/attachment/forum/202412/07/212422aqnngzay0f1uh9yw.png" alt="image-20241207155414455" /></p>
<h3>3、Listing</h3>
<pre><code>这里只需要同上修改输出路径即可,其他选项保持默认。
</code></pre>
<p><img src="data/attachment/forum/202412/07/212423zcwb0wceb0008czb.png" alt="image-20241207155751758" /></p>
<pre><code>完成此步后,可以删除"xxx\Projects\Keil5_C251"路径下的"Listings"和"Objects"文件夹。
</code></pre>
<p><img src="data/attachment/forum/202412/07/212423gqaa955qxqmq1qq5.png" alt="image-20241207162011458" /></p>
<h3>4、User</h3>
<pre><code>无需修改
</code></pre>
<h3>5、C251(优化等级、警告等级、绝对路径)</h3>
<pre><code>这一步十分重要!!
</code></pre>
<p><img src="data/attachment/forum/202412/07/212423yj9mucpbp8cxl643.png" alt="image-20241207160226656" /></p>
<pre><code>代码优化等级,单片机内存足够时,选择等级0,即不优化,可以保证代码完整性,少出问题;如果代码确实写的很多很大,可以选择高等级,让编译器自动优化代码。
</code></pre>
<pre><code>警告等级,默认选择等级2。选择等级0,将不会报警告,不建议。一般情况下,还是需要看警告进行代码优化的。
</code></pre>
<pre><code>头文件路径,这个十分重要,作用是告诉编译器头文件在哪里,
</code></pre>
<p><img src="data/attachment/forum/202412/07/212424zjh1z2jtf5luhz5i.png" alt="image-20241207160901559" /></p>
<p><img src="data/attachment/forum/202412/07/212424z6xfi84xrpqpiix7.png" alt="image-20241207161011523" /></p>
<pre><code>依次添加第三步、第四步创建的驱动文件夹路径,这里的路径对编译器来说,都是绝对路径。
</code></pre>
<p><img src="data/attachment/forum/202412/07/212424pbf6fw07qcqnqym7.png" alt="image-20241207161356404" /></p>
<pre><code>注:绝对路径是 【目标文件所在位置】 相对 【工程文件所在位置】的路径,在绝对路径下的文件(如头文件),可以直接用
</code></pre>
<pre><code class="language-c">#include "xxx.h"
</code></pre>
<pre><code>例如,"config.h" 文件在SYS文件夹下,而且绝对路径中包含了SYS文件夹的路径,就可以直接引用
</code></pre>
<pre><code class="language-c">#include "config.h"
</code></pre>
<pre><code>但是,在Hardware文件夹下,有一个名为LED的文件夹,内有一个led.h文件
</code></pre>
<p><img src="data/attachment/forum/202412/07/212424d9rezmqizuzgxlbg.png" alt="image-20241207162916677" /></p>
<pre><code>此时,由于没有包含LED这个文件夹的绝对路径,如果直接引用"led.h"文件,将会报错,提示无法打开"led.h",此时只能重新打开魔术棒->C251->添加路径,那如果每写一个新的驱动文件,都要这样添加,会不会太麻烦了,全部放在同一个文件夹下,又太凌乱了,那怎么办呢?
</code></pre>
<pre><code>相对路径:
我们知道"led.h"这个文件的路径在LED文件夹里,而LED文件夹又在Hardware文件夹里,既然编译器知道Hardware在哪里,那引用的时候告诉编译器就好了,那么就可以这样:
</code></pre>
<pre><code class="language-c">#include "./Hardware/LED/led.h"
// 或者
#include "./LED/led.h"
</code></pre>
<pre><code>其中"./"(或".
</code></pre>
<p>\")表示当前路径,而"../"(或"..\")表示上一级路径,那么</p>
<pre><code class="language-c">// 工程文件的路径是 C251_32bit\Projects\Keil5_C251
// led.h文件的路径是 C251_32bit\Drivers\Hardware\LED
#include "./LED/led.h" // 对应工程文件文件,展开后即如下
// #include "../(上一级路径:Projects)../(上一级路径:C251_32bit)/Drivers/Hardware/LED/led.h"
</code></pre>
<p><img src="data/attachment/forum/202412/07/212425tuiuhu4neh5ee0gu.png" alt="image-20241207164923887" /></p>
<pre><code>了解完之后,相对于本次添加的绝对路径,今后创建新的文件夹/文件,即可使用这种方式进行引用:
</code></pre>
<pre><code class="language-c">#include "./XXX/xxx.h"
// 例如,要引用如下iic.h文件
// 由于已经添加过BSP文件夹的绝对路径了,因此这样引用
#include "./IIC/iic.h"
</code></pre>
<p><img src="data/attachment/forum/202412/07/212424xgm39mmm2o37dd34.png" alt="image-20241207165324754" /></p>
<h3>6、A251、L251 Locate</h3>
<pre><code>这里保持默认,无需修改。
</code></pre>
<h3>7、L251 Miso(忽略某项警告)</h3>
<pre><code>这里设置忽略57号警告,
*** WARNING L57: UNCALLED FUNCTION, IGNORED FOR OVERLAY PROCESS
这个警告是提示你,工程内有哪些函数从未被使用过
(告诉你哪些函数 占着茅坑不拉屎)
</code></pre>
<p><img src="data/attachment/forum/202412/07/212425g1hus11g94p4a00u.png" alt="image-20241207165750453" /></p>
<h3>8、Debug(需要仿真时才设置)</h3>
<pre><code>使用仿真时,将会占用P30、P31口,这两个引脚的功能(一般是串口1)不能使用,否则仿真调试时会报错,如果需要使用串口1,可以将功能复用到其他引脚上。
</code></pre>
<p><img src="data/attachment/forum/202412/07/212426nss749s5g5z5k44w.png" alt="image-20241207170520592" /></p>
<p><img src="data/attachment/forum/202412/07/212426vdqhnqniauh7qeni.png" alt="image-20241207170706561" /></p>
<h3>9、Utilities(需要仿真时才设置)</h3>
<pre><code></code></pre>
<p><img src="data/attachment/forum/202412/07/212426jy1957hfstcemecs.png" alt="image-20241207171007615" /></p>
<p><img src="data/attachment/forum/202412/07/212426ie6v46t5v4439d1t.png" alt="image-20241207171210845" /></p>
<p>至此,一个工程模板就创建好啦。</p>
<h2><strong>##番外 Keil5的一些设置</strong></h2>
<pre><code>keil5 的设置在小扳手里面
</code></pre>
<p><img src="data/attachment/forum/202412/07/212550uadzsinidlktkrdb.png" alt="image-20241207171648038" /></p>
<h3>一、Eidtor (编辑器)</h3>
<p><img src="data/attachment/forum/202412/07/212550d9gg22ttao1a2jge.png" alt="image-20241207171715664" /></p>
<pre><code>我的个人设置是这样的。
</code></pre>
<pre><code>其中比较有用的是:
1、Encoding(编码格式):一般是GB2312或者UTF-8
</code></pre>
<pre><code>2、显示空白符(空格是点,缩进符是箭头)
</code></pre>
<p><img src="data/attachment/forum/202412/07/212550rs6cj4swiul6tcw6.png" alt="image-20241207174401853" /></p>
<pre><code>3、Tab缩进设置(ASM是汇编文件,Other是其他文件)
</code></pre>
<p><img src="data/attachment/forum/202412/07/212550ug562c954o2744cp.png" alt="image-20241207174559301" /></p>
<h3>二、Colors & Fonts(颜色和字体)</h3>
<pre><code>这里可以设置背景颜色,字体颜色,字体大小等等
</code></pre>
<p><img src="data/attachment/forum/202412/07/212550j88c464kn05yyd18.png" alt="image-20241207175932252" /></p>
<pre><code>一般就是设置C/C++编辑器文件就好了,可以把 Number 设置为红色(默认绿色)
</code></pre>
<p><img src="data/attachment/forum/202412/07/212551skvkkt0pezaltjrj.png" alt="image-20241207180419576" /></p>
<pre><code>把字符串设置成其他颜色,我设置的是紫色(默认黑色)
</code></pre>
<p><img src="data/attachment/forum/202412/07/212552zty0d80t0vcixzkc.png" alt="image-20241207180510456" /></p>
<pre><code>注:也推荐使用UTF-8的编码格式+Consolas字体
</code></pre>
<p><img src="data/attachment/forum/202412/07/212552akf9nznk0kb0ggko.png" alt="image-20241207180944724" /></p>
<pre><code>这种字体可以一眼分辨数字0 和 字母O
</code></pre>
<p><img src="data/attachment/forum/202412/07/212552tt4ps1jav1nt42wl.png" alt="image-20241207181112850" /></p>
<pre><code>由于我已经用GB2312编码格式写好了,基础文件,现在切换中文注释会乱码,大家可以根据自身情况选择。
</code></pre>
<h3>三、User Keywords(用户关键词)</h3>
<pre><code>这里可以新建一些 关键词
</code></pre>
<p><img src="data/attachment/forum/202412/07/212552ey7qsmhgvs00dulu.png" alt="image-20241207174756986" /></p>
<pre><code>当输入关键词时,会高亮显示,类似这样:
</code></pre>
<p><img src="data/attachment/forum/202412/07/212552pz1q0g0auf1qqp7f.png" alt="image-20241207174904439" /></p>
<h3>四、Text Completion</h3>
<pre><code>这个我称之为"一键输入"或"常用语",在这里新建一个"常用语"名称,写入内容
</code></pre>
<p><img src="data/attachment/forum/202412/07/212552g90uhqftzqyiq4hm.png" alt="image-20241207181525439" /></p>
<pre><code></code></pre>
<p><img src="data/attachment/forum/202412/07/212554rpktm99vlaalvpmm.png" alt="image-20241207181816351" /></p>
<pre><code>效果如下:
</code></pre>
<p><img src="data/attachment/forum/202412/07/212555qex0nn1xbn0kcxbq.gif" alt="recording" /></p>
<pre><code>双击一下,就可以直接写入内容,常见的用法是创建一个函数注释头的"常用语"
</code></pre>
<p><img src="data/attachment/forum/202412/07/212554rayeob5eh9zz7azb.png" alt="image-20241207182156103" /></p>
<h2>##代码介绍</h2>
<h3>1、config</h3>
<pre><code>config.h 文件内可以进行一些常用配置的切换
</code></pre>
<pre><code>提供了一个float与u8类型相互转换的函数,支持大小端模式选择(相当于密码)
实用案例:NRF24L01无线通讯时,float数据打包发送,接收端拆包显示
</code></pre>
<pre><code>一个swap函数,用于交换两个变量的数值
</code></pre>
<p><img src="data/attachment/forum/202412/07/212555u1d1kt51etewuk9s.png" alt="image-20241207183020056" /></p>
<h3>2、Type_def</h3>
<pre><code>该文件提供了一下常用的宏定义,以及一些实用的宏函数(个人提供的比较有限,十分欢迎各位坛友分享扩列)
</code></pre>
<pre><code></code></pre>
<p><img src="data/attachment/forum/202412/07/212555e0lxxu1sfw9q2uix.png" alt="image-20241207183438427" /></p>
<h3>3、delay</h3>
<pre><code>包含一个毫秒级延迟函数和一个微秒级延时函数,以及一些由ISP生成的微秒级延迟函数。
</code></pre>
<p><img src="data/attachment/forum/202412/07/212712j5382ts8t1zhtm23.png" alt="image-20241207183742148" /></p>
<p><a href="forum.php?mod=attachment&aid=70092" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:创建一个个人风格的Keil5工程 - 副本.md</a></p>
<p><a href="forum.php?mod=attachment&aid=70091" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:AI8051U.zip</a></p>
我选择直接下载附件,直接享用楼主创建好的Project 最完整的keil使用教程啊 <p><img alt="jingya" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/jingya.gif" title="jingya" /></p>
真是全面啊 在虚拟硬盘中编译代码,更爽。 <p>每次都按照楼主教程来创建,多整几次就记住了。</p>
<p>又学到几手,感谢!</p>
{:4_250:}学习了 <p>学习了,谢谢!</p>