10块钱的国产MCU香不香?合宙Air001开发板开箱与Keil MDK环境避坑实录

拆开快递的那一刻,我差点以为收到了某种零食——合宙Air001开发板的外包装竟然是个印着芯片图案的银色锡箔袋,这种"接地气"的包装方式瞬间拉近了与硬件的距离。作为一款售价仅10元还附赠10颗芯片的开发板,它搭载的ARM Cortex-M0+内核和丰富外设资源,在性价比上确实让人眼前一亮。但真正考验的,是从拆封到成功点灯这段充满"惊喜"的旅程。

1. 开箱初体验:当极简主义遇上实用主义

撕开那个神似咖啡豆包装的银色袋子,里面的内容物简单得令人惊讶:

  • 一块邮票大小的蓝色开发板(尺寸仅36×18mm)
  • 10颗TSSOP20封装的Air001芯片
  • 一张对折的简易说明书
  • 没有任何排针或连接线

硬件配置亮点

  • 主控芯片:ARM Cortex-M0+内核@48MHz
  • 存储:32KB Flash + 4KB RAM
  • 通信接口:2xUSART、1xI2C、1xSPI
  • 其他资源:5x16bit定时器、12bit ADC、2路比较器

开发板设计采用了"All-in-One"理念,所有GPIO引脚通过边缘焊盘引出,省去了排针成本。这种极简设计虽然降低了售价,但也意味着用户需要自备焊接工具。板载资源中最实用的是:

  1. 用户LED(连接PB0)
  2. 复位按钮
  3. 4Pin SWD调试接口
  4. 3.3V LDO稳压电路

提示:首次使用时建议先用万用表检查电源短路,笔者就遇到过因运输导致LDO引脚虚焊的情况。

2. 开发环境搭建:那些官方没告诉你的细节

官方文档虽然提供了Keil MDK环境配置指南,但实际操作中会遇到几个关键问题:

2.1 编译器版本陷阱

最新版Keil MDK默认使用ARM Compiler 6(AC6),但Air001的SDK目前只完整支持AC5。解决方法有两种:

# 方案一:安装AC5编译器(需ARM账号)
1. 访问ARM官网下载AC5安装包
2. 运行安装程序后,在Keil的Options→Target中切换编译器版本

# 方案二:修改工程配置
1. 在工程选项中取消勾选"Use default compiler version 5"
2. 添加以下预处理宏定义:
   - __CC_ARM
   - __MICROLIB

2.2 头文件路径迷宫

SDK中的头文件分布在多个目录,正确添加路径的顺序应该是:

  1. \Libraries\AIR001xx_HAL_Driver\Inc
  2. \Libraries\CMSIS\Device\AIR001\Include
  3. \Libraries\CMSIS\Include
  4. 用户自定义头文件目录

常见错误现象与解决方案对照表:

错误类型 可能原因 解决方法
HAL头文件找不到 路径未包含HAL_Driver/Inc 检查路径是否包含完整相对路径
启动文件报错 未勾选Startup项 在Manage Project Items中添加startup_air001xx.s
__HAL_RCC_GPIOX_CLK_ENABLE未定义 宏定义缺失 在工程选项中添加AIR001_DEV宏

2.3 中断处理的隐藏关卡

官方示例缺少完整的中断向量表配置,需要手动补充这些关键操作:

// 在air001xx_it.c中添加
void SysTick_Handler(void) {
    HAL_IncTick();
    HAL_SYSTICK_IRQHandler();
}

// 在main.c中初始化时调用
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

3. 点亮LED的九曲十八弯

按照常规思路配置GPIO后,可能会遇到LED死活不亮的情况。经过实际测试,需要特别注意以下几点:

完整配置流程

  1. 启用GPIO时钟(易错点:PB端口时钟需要单独开启)
  2. 配置GPIO初始化结构体
  3. 设置GPIO引脚模式(推挽输出/开漏输出)
  4. 配置引脚速度(低速/中速/高速)
  5. 初始化GPIO

典型错误代码示例:

// 错误示例:缺少时钟使能
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // 不会工作

正确写法应该包含时钟使能:

__HAL_RCC_GPIOB_CLK_ENABLE(); // 关键步骤!
GPIO_InitTypeDef GPIO_InitStruct = {
    .Pin = GPIO_PIN_0,
    .Mode = GPIO_MODE_OUTPUT_PP,
    .Pull = GPIO_NOPULL,
    .Speed = GPIO_SPEED_FREQ_LOW
};
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

4. 烧录器的适配难题

不同于常见ST-Link或J-Link,这款开发板对调试器的兼容性有些特殊要求:

支持的调试器类型

  • DAP-Link(推荐)
  • J-Link(需修改配置)
  • ST-Link(部分功能受限)

SWD接口连接方式

开发板引脚 → 调试器接口
SWDIO    →  SWDIO
SWCLK    →  SWCLK
GND      →  GND
3.3V     →  VCC(可选)

注意:使用非DAP调试器时,需要在Keil的Debug选项中将"Reset and Run"设置为硬件复位,否则可能无法自动运行程序。

5. 进阶技巧:从能用到好用

经过基础环境搭建后,可以通过这些优化提升开发体验:

5.1 工程模板优化

建议创建包含以下元素的模板工程:

  • 预配置的HAL库文件
  • 完善的中断处理框架
  • 精简的main.c结构
  • 版本控制忽略文件(.gitignore)

5.2 调试输出配置

利用USART1实现printf输出:

// 添加以下代码重定向printf
int _write(int fd, char *ptr, int len) {
    HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, HAL_MAX_DELAY);
    return len;
}

5.3 低功耗实践

Air001在运行模式下的典型电流为5mA,通过以下配置可降至μA级:

  1. 关闭未使用的外设时钟
  2. 配置GPIO为模拟输入模式
  3. 进入STOP模式
  4. 使用WKUP引脚或RTC唤醒

实际测试中,将芯片配置为STOP模式并通过PB0唤醒,待机电流可降至1.8μA,这对于电池供电设备非常实用。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐