第三章 软件开发环境搭建:Keil/IAR IDE安装、STM32CubeMX配置、J-Link调试器连接、工程模板创建

好,咱们直接进入正题。这一章讲的是开发环境搭建,说白了就是把你手里的电脑变成一台能跟理疗仪芯片对话的工作站。我见过太多新手卡在这一步,IDE装好了但编译器路径不对,CubeMX配完了生成代码报错,J-Link插上去电脑没反应……嗯,这些坑我都踩过。今天咱们一步步捋清楚。

3.1 Keil MDK与IAR EWARM的选择与安装

先说说这两个IDE。Keil MDK和IAR EWARM,就像螺丝刀和扳手,都能干活,但手感不一样。

我个人习惯用Keil,因为它的工程管理界面更直观,尤其是对于STM32这种ARM Cortex-M内核的芯片。但IAR的编译优化确实更狠,代码能小10%左右。如果你做的是电池供电的便携理疗仪,IAR可能更合适。

安装时注意几点:

  • 版本匹配:Keil MDK 5.38以上版本对STM32G0/G4系列支持更好。我去年修一台理疗仪,发现旧版Keil编译出来的代码在G0芯片上跑飞了,升级到5.39就稳了。
  • 破解问题:别用那些来路不明的注册机。Keil官方有免费版(代码限制32KB),对于理疗仪这种小项目其实够用。我见过有人用盗版导致编译出来的代码随机崩溃,排查了三天才发现是编译器被动了手脚。
  • 路径不要有中文:Keil和IAR对中文路径的支持都很差。我曾经把工程放在“桌面/理疗仪项目”下,结果编译报错“找不到文件”,改成英文路径就好了。
我的小技巧:装完Keil后,先打开一个官方例程编译试试。如果报错“找不到ARMCC”,说明编译器路径没配好。去菜单栏 Project -> Manage -> Component Environment 里检查一下。

3.2 STM32CubeMX配置:从芯片选型到代码生成

STM32CubeMX是个图形化工具,能帮你省掉80%的底层配置工作。说白了,你点点鼠标,它就把初始化代码给你生成了。

咱们理疗仪常用的外设有:

  • 定时器:产生PWM波驱动电极
  • ADC:采集皮肤阻抗反馈
  • UART:与蓝牙模块通信
  • GPIO:控制LED指示灯和按键

配置步骤:

  1. 打开CubeMX,点击“New Project”
  2. 在Part Number搜索框输入芯片型号,比如STM32G070KBT6
  3. 双击选中,进入Pinout & Configuration界面
  4. 在左侧Categories里找到Timers,配置一个定时器输出PWM
  5. 在Clock Configuration里设置系统时钟为64MHz(G0系列最高主频)
  6. 点击Project Manager,设置工程名、保存路径、IDE类型(选MDK-ARM V5)
  7. 点击GENERATE CODE,生成工程

避坑指南:我曾经在配置ADC时,忘了开启连续转换模式,结果理疗仪每次采样都要手动触发,导致波形输出卡顿。后来在CubeMX里勾选了“Continuous Conversion Mode”就解决了。

生成代码后,你会得到一个包含HAL库的Keil工程。HAL库是ST官方提供的硬件抽象层,说白了就是帮你封装好了寄存器操作。你只需要调用 HAL_TIM_PWM_Start() 这样的函数就行。

3.3 J-Link调试器连接与配置

J-Link是咱们调试的利器。没有它,你只能靠串口打印看数据,效率低得可怜。

连接步骤:

  1. 把J-Link的SWD接口接到板子上:SWDIO、SWCLK、GND、VCC(可选)
  2. 用USB线把J-Link连到电脑
  3. 打开Keil,点击魔术棒图标(Options for Target)
  4. 在Debug选项卡里,选择“J-Link / J-Trace Cortex”
  5. 点击Settings,如果看到“SW Device”里显示芯片ID,说明连接成功
注意:如果J-Link连不上,先检查接线。SWDIO和SWCLK别接反了。我遇到过最奇葩的问题——J-Link的排线断了,但外表看不出来。换根线就好了。

调试时常用的操作:

  • 单步执行:按F11,一行一行看代码执行情况
  • 设置断点:在代码行号旁边点一下,程序跑到这里会停下
  • 查看变量:把鼠标悬停在变量上,或者添加到Watch窗口
  • 修改寄存器:在Peripherals菜单里直接改外设寄存器的值

我记得有一次,理疗仪的PWM波形频率不对。我单步执行到定时器初始化代码,发现预分频器的值被写错了。直接在Peripherals窗口里改回来,波形立刻正常。这种问题要是靠串口打印,得折腾半天。

3.4 工程模板创建:一次配置,重复使用

每次新项目都从头配置CubeMX?太傻了。我建议你做一个工程模板,以后直接复制。

模板里应该包含:

  • 基础的HAL库初始化(时钟、GPIO、UART)
  • 一个main.c的框架,包含while(1)循环
  • 调试用的串口打印函数(重定向printf到UART)
  • 错误处理函数(比如HardFault_Handler里打印错误信息)

创建步骤:

  1. 用CubeMX生成一个最小工程(只配时钟和UART)
  2. 在Keil里打开,添加一个“template.c”文件
  3. 把常用的函数写进去,比如延时函数、串口打印函数
  4. 编译通过后,把整个文件夹压缩保存
我的习惯:模板里还会放一个“debug.h”头文件,里面定义几个宏:DEBUG_PRINTF、ASSERT等。调试时打开宏,发布时关掉,不用改代码。

代码示例(模板里的main.c框架):

#include "main.h"
#include "debug.h"

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART1_UART_Init();

    DEBUG_PRINTF("系统初始化完成\r\n");

    while (1)
    {
        // 主循环
        HAL_Delay(1000);
        DEBUG_PRINTF("心跳...\r\n");
    }
}

void Error_Handler(void)
{
    DEBUG_PRINTF("发生错误!\r\n");
    while(1);
}

有了这个模板,新项目只需要在CubeMX里改外设配置,然后覆盖生成的代码就行。注意别把main.c里的while(1)循环给覆盖了。

嗯,这一章的内容就这些。环境搭建好了,下一章咱们就可以开始写理疗仪的核心控制逻辑了。记住,工欲善其事,必先利其器。花点时间把环境配好,后面能省你十倍的时间。