[电机控制专用MCU] 【极海G32M3101电机通用评估板测评】DAL SDK 深度解析

[复制链接]
82|1
hbzjt2011 发表于 2026-6-2 11:10 | 显示全部楼层 |阅读模式

一、什么是 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 后,完整目录如下:

image.png

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_DDLRCC_ClockConfig_DDLGPIO_Toggle_DDLTMR_PWMOutput_DDLOPA_Standalone_DDLADC_MultiChannelScanTimerTrigger_DDLCOMP_Output_DDLDIV_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
LOVEEVER 发表于 2026-9-5 17:48 | 显示全部楼层
DAL 的代码风格与 STM32 标准外设库高度相似。如果你写过 STM32F0/F1 的标准库代码,看 G32M3101 的 DAL 源码会有强烈的既视感,迁移成本非常低。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎参与LabVIEW版块的讨论学习! 点我一键即达

452

主题

3422

帖子

47

粉丝
快速回复 在线客服 返回列表 返回顶部
0