硬汉嵌入式论坛

 找回密码
 立即注册
查看: 68|回复: 2
收起左侧

[客户分享] 我写了一个 SVD 转 C 头文件工具:用 groupName 生成更干净的外设结构体

[复制链接]

2

主题

91

回帖

97

积分

初级会员

积分
97
发表于 昨天 16:53 | 显示全部楼层 |阅读模式
一、背景:为什么要自己写一个 SVD 转换工具?
做 MCU 底层开发时,SVD(CMSIS-SVD)是非常重要的“寄存器描述源”。
常规做法是用 svdconv.exe 生成头文件,但在一些芯片包里会遇到这些问题:
  • 结构体命名不够理想(常按外设实例名展开,重复定义较多)
  • 派生外设处理不够直观
  • 同偏移寄存器多视图(union 视图)处理不够“贴手”
  • 位域可读性、可维护性一般
于是我写了一个 Python 工具:从 SVD 直接生成 CMSIS 风格头文件,并优先使用 groupName 作为结构体名

二、工具核心能力
这个工具的目标是“生成可直接用于工程的头文件”,主要包括:
  • 解析全部外设定义
  • 使用 groupName 作为结构体名(例如 ADC_TypeDef、UART_TypeDef)
  • 生成 CPU 配置宏(NVIC/MPU/FPU/DSP 等)
  • 生成完整中断向量枚举(标准异常 + 设备中断)
  • 自动补齐寄存器空洞(RESERVED)
  • 同偏移寄存器自动生成 union
  • 根据访问属性区分 __IM / __OM / __IOM
  • 兼容旧 CMSIS 宏回退(__IM、__OM、__IOM)
  • 可选严格位域检查(--strict-bitfield)

三、为什么 groupName 很关键?
很多 SVD 里,像 ADC1/ADC2/ADC3 本质寄存器布局一致。
如果按实例名生成,就可能出现重复结构体定义;而按 groupName 聚合后:
  • 同类外设只定义一次结构体
  • 多实例共享类型定义
  • 头文件体积和冗余明显减少
  • 后续维护更清晰
一句话:结构更“工程化”

四、使用方式(非常简单)# 默认读取当前目录 ACM32H5XX.svdpython svd_to_header.py# 指定输入 SVDpython svd_to_header.py your_device.svd# 指定输入 + 输出python svd_to_header.py your_device.svd output.h# 启用严格位域检查python svd_to_header.py your_device.svd output.h --strict-bitfield
执行后会输出解析信息、生成结构体数量、外设组统计以及中断数量。

五、生成结果长什么样?1)CPU 配置宏
会生成 __NVIC_PRIO_BITS、__FPU_PRESENT、__MPU_PRESENT 等核心宏定义。
2)IRQn 枚举
包含 Cortex-M 标准异常和设备中断,按中断号排序,便于直接用于 NVIC 配置。
3)外设结构体
每个寄存器既支持整寄存器访问,也支持位域访问:
  • 整寄存器:ADC1->CR1
  • 位域:ADC1->CR1_f.CONT
4)外设实例宏
自动生成 XXX_BASE 和 XXX 指针宏,能直接在驱动中使用。

六、实现思路(简版)
整体流程是:
  • 解析 XML,读取 CPU / peripherals / interrupts
  • 第一遍收集外设定义,第二遍处理 derivedFrom
  • 以 groupName 聚合寄存器布局
  • 按 offset 排序并插入 RESERVED
  • 同 offset 多寄存器生成 union
  • 输出类型定义、基地址、实例宏和头文件收尾
位域解析同时兼容三种写法:
  • bitOffset + bitWidth
  • lsb + msb
  • bitRange(如 [7:0])

七、和 svdconv.exe 的差异(重点)
  • 命名策略不同:本工具优先 groupName,结构体更聚合
  • 派生外设更直观:自动复用源外设寄存器定义
  • 同偏移 union 更友好:支持一个地址多个寄存器视图
  • 位域检查可选加强:--strict-bitfield 可额外检查未覆盖位
不是替代关系,而是:如果你更关注“可维护的寄存器头文件结构”,这个实现会更顺手。

八、实战价值
这个工具很适合以下场景:
  • 新芯片 bring-up,需要快速得到可靠寄存器层
  • 团队内部统一寄存器访问风格(整寄存器 + 位域双通道)
  • 对生成代码可读性、可维护性有要求的项目
  • 需要定制生成规则,而不是黑盒工具链

九、后续可优化方向
  • 支持 dim/dimIndex 自动展开数组寄存器
  • 生成字段枚举值(enumeratedValues)
  • 增加更细粒度的模板定制(注释风格、命名规则)
  • 增加单元测试样例集(不同厂商 SVD 兼容性)

十、总结
如果你也遇到过“生成头文件能用,但不够好维护”的问题,
可以试试这种基于 groupName 的生成方式:减少重复、提高可读性、方便二次开发
对底层开发来说,工具不只是“能生成”,更重要的是“生成后好维护”。这正是我做这个脚本的出发点。
十一、项目地址

评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

5

主题

232

回帖

247

积分

高级会员

积分
247
发表于 昨天 18:44 | 显示全部楼层
做的不错,赞
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121165
QQ
发表于 7 小时前 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-2-26 07:50 , Processed in 0.048208 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表