在stm32的HAL工程中引入新的代码文件,使用keil且创建新的文件夹

许多初学者初入嵌入式的时候,不清楚如何引入外部的库文件,或者不清楚如何进行集成,本文我将讲述如何在keil中引入外部的库文件;

 打开工程文件,在工程文件中创建一个文件,文件名字随便取,我在MDK-ARM中创建,起名myDrivers,如下图

在打开myDrevers,在其中创建2个文本文件然后分别改名为myiic.h和myiic.c。后缀名也一起改掉。(如果是创建空文件就跟着创建,如果是现有文件,那就直接粘贴进来,名字无所谓,后缀名要.c和,h)

如下

然后用keil打开工程文件,在左边的的工程文件管理中右键工程,然后点击add group,随后工程文件中会出现一个New Group的新文件夹。单击新文件夹,按f2重命名,随便取名,我取名为myDrivers(该文件夹仅存在于工程目录下,与具体的文件夹无关,可同名,可不同)

再右键这个文件夹,点击如图的选项,添加现有的文件

在打开的选项中,在文件选择中找到之前在MKD-ARM中创建的myDrivers

然后单击myiic.c,再点击add。这个.c文件就成功的添加到工程中了

这时候编译是会报错的,因为工程的编译路径中没有这个文件夹,所以我们要添加这个文件夹到编译路径中(因为这里只是添加了文件到工程中,但是编译器不知道还需要从myDrivers文件夹找库,你需要告诉编译器)

按下面步骤来
单击魔法棒

点击c/c++

然后点这里进入库路径配置

点这里创建新路径

再点那三个点

找到mdkarm文件夹中的myDrivers文件夹,

然后ok,再ok退出

双击myiic.c的工程文件进入,在文件的顶部输入
 

#include "myiic.h"


输入完后编译,这时候.c旁边的+号也显示出来了。


至此新的工程文件添加成功,之后只需要按照工程去编写代码即可

<think>嗯,用户问的是如何在STM32 HAL库项目中正确添加新的.c和.h文件,并确保它们正常编译链接。这个问题看起来是关于项目结构和配置的,可能用户刚开始接触STM32开发,或者之前没有自己添加过源文件和头文件。首先,我需要回忆STM32开发的基本流程,尤其是使用HAL库和CubeMX的情况。 首先,用户可能使用的是CubeMX生成项目框架,所以需要知道如何手动添加文件工程里。他们可能不太清楚文件应该放在哪个目录下,或者如何设置头文件路径,导致编译时找不到头文件。另外,链接阶段的问题可能涉及文件没有被正确添加到工程中,或者编译器没有正确包含路径。 接下来,我应该分步骤来解答。第一步应该是创建文件,确定目录结构。通常,用户需要将自定义的.h文件放在Inc文件夹,.c文件放在Src文件夹。或者,有些项目会有一个专门的目录比如Drivers或者User,用来存放用户自定义的模块。这时候可能需要建议用户创建这样的目录结构,保持项目整洁。 然后,添加文件工程中。不同的IDE有不同的操作方式,比如MDK-ARM(Keil)、STM32CubeIDE或者IAR。用户可能需要指导如何在特定IDE中添加文件。例如,在Keil中,需要右键点击目标组,选择添加现有文件,或者新建文件然后保存到对应目录。 接下来是头文件包含路径的设置。如果用户的自定义头文件不在默认的搜索路径中,编译器会报错。所以需要告诉用户如何在IDE中添加包含路径。例如,在Keil的Options for Target -> C/C++ -> Include Paths中添加新的路径。如果用户把.h文件放在Inc文件夹下,可能不需要额外设置,但如果是其他目录,就必须手动添加。 然后是代码规范方面,比如使用条件编译防止头文件重复包含,使用extern声明函数,以及符合HAL库的编码风格,比如使用uint8_t这样的类型别名。这里可能需要引用用户提供的参考内容中的引用[2],关于使用C99标准的数据类型。同时,注释规范也很重要,比如文件头注释,函数注释等,可以引用参考中的引用[1]。 还有,编译和链接的问题,比如检查文件是否被正确添加,路径是否正确,以及是否有语法错误。如果用户遇到链接错误,比如未定义的引用,可能是因为.c文件没有添加到工程中,或者函数声明和定义不一致。 另外,用户可能需要知道如何组织代码结构,比如模块化设计,将不同功能放在不同的.c/.h文件中,这样便于维护。例如,创建一个led.c和led.h来控制LED,或者uart.c和uart.h处理串口通信。 可能还需要提到Makefile或工程配置文件的修改,如果用户使用的是非IDE环境,比如使用GCC和Makefile,这时候需要手动修改Makefile中的源文件列表和包含路径。不过用户的问题提到HAL库和CubeMX,所以大概率是在使用IDE,比如Keil或者STM32CubeIDE。 最后,用户可能遇到的问题包括:忘记添加头文件路径,导致编译错误;.c文件没有添加到工程中,导致链接错误;头文件没有使用#ifndef防止重复包含,导致重定义错误;函数或变量未正确声明,导致链接错误等。需要提醒用户检查这些常见问题。 总结一下,回答需要分步骤,涵盖文件创建、添加到工程、路径设置、代码规范、编译链接检查,并给出示例和注意事项。同时,根据用户提供的引用,强调使用C99标准类型和注释规范,这样可以确保代码的兼容性和可读性。</think>在STM32 HAL库项目中正确添加自定义的.c/.h文件需要遵循以下规范步骤: ### 一、文件创建与目录结构 1. **新建目录** 在项目根目录创建`/User`或`/Drivers`文件夹存放自定义模块(如`/User/LED`、`/Drivers/Sensor`) ``` Project/ ├── Core/ ├── Drivers/ └── User/ ├── led.h └── led.c ``` 2. **文件命名规范** - 头文件采用`*.h`,源文件`*.c` - 文件名需体现模块功能,如`uart_parser.h`、`adc_utils.c` ### 二、工程配置(以Keil MDK为例) 1. **添加文件工程** - 右键点击目标组(如`Application/User`)→ 选择`Add Existing Files...` - 勾选需要添加的.c文件 2. **设置头文件路径** 在`Options for Target → C/C++ → Include Paths`中添加自定义头文件目录: ``` ../User ../Drivers/Sensor ``` [^2] ### 三、代码规范 ```c // led.h(头文件模板) #ifndef __LED_H #define __LED_H #ifdef __cplusplus extern "C" { #endif #include "main.h" // 包含HAL库头文件 /* 函数声明 */ void LED_Init(uint8_t pin); void LED_Toggle(uint32_t interval_ms); #ifdef __cplusplus } #endif #endif /* __LED_H */ ``` ```c // led.c(源文件模板) #include "led.h" #include "gpio.h" // 根据实际外设选择 /** * @brief LED初始化函数 * @param pin: 引脚编号(GPIO_PIN_0 ~ GPIO_PIN_15) * @retval None */ void LED_Init(uint8_t pin) { GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` [^1] ### 四、编译验证 1. **编译检查** 执行`Build`后应无`undefined reference`错误 2. **链接检查** 查看.map文件确认自定义函数地址已分配 ### 五、注意事项 1. **全局变量声明** 头文件使用`extern`声明全局变量,源文件中定义: ```c // .h文件 extern uint32_t g_led_counter; // .c文件 uint32_t g_led_counter = 0; ``` 2. **模块化设计** 每个.c文件应实现单一功能模块,避免代码耦合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值