一、一些错误
1.新建工程时没有STM32芯片可以添加
这是由于keil没有添加stm32器件支持包导致的
(1)STM32支持包的安装
离线安装
安装支持包,我这里使用的是江协科技买板子时提供的支持包
遇到的问题--安装失败提示乱码
这是安装了新版keil的问题,在keil安装路径里的ARM文件夹下新建一个文件夹(注意不要出现中文),然后把要安装的支持包复制到这个文件夹里,在这个文件夹里重新安装支持包就能成功安装了。
在线安装
江协科技的视频教程中提到这种方法速度较慢,但我用下来速度还可以
2.在工程文件管理窗口里无法添加.h文件
点击Add后电脑会有提示音,无法添加.h文件到groupe里,但是keil没有给任何提示。
我尝试出来的解决办法是在左侧项目资源管理器里就可以正常添加
二、一些警告
1.User\main.c(27): warning: #1-D: last line of file ends without a newline
这个警告意思是:**源文件 `main.c` 的最后一行没有以换行符结尾**。
## 原因
C/C++ 标准建议每个源文件应以换行符结束(`\n`),某些编译器(如 ARMCC、IAR、GCC 等)会给出警告 `#1-D`,它不影响编译和运行,但最好消除。
## 解决方法
1. **在文件末尾手动添加一个空行**
打开 `main.c`,将光标移到文件最后,按下 `Enter` 键,确保最后一行是一个空行(即文件末尾多一个换行)。保存后重新编译,警告就会消失。
2. **如果使用 IDE**
- 在 Keil 中,点击文件末尾,按回车即可。
- 在 VS Code、Notepad++ 等编辑器中,开启“显示所有字符”功能,确认文件末尾有 `LF` 或 `CRLF`。
## 补充说明
- 这个警告级别较低,不解决也完全没问题,但很多项目规范要求代码文件以换行结尾,方便版本控制 diff 和工具链处理。
保存文件后重新编译即可。
2.#188-D: enumerated type mixed with another type
这个警告#188-D: enumerated type mixed with another type表示你在使用枚举类型(enum)的地方,直接传入了整数0,而编译器希望使用枚举常量,这可能导致类型安全隐患。
问题分析
代码:
GPIO_WriteBit(GPIOA, GPIO_Pin_0, 0);第三个参数0是int类型,但GPIO_WriteBit的第三个参数声明为枚举类型(通常为BitAction),例如在 STM32 标准外设库中定义为:
typedef enum { Bit_RESET = 0, Bit_SET } BitAction;虽然0在数值上与Bit_RESET相等,但混合使用枚举和整数会触发此警告,影响代码可读性和可维护性。
解决方法
1.使用正确的枚举常量(推荐)
将0替换为Bit_RESET(或RESET,视库版本而定):
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);如果使用 HAL 库,则可能是:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);2.显式类型转换(不推荐,仅作为临时方案)
你可以强制转换:
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);但这样做既不够清晰,也容易在将来修改枚举定义时产生问题,所以应尽量避免。
3.检查函数原型
如果确认第三个参数确实是枚举,请查看对应头文件(如stm32f10x_gpio.h)中BitAction的定义,使用其定义的Bit_SET/Bit_RESET。
4.全局替换
如果你在多个位置写了GPIO_WriteBit(..., 0),可以批量替换为..., Bit_RESET),并确保所有1替换为Bit_SET。
补充说明
该警告不会导致编译失败,但消除它可以让代码更严谨,减少潜在的逻辑错误。