如何用Keil 5新建一个C项目工程

一、新建工程文件夹,并在其中新建以下文件夹

二、把相对应的库文件添加到相应文件夹下

工程说明文件就是readme.text

Libaries就是库文件,库文件从官网获取,可以直接拷贝官网库文件的同名文件夹,后续找库文件都从这个目录下找文件。

User的几个文件都可以直接从固件库中拷贝,路径如下:
STM32F10x_StdPeriph_Lib_V3.5.0\ Project\STM32F10x_StdPeriph_ Template\
三、在Project下可以新建多个新的子项目文件夹,用于存放不同子项目的工程文件 
1、新建Project
2、配置CPU(就是选择对应的硬件芯片)
比如是要写入stm32f103C8T6就选择stm32f103C8,其他更多的芯片型号去ARM下找
3、添加组文件夹
在每个项目工程下都要创建五个新的组文件夹,并且稍后添加各种必要的文件。
每个文件夹存放的必要文件如下:
双击组文件夹就会出现添加文件的路径,然后选择文件即可。
startup开头的文件从库文件中找,目录如下:
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\start
up\arm\startup_stm32f10x_hd.s 
core开头的文件在相似的路径:
Libraries\CMSIS\CM3\CoreSupport\core_cm3.c
system开头的文件所在路径:
Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c
USER和DOC的文件都能直接添加上个同名目录中的文件
四、配置魔术棒选项卡
这一步的配置工作很重要,很多人串口用不了 printf 函数,编译有问题,下载有问题,
都是这个步骤的配置出了错。
1、Target配置
Target 中选中微库“ Use MicroLib ”,为的是在日后编写串口驱动的时候可以使用
printf 函数。
2、 Output 配置

在 Output 选项卡中把输出文件夹定位到我们工程目录下的“output”文件夹,如果想在编译的过程中生成 hex 文件,那么那 Create HEX File 选项勾上。

3、Listing配置
Listing 选项卡中把输出文件夹定位到我们工程目录下的“ Listing ”文件夹。
4、头文件配置

在 C/C++选项卡中添加处理宏及编译器编译的时候查找的头文件路径。如果头文件路径添加有误,则编译的时候会报错找不到头文件。“Include Paths ”这里添加的是头文件的路径,如果编译的时候提示说找不到头文件, 一般就是这里配置出了问题。你把头文件放到了哪个文件夹,就把该文件夹添加到这里即可。

五、仿真器配置
如果仿真器是 Fire-Debugger,配置如下:
1、Debug 中选择 CMSIS-DAP Debugger
2、Utilities 选择 Use Debug Driver
3、Settings 选项配置
六、选择目标板
这一步的配置也不是配置一次之后完事,常常会因为各种原因需要重新选择,
当你下载的时候,提示说找不到 Device ,有时候下载程序之后,不会自动运行,要手动复
位的时候,都回来看看这里的配置是否有效。
至此,工程新建完成。
七、新建程序文件,开始编写核心代码
1、首先先在工程组的用户组下创建C文件和H文件(新建个txt文档然后改后缀,不行就百度)
把文件添加到工程中
2、对头文件进行声明引用
C文件中编写模块代码(程序实现),H文件是C程序中引用到的一些程序声明,
所以要C文件中引用H文件的头文件,同时因为该程序模块的代码在main程序中是需要用到的,所以在main.c中同样相应地要声明同名的头文件。
每个头文件被声明后,都需要把这个头文件的所在文件夹加入到头文件搜寻路径中(如上述步骤的设置)
当然如果需要引用的头文件比较少或者没有很复杂的要求,也可以直接在C文件头部进行引用,不必弄个H文件,毕竟头文件的作用只是将所有程序代码分成几段,使主程序代码阅读时不至于那么冗长。
为了防止新手没写过头文件时,该头文件被多个文件引用导致重复编译的情况,需要给每个头文件的头部加上条件编译的声明:
这里解释一下条件编译的作用和原理:
简单来讲就是定义个宏变量(大写),根据每个变量只能被定义一次的原则,如果该头文件第一次被引用则初次这个宏,并执行下面的程序声明,反之如果不是第一次声明,则因为宏已经被定义过了,所以条件编译的条件不被满足,以下代码均无法被再次执行(等于该头文件没有被再次编译),这样就可以避免重复编译带来的重复定义声明等问题。
举个例子,假设stm32f10x.h在头文件bsp_led.h中也被引用(如下),在这里头文件编译的过程中,编译第一个头文件stm32f10x.h就会定义一个宏变量__STM32F10x_H,并执行下面的程序和声明,于是乎第一个头文件编译就结束了。
然后开始编译第二个头文件bsp_led.h,因为该头文件中也包括了第一个头文件,所以如果没有条件编译,那么第一个头文件就会被编译第二次,其中的变量就会被定义声明第二次,违反了我们一开始的每个变量只能被定义一次的原则(多次定义容易出错)。而加上条件编译,那么第二次编译就会被阻止,这样在整个工程文件的编译中,每个头文件中的变量有且仅有被定义一次。
PS:头文件编译不只是定义声明变量,还有函数的声明等等。
  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值