3. 开发环境搭建:Keil/IAR IDE安装与配置、STM32CubeMX初始化工程、PN532库移植、串口调试工具配置
好,咱们正式开始动手了。这一章我带你搭开发环境。说实话,很多新手一上来就急着写代码,结果环境没配好,折腾半天连个灯都点不亮。我当年也犯过这毛病,后来学乖了——先把窝搭舒服了,再干活。
这一章我们要搞定四件事:IDE装好、芯片初始化配好、PN532的库移植进去、串口能跟电脑聊天。走起。
3.1 Keil MDK与IAR的安装与配置
先说IDE。做STM32开发,主流就两个选择:Keil MDK和IAR Embedded Workbench。我个人习惯用Keil,因为教程多、社区活跃。但IAR的编译优化确实更狠,如果你对代码体积有强迫症,可以考虑它。
3.1.1 Keil MDK安装要点
- 版本选择:建议用MDK 5.38或更新版本。太老的版本对STM32G0系列支持不好。
- 安装路径:别带中文!别带空格!我见过有人装在“D:\开发工具\Keil_v5”,结果编译报错找不到头文件,折腾半天才发现是路径问题。
- Pack安装:装完主程序后,记得装对应的Device Pack。比如我们用的STM32G070,就去Keil官网下载“Keil.STM32G0xx_DFP.2.x.x.pack”,双击安装。
- License激活:这个我就不多说了,你懂的。但注意,破解版有时候会莫名其妙出bug,尤其是调试功能。如果条件允许,建议用正版社区版。
3.1.2 IAR安装注意事项
如果你选IAR,流程类似。但有一点要注意:IAR的许可证管理比较严格。我曾经在项目中期换电脑,结果许可证迁移搞了一下午,差点崩溃。所以建议你装好后,把许可证文件备份到网盘。
另外,IAR的工程文件后缀是.eww,跟Keil的.uvprojx不通用。如果你团队里有人用Keil有人用IAR,最好统一一下,不然协作起来很痛苦。
3.2 STM32CubeMX初始化工程
好,IDE装好了,接下来我们用STM32CubeMX生成一个基础工程。这个工具说白了就是图形化配置单片机的外设,省得你对着寄存器手册一个个翻。
3.2.1 新建工程与芯片选择
- 打开STM32CubeMX,点击“New Project”。
- 在Part Number搜索框输入“STM32G070KBT6”,双击选中。
- 系统会问你要不要初始化所有外设,选“Yes”。
嗯,这里要注意:STM32G070系列没有硬件NFC控制器,所以我们得外接PN532模块。CubeMX里只需要配置好I2C或UART接口,用来跟PN532通信。
3.2.2 引脚配置与时钟设置
我个人习惯先把时钟树配好。点开“Clock Configuration”标签页:
- HSE选择外部晶振,频率设8MHz。
- PLL倍频到64MHz作为系统主频。
- APB1和APB2总线时钟保持默认,别超频。
然后配引脚。我们计划用I2C1跟PN532通信:
- PB6 -> I2C1_SCL
- PB7 -> I2C1_SDA
- PA9 -> USART1_TX(调试串口)
- PA10 -> USART1_RX(调试串口)
3.2.3 生成工程代码
配好后,点“Project Manager”标签:
- Project Name:填“NFC_Reader”
- Project Location:选一个英文路径
- Toolchain / IDE:选“MDK-ARM”或“EWARM”,看你前面装了什么
- 点击“GENERATE CODE”,等几秒,工程就生成了。
生成后,用Keil或IAR打开工程,先编译一次。如果没报错,恭喜你,芯片初始化搞定了。
3.3 PN532库移植
接下来是重头戏——把PN532的驱动库移植到我们的工程里。PN532是NXP家的NFC芯片,市面上有很多现成的库,比如libnfc或者Adafruit的PN532库。但咱们做嵌入式,讲究轻量级,所以我推荐用PN532_HSU或PN532_I2C库。
3.3.1 获取库文件
你可以从GitHub上下载Adafruit的PN532库。但注意,那个库是为Arduino写的,直接拿来用会报错。我们需要做一层适配。
下载后,把以下文件复制到工程目录:
PN532.h和PN532.cpp(主库文件)PN532_Interface.h(接口抽象层)PN532_I2C.h和PN532_I2C.cpp(I2C通信层)
在Keil里,把这些文件添加到工程中。记得在“Options for Target” -> “C/C++”里添加头文件路径。
3.3.2 适配STM32 HAL库
Arduino的库用的是Wire.h,但STM32用的是HAL库的HAL_I2C_Master_Transmit()。所以我们需要修改PN532_I2C.cpp,把I2C读写函数换成HAL库的。
举个例子,原来的Arduino代码是这样的:
void PN532_I2C::writeCommand(uint8_t *header, uint8_t hlen, uint8_t *body, uint8_t blen) {
Wire.beginTransmission(PN532_I2C_ADDRESS);
Wire.write(PN532_PREAMBLE);
Wire.write(PN532_STARTCODE1);
Wire.write(PN532_STARTCODE2);
// ... 省略中间部分
Wire.endTransmission();
}
改成STM32 HAL库的写法:
void PN532_I2C::writeCommand(uint8_t *header, uint8_t hlen, uint8_t *body, uint8_t blen) {
uint8_t buffer[64];
uint8_t idx = 0;
buffer[idx++] = PN532_PREAMBLE;
buffer[idx++] = PN532_STARTCODE1;
buffer[idx++] = PN532_STARTCODE2;
// ... 填充数据
HAL_I2C_Master_Transmit(&hi2c1, PN532_I2C_ADDRESS << 1, buffer, idx, HAL_MAX_DELAY);
}
3.3.3 测试库移植是否成功
移植完后,写一个简单的测试函数:
void PN532_Test(void) {
uint32_t versiondata = PN532_GetFirmwareVersion();
if (versiondata) {
printf("Found PN532 with firmware version: %d.%d\r\n",
(versiondata >> 16) & 0xFF,
(versiondata >> 8) & 0xFF);
} else {
printf("PN532 not found!\r\n");
}
}
如果串口打印出固件版本号,说明库移植成功了。如果打印“not found”,检查I2C接线和地址配置。
3.4 串口调试工具配置
最后一步,配串口调试工具。我们得让电脑能跟STM32聊天,方便看调试信息。
3.4.1 硬件连接
用USB转TTL模块,连接:
- STM32的PA9(TX) -> USB转TTL的RX
- STM32的PA10(RX) -> USB转TTL的TX
- GND -> GND
注意:STM32是3.3V电平,USB转TTL模块也要选3.3V的。我曾经用5V的模块接过,结果烧了STM32的串口引脚,血的教训。
3.4.2 串口助手设置
推荐用SSCOM或Putty。参数设置如下:
| 参数 | 值 |
|---|---|
| 波特率 | 115200 |
| 数据位 | 8 |
| 停止位 | 1 |
| 校验位 | 无 |
| 流控制 | 无 |
在STM32代码里,用printf()重定向到串口。方法是在工程里添加:
int fputc(int ch, FILE *f) {
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
这样,你代码里的printf()就会自动通过串口发送到电脑上了。
3.5 本章小结
好,到这步,你的开发环境就搭好了。IDE能编译、CubeMX能生成工程、PN532库能调用、串口能打印信息。接下来我们就可以开始写真正的NFC读卡逻辑了。
下一章,我会带你实现PN532的初始化配置,让它进入读卡模式。到时候你就能看到“发现卡片”的打印信息了,想想是不是有点小激动?
嗯,今天就到这。如果你在搭建过程中遇到问题,别急着百度,先看看接线对不对、地址配没配错。八成是这些低级问题。