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,尤其是调试功能。如果条件允许,建议用正版社区版。
我的小技巧:装完Keil后,先建一个空工程,编译一下。如果能通过,说明环境没问题。别等到写了几百行代码才发现编译器没装好。

3.1.2 IAR安装注意事项

如果你选IAR,流程类似。但有一点要注意:IAR的许可证管理比较严格。我曾经在项目中期换电脑,结果许可证迁移搞了一下午,差点崩溃。所以建议你装好后,把许可证文件备份到网盘。

另外,IAR的工程文件后缀是.eww,跟Keil的.uvprojx不通用。如果你团队里有人用Keil有人用IAR,最好统一一下,不然协作起来很痛苦。

3.2 STM32CubeMX初始化工程

好,IDE装好了,接下来我们用STM32CubeMX生成一个基础工程。这个工具说白了就是图形化配置单片机的外设,省得你对着寄存器手册一个个翻。

3.2.1 新建工程与芯片选择

  1. 打开STM32CubeMX,点击“New Project”。
  2. 在Part Number搜索框输入“STM32G070KBT6”,双击选中。
  3. 系统会问你要不要初始化所有外设,选“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(调试串口)
避坑指南:我曾经在项目里把SCL和SDA接反了,结果I2C死活不通。查了两天,最后用示波器一看,波形完全不对。所以配完引脚后,建议用万用表量一下物理连接,确认没接反。

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_HSUPN532_I2C库。

3.3.1 获取库文件

你可以从GitHub上下载Adafruit的PN532库。但注意,那个库是为Arduino写的,直接拿来用会报错。我们需要做一层适配。

下载后,把以下文件复制到工程目录:

  • PN532.hPN532.cpp(主库文件)
  • PN532_Interface.h(接口抽象层)
  • PN532_I2C.hPN532_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);
}
注意:PN532的I2C地址是0x24(7位地址),但在HAL库中,地址需要左移一位,变成0x48。这个坑我踩过,当时读出来的数据全是0xFF,还以为是芯片坏了。

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()就会自动通过串口发送到电脑上了。

调试小技巧:串口助手最好选带时间戳功能的。这样你能看到每条调试信息的精确时间,对分析时序问题特别有用。我习惯用SSCOM,轻量又好用。

3.5 本章小结

好,到这步,你的开发环境就搭好了。IDE能编译、CubeMX能生成工程、PN532库能调用、串口能打印信息。接下来我们就可以开始写真正的NFC读卡逻辑了。

下一章,我会带你实现PN532的初始化配置,让它进入读卡模式。到时候你就能看到“发现卡片”的打印信息了,想想是不是有点小激动?

嗯,今天就到这。如果你在搭建过程中遇到问题,别急着百度,先看看接线对不对、地址配没配错。八成是这些低级问题。