一、什么是 DAL?为什么不叫 HAL?
极海给自家 SDK 取名 DAL(Device Abstraction Layer,设备抽象层),而非跟 ST 一样叫 HAL。名字不同,思路却相近:在芯片寄存器和用户应用代码之间插一层统一的 C 语言接口,屏蔽寄存器细节,让外设操作以"配置结构体 + 函数调用"的形式呈现。
和 STM32 生态的几种库做横向对比:
| 维度 |
STM32 标准外设库(SPL) |
STM32 HAL 库 |
G32M3101 DAL |
| 抽象层次 |
寄存器封装,较薄 |
中等,带回调机制 |
与 SPL 风格接近,较薄 |
| 代码体积 |
小 |
较大 |
小(适配 64KB Flash) |
| 初始化方式 |
结构体 + Init 函数 |
结构体 + Init 函数 |
结构体 + Init 函数 |
| 中断处理 |
手写 IRQHandler |
回调函数机制 |
手写 IRQHandler |
| 可移植性 |
仅限 STM32 |
仅限 STM32 |
仅限极海 G32M3101 |
| 学习曲线 |
STM32 用户:极低 |
STM32 用户:低 |
STM32 用户:极低 |
结论:DAL 的代码风格与 STM32 标准外设库高度相似。如果你写过 STM32F0/F1 的标准库代码,看 G32M3101 的 DAL 源码会有强烈的既视感,迁移成本非常低。
二、SDK 目录结构全解
解压 G32M3101_DAL_SDK_V1.0.3.zip 后,完整目录如下:

G32M3101_DAL_SDK_V1.0.3/
├── Boards/ ← 评估板 BSP 与板级组件
├── Examples_DDL/ ← 全部外设示例工程(核心参考)
├── Libraries/ ← 驱动库与 CMSIS(核心依赖)
├── Middlewares/ ← 中间件(FreeRTOS)
├── Package/ ← DFP Pack 安装文件
└── Utilities/ ← 烧录工具、调试辅助
下面逐一拆解每个目录的实际内容。
2.1 Boards/ — 评估板 BSP
Boards/
├── Board_G32M3101_Eval/
│ ├── Include/ ← 板级头文件(引脚定义、时钟配置宏)
│ └── Source/ ← 板级初始化函数(Board_Init 等)
└── Components/
└── LOG/ ← 串口日志组件(封装 printf 输出)
Board_G32M3101_Eval 是针对官方评估板的 BSP(板级支持包),定义了评估板上各外设对应的引脚编号、LED、按键等资源宏定义。写自己的应用时,可以直接参考这里的引脚映射,或将其中的宏定义复制到自己的 board.h 中使用。
Components/LOG 是一个轻量日志组件,内部封装了带级别(INFO / WARN / ERROR)的 printf 输出,在调试阶段非常实用,量产时一键关闭。
2.2 Examples_DDL/ — 示例工程全览(重点)
这是使用频率最高的目录。极海为 每一个外设 都提供了独立的示例工程,互不依赖,可以单独编译运行。每个示例的内部结构统一:
示例工程(以 GPIO_Toggle_DDL 为例)/
├── Config/
│ ├── Include/ ← 工程级配置头文件(时钟、调试开关等)
│ └── Source/ ← 配置源文件
├── Include/ ← 示例业务头文件
├── Source/ ← 示例业务源文件(main.c 在此)
└── Project/
├── MDK/ ← Keil MDK 工程文件(.uvprojx)
├── IAR/ ← IAR 工程文件(.ewp)
└── Eclipse/ ← Eclipse/GCC 工程文件(Makefile)
三套 IDE 工程并存,同一份业务代码,选择对应 IDE 目录打开即可,无需手动移植。
全部示例工程按外设分类如下:
| 外设目录 |
示例名称 |
说明 |
| ADC |
ADC_ContinuousConversion_DDL |
连续转换模式 |
|
ADC_DisContinuousConversion_DDL |
间断转换模式 |
|
ADC_DMA_DDL |
ADC + DMA 联动采样 |
|
ADC_MultiChannelScan_DDL |
多通道扫描 |
|
ADC_MultiChannelScanTimerTrigger_DDL |
定时器触发多通道扫描(FOC 电流采样必看) |
|
ADC_SequentialSectionSampling_DDL |
分段采样模式 |
|
ADC_TemperatureSensor_DDL |
片内温度传感器读取 |
| COMP |
COMP_Output_DDL |
比较器输出与中断(过流保护参考) |
| CRC |
CRC_Calculation_DDL |
硬件 CRC 校验 |
| DIV |
DIV_Unsigned_DDL |
硬件除法器(FOC 算法加速关键) |
| DMA |
DMA_FMCToRAM_DDL |
Flash 到 RAM 的 DMA 传输 |
| EINT |
EINT_Config_DDL |
外部中断配置(霍尔信号换相触发) |
| FLASH |
FLASH_EEPROM_DDL |
Flash 模拟 EEPROM 存参数 |
|
FLASH_Read_Write_DDL |
Flash 读写操作 |
|
FLASH_Write_DDL |
Flash 编程 |
| GPIO |
GPIO_Toggle_DDL |
GPIO 翻转(Hello World) |
| IAP |
IAP_Bootloader_DDL |
Bootloader 框架 |
|
IAP_Application1/2_DDL |
双 App 分区 OTA 升级 |
| IWDT |
IWDT_Reset_DDL |
独立看门狗复位 |
| LPTMR |
LPTMR_WakeUp_DDL |
低功耗定时器唤醒 |
| NVIC |
NVIC_WFI_DDL |
WFI 低功耗休眠 |
| OPA |
OPA_Standalone_DDL |
运算放大器独立模式(电流采样放大) |
| PMU |
PMU_Consumption_DDL |
功耗测量 |
|
PMU_PVD_DDL |
电源电压检测(低压保护) |
|
PMU_SLEEP_DDL |
Sleep 模式 |
|
PMU_STOP_DDL |
Stop 模式 |
| RCC |
RCC_ClockConfig_DDL |
系统时钟配置(必看,RCC 即时钟管理模块) |
| RTOS |
CMSIS_FreeRTOS_DDL |
FreeRTOS 集成示例 |
| SPI |
SPI_TwoBoards_DDL |
双板 SPI 通信 |
| SysTick |
SysTick_TimeBase_DDL |
SysTick 时基 |
| Template |
Template_DDL |
空白工程模板(新建工程起点) |
| TMR |
TMR_PWMOutput_DDL |
单路 PWM 输出 |
|
TMR_BTMRPWMOutput_DDL |
基本定时器 PWM 输出 |
|
TMR_BTMROCToggle_DDL |
基本定时器输出比较翻转 |
|
TMR_InputCapture_DDL |
输入捕获(测频率/脉宽) |
|
TMR_OCActive/Inactive/Toggle_DDL |
输出比较各模式 |
|
TMR_PWMInput_DDL |
PWM 输入测量 |
|
TMR_SinglePulse_DDL |
单脉冲模式 |
|
TMR_Synchronize_DDL |
多定时器同步(电机多轴联动) |
|
TMR_TimeBase_DDL |
基础时基定时 |
|
TMR_DMA_DDL |
定时器触发 DMA |
| USART |
USART_Printf_DDL |
printf 重定向(调试首选) |
|
USART_EchoInterrupt_DDL |
中断收发回显 |
|
USART_TwoBoardsPolling_DDL |
双板轮询通信 |
|
USART_TwoBoardsInterrupt_DDL |
双板中断通信 |
|
USART_TwoBoardsDMA_DDL |
双板 DMA 通信 |
| WWDT |
WWDT_OverTime_DDL |
窗口看门狗 |
注意几个命名细节:运算放大器在示例目录中叫 OPA(不是 OPAMP),串口叫 USART(不是 UART),时钟模块叫 RCC(不是 RCM)。代码中的 API 前缀以实际驱动库头文件为准,示例目录名仅作索引。
2.3 Libraries/ — 驱动库与 CMSIS(核心依赖)
Libraries/
├── CMSIS/ ← ARM 官方 CMSIS 支持包
│ ├── Core/Include/ ← core_cm0plus.h 等 M0+ 内核头文件
│ ├── DSP/ ← CMSIS-DSP 数学库(含 FFT/FIR/矩阵等)
│ │ ├── Include/ ← arm_math.h 等头文件
│ │ └── Source/ ← 各类 DSP 函数源码
│ │ ├── BasicMathFunctions/
│ │ ├── FastMathFunctions/ ← arm_sin_f32 / arm_cos_f32(FOC 正余弦查表)
│ │ ├── ControllerFunctions/← arm_pid_f32(PID 控制器)
│ │ ├── TransformFunctions/ ← arm_clarke/park 变换
│ │ └── ...(共 15 类)
│ ├── NN/ ← CMSIS-NN 神经网络推理库(备用,本系列暂不涉及)
│ └── RTOS2/RTX/ ← CMSIS-RTOS2 接口层
│
├── Device/
│ └── Geehy/G32M3101/
│ ├── Include/ ← g32m3101.h(芯片寄存器定义,核心!)
│ └── Source/
│ ├── arm/ ← Keil MDK 启动文件(startup_g32m3101.s)
│ ├── gcc/ ← GCC 启动文件
│ └── iar/ ← IAR 启动文件
│
└── G32M3101_DAL_Driver/ ← G32M3101 外设驱动库本体
├── Include/ ← 各外设驱动头文件
└── Source/ ← 各外设驱动源文件
几个值得关注的细节:
① CMSIS-DSP 库已内置
Libraries/CMSIS/DSP/ 完整包含了 ARM 官方 CMSIS-DSP 库,其中 FastMathFunctions(正余弦查表)和 ControllerFunctions(PID)、TransformFunctions(Clarke/Park 变换)在 FOC 实现中可以直接调用,无需自己写三角函数表或手撸 Park 变换,且这些函数经过 ARM 官方针对 M0+ 指令集优化。
② 三套启动文件并存
Device/Source/ 下按编译器分了三个子目录(arm/gcc/iar),对应 Keil/GCC/IAR 各自的汇编语法格式。选择不同 IDE 打开工程时,对应的启动文件会被自动包含,不需要手动切换。
③ G32M3101_DAL_Driver 是驱动库本体
这是和实际外设打交道的代码,Include/ 下是各外设头文件(GPIO、ADC、TMR、USART、SPI、DMA、OPA、COMP、RCC、PMU、FLASH 等),Source/ 下是对应实现。所有外设 API 均在此定义。
2.4 Middlewares/ — CMSIS-FreeRTOS 中间件
Middlewares/
└── CMSIS-FreeRTOS/
├── CMSIS/RTOS2/FreeRTOS/ ← CMSIS-RTOS2 对 FreeRTOS 的封装适配层
└── Source/ ← FreeRTOS 内核源码
├── include/ ← FreeRTOS.h / task.h / queue.h 等
└── portable/ ← 各架构移植层(含 ARM_CM0)
SDK 内置了完整的 CMSIS-FreeRTOS,并提供了 CMSIS_FreeRTOS_DDL 示例工程。对于需要多任务架构的应用(如电机控制任务 + 通信任务 + 故障处理任务),开箱即可使用,不需要另行移植 FreeRTOS。
64KB Flash 下跑 FreeRTOS 需要注意 ROM 开销。FreeRTOS 内核本身约占 5~8KB Flash,加上驱动库和应用代码,需要合理裁剪任务栈和内核配置(FreeRTOSConfig.h)。
2.5 Package/ 与 Utilities/
Package/ ← DFP Pack 安装文件(Keil 芯片支持包)
Utilities/
├── FLM/ ← Flash 下载算法文件(.FLM),Keil 离线烧录使用
├── IAR_AddOn/ ← IAR 插件(Flash Loader 等)
├── pyOCD/ ← pyOCD 调试支持文件(配合 DAP-Link 使用)
└── SVD/ ← 芯片外设寄存器描述文件(.svd)
在调试器中加载后可直视寄存器内容
SVD 文件的用途:在 Keil 或 VSCode + Cortex-Debug 插件中加载 SVD 文件后,调试时可以在 Peripheral 面板里直接查看每个外设寄存器的当前值(比对照数据手册查地址方便得多)。调试 PWM 死区、ADC 采样触发时序问题时,SVD 配合调试器能大幅提升效率。
pyOCD 支持:说明极海官方认可 DAP-Link + pyOCD 这套开源调试链,不强制依赖 Keil 的 ULINK,用 VS Code + OpenOCD/pyOCD 也能完成烧录调试,对习惯现代工具链的开发者友好。
2.6 目录结构总结
| 目录 |
用途 |
使用频率 |
Boards/ |
评估板引脚定义、板级初始化 |
初次建工程时参考 |
Examples_DDL/ |
各外设独立示例,三套 IDE 齐全 |
最高 |
Libraries/CMSIS/DSP/ |
ARM 官方 DSP 库,FOC 算法可直接调用 |
FOC 开发时高 |
Libraries/Device/ |
芯片寄存器定义、启动文件 |
建工程必须包含 |
Libraries/G32M3101_DAL_Driver/ |
外设驱动库本体 |
最高 |
Middlewares/CMSIS-FreeRTOS/ |
FreeRTOS,含移植好的 M0+ 适配层 |
多任务应用时使用 |
Package/ |
Keil DFP Pack,一次性安装 |
初次配置时使用 |
Utilities/SVD/ |
寄存器调试神器 |
调试阶段高 |
电机控制开发的优先阅读路径: Template_DDL → RCC_ClockConfig_DDL → GPIO_Toggle_DDL → TMR_PWMOutput_DDL → OPA_Standalone_DDL → ADC_MultiChannelScanTimerTrigger_DDL → COMP_Output_DDL → DIV_Unsigned_DDL
参考资料
- G32M3101 评估板页面:geehy.com/design/hardware_detail/133
- G32M3101 DAL SDK V1.0.3:直接下载
- G32M3101 DFP Pack V1.0.3:直接下载
- APM32F035 无感 FOC 实战参考:芯查查
- 极海开发者社区:community.geehy.cn
- 极海 21ic 技术论坛:bbs.21ic.com/iclist-1112-1.html