# svd_to_header **Repository Path**: lw0519/svd_to_header ## Basic Information - **Project Name**: svd_to_header - **Description**: No description available - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-02-26 - **Last Updated**: 2026-02-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SVD 转头文件工具 根据 CMSIS-SVD 文件生成标准的 C 头文件,类似 svdconv.exe 的功能,但使用 groupName 作为结构体名称。 ## 功能特性 - ✅ 解析 SVD 文件中的所有外设定义 - ✅ **使用 groupName 作为结构体名称**(如 `ADC_TypeDef`, `UART_TypeDef`) - ✅ 生成完整的 CPU 配置信息(NVIC、MPU、FPU、DSP 等) - ✅ 生成完整的中断向量表定义(Cortex-M 标准异常 + 设备特定中断) - ✅ 自动处理寄存器偏移和保留字段 - ✅ 支持寄存器 union(同一偏移量的不同视图) - ✅ 正确区分只读(`__I`)、只写(`__O`)和读写(`__IO`)寄存器 - ✅ 兼容旧版本 CMSIS(`__IM`、`__OM`、`__IOM` 宏定义) - ✅ 在寄存器结构体中生成位域视图(匿名 `union` + 位域 `struct`) ## 系统要求 - Python 3.6+ - 标准库(无需额外安装依赖) ## 使用方法 ### 基本用法 ```bash # 使用默认文件名(当前目录下的 ACM32H5XX.svd) python svd_to_header.py # 指定 SVD 文件 python 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 ``` > 位域检查说明:默认仅提示“重叠/越界”;启用 `--strict-bitfield` 后,会额外提示“未覆盖位”。 ### 示例 ```bash python svd_to_header.py ACM32H5XX.svd acm32h5xx.h ``` ## 生成的头文件结构 生成的头文件包含以下部分: ### 1. CPU 配置信息 ```c #define __SMC1_REV 0x0001U // 核心版本 #define __NVIC_PRIO_BITS 3 // NVIC 优先级位数 #define __Vendor_SysTickConfig 0 // SysTick 配置 #define __VTOR_PRESENT 1 // 向量表偏移寄存器 #define __MPU_PRESENT 1 // MPU 支持 #define __FPU_PRESENT 1 // FPU 支持 #define __FPU_DP 0 // 双精度 FPU #define __DSP_PRESENT 1 // DSP 扩展 #define __SAUREGION_PRESENT 0 // SAU 区域 ``` ### 2. 中断向量表枚举 ```c typedef enum IRQn { // Cortex-M 标准异常 NonMaskableInt_IRQn = -14, HardFault_IRQn = -13, // ... // 设备特定中断 WDT_IRQn = 0, ADC1_2_IRQn = 14, // ... } IRQn_Type; ``` ### 3. 外设结构体定义 ```c typedef struct { union { __IM uint32_t SR; // 整寄存器访问(只读) struct { __IM uint32_t ADCRDY : 1; __IM uint32_t EOSMP : 1; // ... } SR_f; // 位域访问 }; union { __IOM uint32_t CR1; // 整寄存器访问(读写) struct { __IOM uint32_t AWDCH : 5; __IOM uint32_t AWDEN : 1; // ... } CR1_f; // 位域访问 }; // ... } ADC_TypeDef; ``` ### 4. 外设实例定义 ```c #define ADC1_BASE (0x50000000UL) #define ADC1 ((ADC_TypeDef *) ADC1_BASE) ``` ## 使用生成的头文件 ```c #include "acm32h5xx.h" void example(void) { // 位域方式读取状态位 uint32_t eoc = ADC1->SR_f.EOC; // 整寄存器方式读取/写入 uint32_t sr = ADC1->SR; ADC1->CR1 |= (1UL << 12); // AWDEN ADC1->CR1 |= (1UL << 24); // CONT // 位域方式配置 ADC ADC1->CR1_f.AWDEN = 1; ADC1->CR1_f.CONT = 1; // 使用中断号 NVIC_EnableIRQ(ADC1_2_IRQn); } // 中断处理函数 void ADC1_2_IRQHandler(void) { // 处理 ADC 中断 if (ADC1->SR_f.EOC) { // ... } } ``` ## ACM32H5XX 生成结果 - **44 个外设结构体**(按 groupName 分组) - **128 个外设实例** - **129 个中断向量** 主要外设组包括: - ADC、DAC、COMP(模拟外设) - TIM(定时器:TIM1/2/6/9/10/15/16/26) - UART、LPUART、I2C、SPI、I2S(通信接口) - GPIO(17 组:GPIOA-GPIOQ) - FDCAN、ETH、USB(高速接口) - DMA、DMAC(DMA 控制器) - RCC、PMU、RTC(系统和电源管理) - FMC、OSPI、QSPI(存储接口) - DCMI、LTDC、DMA2D(图形显示) ## svdconv.exe 简要使用说明 `svdconv.exe` 是 CMSIS 提供的 SVD 转换工具,可将 `.svd` 文件转换为 C 头文件、分区文件等资源。 ### 基本命令 ```bash svdconv.exe [选项] ``` ### 常见示例 ```bash ./svdconv.exe ACM32H5XX.svd --generate=header --outdir=./out --create-folder ./svdconv.exe ACM32H5XX.svd --generate=sfr --outdir=./out --create-folder ./svdconv.exe ACM32H5XX.svd --generate=header --outdir=./out --create-folder 2> svdconv_error.log ./svdconv.exe ACM32H5XX.svd --generate=header --outdir=./out --create-folder > svdconv_all.log 2>&1; Select-String -Path .\svdconv_all.log -Pattern 'WARNING|ERROR' | ForEach-Object { $_.Line } | Set-Content .\svdconv_warn_error.log ``` > 说明:`svdconv` 的 `WARNING/INFO` 通常输出到标准输出(`stdout`),不一定进入 `2>` 错误文件;如需完整诊断信息,推荐使用 `-b`(`--log`)或 `> all.log 2>&1`。 ### 常用参数 - `--generate=header`:生成寄存器头文件 - `--generate=partition`:生成分区相关文件(按工具版本支持) - `--outdir=<目录>`(或 `-o <目录>`):指定输出目录 - `--create-folder`:自动创建输出目录 - `-b <文件>`(或 `--log <文件>`):输出诊断日志(含警告/错误) - `--fields=macro|struct|enum`:控制位域输出形式(不同版本可能略有差异) - `--strict`:启用更严格的检查 ### 典型流程 1. 准备 `.svd` 文件 2. 执行 `svdconv.exe` 3. 查看日志与错误信息 4. 在输出目录获取生成文件 > 注意:不同 CMSIS 版本的参数可能存在差异,请以 `svdconv.exe --help` 输出为准。 ## 与 svdconv.exe 的区别 1. **结构体命名**:使用 `groupName` 而不是外设名称 - svdconv: `ADC1_TypeDef`, `ADC2_TypeDef`, `ADC3_TypeDef`(重复定义) - 本工具: `ADC_TypeDef`(统一定义,多个实例共享) 2. **派生外设处理**:自动识别 `derivedFrom` 属性,避免重复定义 3. **寄存器 union**:自动识别同一偏移量的多个寄存器视图 ## 许可证 本工具为开源工具,可自由使用和修改。 ## 作者 根据 ACM32H5XX.svd 生成器开发