1. 合宙Air001开发板初体验
第一次拿到合宙Air001开发板时,我着实被它的性价比惊艳到了。这款采用TSSOP20封装的开发板搭载ARM Cortex-M0+内核,内置32KB Flash和4KB RAM,集成多路USART、IIC、SPI等通信外设,还配备了5个16位定时器、1路12位ADC和2路比较器。最让人惊喜的是,10块钱就能买到开发板加10个芯片的组合,这在嵌入式开发领域简直是"白菜价"。
作为一款国产MCU,Air001的开发环境支持非常友好。官方提供了Keil-MDK和Arduino两种开发方式,对于习惯使用专业嵌入式开发工具的用户来说,Keil-MDK无疑是最佳选择。我实测下来,虽然官方文档已经比较详细,但在实际搭建过程中还是会遇到不少细节问题,特别是对于刚接触嵌入式开发的新手来说,一个完整的实战指南非常必要。
2. 开发环境准备
2.1 安装Keil MDK基础环境
在开始Air001开发前,首先需要准备好Keil MDK开发环境。我推荐使用Keil MDK 5.37版本,这个版本对Air001的支持最为稳定。安装过程需要注意以下几点:
从ARM官网下载Keil MDK安装包时,记得同时下载Compiler Version5,因为Keil MDK 5.37及以后版本默认使用Compiler Version6,而Air001的SDK目前对Version5支持更好。
安装完成后务必完成注册激活,否则会有32KB代码大小限制。激活过程需要用到License,可以在Keil官网申请评估版或购买正式版。
安装路径建议保持默认,不要包含中文或特殊字符,避免后续编译时出现路径问题。
2.2 获取Air001 SDK
Air001的SDK可以从OpenLuat的Gitee仓库下载。下载完成后,你会得到一个压缩包,解压后主要包含以下重要目录:
- PACK:包含Air001的设备支持包,用于Keil识别这款芯片
- Libraries:HAL库源代码,提供了对芯片外设的抽象封装
- Projects:官方示例工程
- Utilities:一些实用工具和脚本
我建议将整个SDK解压到一个固定的工作目录,比如"D:\Air001_SDK",这样后续引用路径会更清晰。
3. 创建第一个Keil工程
3.1 安装设备支持包
打开解压后的SDK目录,进入PACK文件夹,你会看到一个.pack文件。双击这个文件启动Keil的Pack Installer,按照向导完成安装。安装完成后,Keil就能识别Air001这款芯片了。
提示:如果安装过程中遇到权限问题,可以尝试以管理员身份运行Keil后再安装。
3.2 新建工程框架
打开Keil MDK,点击"Project"→"New μVision Project",选择一个合适的目录保存工程。我习惯在SDK目录下新建一个"Projects"文件夹来存放自己的工程。
在弹出的设备选择窗口中,搜索并选择"Air001"芯片。这里要注意选择正确的Flash和RAM大小配置,Air001应该是32KB Flash和4KB RAM的配置。
接下来会弹出运行时环境配置窗口,这里需要勾选:
- CMSIS→CORE
- Device→Startup
这两个选项会为工程添加必要的启动文件和CMSIS核心支持。
3.3 工程目录结构规划
一个良好的工程目录结构能让后续开发更有序。我通常采用如下结构:
MyProject/ ├── Drivers/ │ ├── AIR001xx_HAL_Driver/ # 从SDK复制过来的HAL库 ├── Inc/ # 头文件 ├── Src/ # 源文件 ├── MDK-ARM/ # Keil自动生成的目录 └── MyProject.uvprojx # Keil工程文件将SDK中Libraries目录下的AIR001xx_HAL_Driver文件夹复制到工程的Drivers目录下。这样做的目的是保持工程文件的独立性,避免直接修改SDK中的原始文件。
4. 配置工程与HAL库
4.1 添加HAL库源文件
回到Keil中,我们需要将HAL库的源文件添加到工程。右键点击"Target 1",选择"Add Existing Files to Group...",然后导航到Drivers/AIR001xx_HAL_Driver/Src目录,添加以下核心文件:
- air001xx_hal.c
- air001xx_hal_rcc.c
- air001xx_hal_rcc_ex.c
- air001xx_hal_cortex.c
- air001xx_hal_gpio.c
- air001xx_hal_pwr.c
- air001xx_hal_pwr_ex.c
- air001xx_hal_flash.c
这些文件提供了芯片的基础外设驱动支持。随着后续功能的扩展,你可能需要添加更多外设驱动文件。
4.2 创建必要的配置文件
在Inc目录下新建air001xx_hal_conf.h文件,这是HAL库的配置文件。内容如下:
#ifndef __AIR001xx_HAL_CONF_DEFAULT_H #define __AIR001xx_HAL_CONF_DEFAULT_H #ifdef __cplusplus extern "C" { #endif #define HAL_MODULE_ENABLED #define HAL_GPIO_MODULE_ENABLED #define HAL_RCC_MODULE_ENABLED #define HAL_FLASH_MODULE_ENABLED #define HAL_PWR_MODULE_ENABLED #define HAL_CORTEX_MODULE_ENABLED #define HSE_VALUE 8000000U #define HSE_STARTUP_TIMEOUT 100U #define HSI_VALUE 24000000U #define HSI_STARTUP_TIMEOUT 5000U #define LSI_VALUE 32000U #define LSE_VALUE 32768U #define LSE_STARTUP_TIMEOUT 5000U #define TICK_INT_PRIORITY 0x00U #include "air001xx_hal_rcc.h" #include "air001xx_hal_gpio.h" #include "air001xx_hal_flash.h" #include "air001xx_hal_pwr.h" #include "air001xx_hal_cortex.h" #define assert_param(expr) ((void)0U) #ifdef __cplusplus } #endif #endif这个文件定义了要启用的HAL模块和芯片的一些时钟参数。对于初学者来说,直接使用这个配置即可。
4.3 添加中断处理文件
在嵌入式系统中,中断处理是必不可少的。我们需要创建两个文件:
air001xx_it.h(放在Inc目录):
#ifndef __AIR001XX_IT_H #define __AIR001XX_IT_H #ifdef __cplusplus extern "C" { #endif void NMI_Handler(void); void HardFault_Handler(void); void SVC_Handler(void); void PendSV_Handler(void); void SysTick_Handler(void); #ifdef __cplusplus } #endif #endifair001xx_it.c(放在Src目录):
#include "air001xx_it.h" void NMI_Handler(void) {} void HardFault_Handler(void) { while(1) {} } void SVC_Handler(void) {} void PendSV_Handler(void) {} void SysTick_Handler(void) { HAL_IncTick(); }这些函数是Cortex-M0+内核的基本中断处理程序,其中SysTick_Handler尤为重要,它为HAL库提供了时间基准。
4.4 配置头文件路径和宏定义
点击Keil工具栏上的"Options for Target"按钮(魔术棒图标),在"C/C++"选项卡中:
在"Include Paths"中添加以下路径:
- ../Inc
- ../Drivers/AIR001xx_HAL_Driver/Inc
- ../Drivers/CMSIS/Device/ST/AIR001xx/Include
- ../Drivers/CMSIS/Include
在"Define"框中添加宏定义:AIR001_DEV
这些配置确保编译器能找到所有必要的头文件,并正确定义芯片型号。
5. 编写第一个点灯程序
5.1 创建main.c文件
在Src目录下创建main.c文件,这是程序的入口。我们将实现一个简单的LED闪烁程序:
#include "air001xx_hal.h" int main(void) { HAL_Init(); GPIO_InitTypeDef GPIO_LED = { .Pin = GPIO_PIN_0, .Mode = GPIO_MODE_OUTPUT_PP, }; __HAL_RCC_GPIOB_CLK_ENABLE(); HAL_GPIO_Init(GPIOB, &GPIO_LED); while(1) { HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); HAL_Delay(500); } }这段代码做了以下几件事:
- 初始化HAL库
- 配置GPIOB的Pin0为推挽输出模式
- 启用GPIOB的时钟
- 在循环中每隔500ms切换一次LED状态
5.2 解决常见编译问题
第一次编译时可能会遇到以下问题:
编译器版本不匹配:确保在"Options for Target"→"Target"选项卡中选择了"Use default compiler version 5"。
未定义HAL_IncTick:这个问题通常是因为忘记包含air001xx_hal.h头文件,或者头文件路径配置不正确。
警告"no newline at end of file":这是Keil的一个严格检查,可以在文件末尾添加一个空行解决。
5.3 烧录配置
编译成功后,就可以准备烧录程序了。点击"Options for Target"→"Debug"选项卡:
- 选择你的调试器类型(如ST-Link、J-Link或DAP等)
- 在"Utilities"选项卡中勾选"Reset and Run",这样程序下载后会自动运行
- 根据你的调试器接口(SWD或JTAG)正确连接开发板
Air001开发板通常使用SWD接口,连接方式如下:
- SWDIO → PB13
- SWCLK → PB14
- GND → GND
- VCC → 3.3V
5.4 验证结果
烧录成功后,你应该能看到开发板上的LED开始以1Hz的频率闪烁。如果没有看到预期效果,可以检查以下几点:
- LED连接的GPIO引脚是否正确(有些开发板LED可能连接在其他引脚)
- GPIO初始化代码是否正确配置了对应的引脚
- 开发板的供电是否正常
- 调试器连接是否可靠
如果一切正常,恭喜你完成了第一个Air001程序!这个简单的点灯实验验证了你的开发环境配置正确,为后续更复杂的开发打下了基础。