芯片包配置
芯片包配置通过直接编辑项目文件完成。了解每个配置文件的作用和编写方法是配置芯片包的关键。
概述
芯片包是多个配置文件的集合,定义了芯片的全部特性:基本信息、引脚、外设、时钟树和代码生成模板。新版采用文件驱动的方式,所有配置通过编写 .cjs 文件完成,不再依赖图形化界面。
项目初始化
通过 VSCODE 中的 mcustudio 扩展创建芯片包项目:
- 安装 VSCODE 扩展
mcustudio - 使用扩展命令创建芯片包项目
- 项目将生成标准的目录结构
配置文件一览
| 文件 | 位置 | 作用 |
|---|---|---|
info.cjs | chip/{系列}/{型号}/ | 芯片元数据:Flash、RAM、IO 数量、封装、外设列表 |
pins.cjs | chip/{系列}/{型号}/ | 引脚复用功能映射 |
nvic.cjs | chip/{系列}/{型号}/ | 中断向量表和 IP 关联 |
dma.cjs | chip/{系列}/{型号}/ | DMA 通道分配 |
ui.cjs | chip/{系列}/{型号}/ | 芯片级别的 UI 配置 |
code.cjs | chip/{系列}/ | IP 类型到模板版本的映射 |
define.cjs | chip/{系列}/ | 寄存器宏定义映射 |
ide.cjs | chip/{系列}/ | IDE 支持配置 |
芯片型号配置
info.cjs — 芯片元数据
定义芯片的基本属性和外设列表:
module.exports = {
name: 'GD32F103ZET6',
series: 'GD32F103XX',
flash: 512, // Flash 大小 (KB)
ram: 64, // RAM 大小 (KB)
io: 112, // IO 口数量
package: 'LQFP144', // 封装类型
ips: [ // 外设列表
{ name: 'ADC', max: 3 },
{ name: 'CAN', max: 1 },
{ name: 'GPIO', max: 1 },
{ name: 'SPI', max: 3 },
{ name: 'TIM', max: 8 },
{ name: 'USART', max: 5 }
]
}
pins.cjs — 引脚配置
定义每个引脚的复用功能:
module.exports = [
{
name: 'PA0',
port: 'GPIOA',
pin: 'GPIO_PIN_0',
af: [
{ name: 'Reset_State', value: '-1' },
{ name: 'USART1_TX', value: 'GPIO_ALTERNATE_USART1_TX' },
{ name: 'TIM2_CH1', value: 'GPIO_REMAP_TIM2_CH1' }
]
}
]
nvic.cjs — 中断配置
module.exports = {
ip_names: {
'USART1_IRQn': 'USART1',
'TIM2_IRQn': 'TIM2',
'ADC1_2_IRQn': 'ADC1'
}
}
系列级配置
code.cjs — IP 版本映射
指定该系列各个外设使用的代码模板版本:
module.exports = {
ADC: {
ip_type: 'ADC',
version: '1.0'
},
GPIO: {
ip_type: 'GPIO',
version: '1.0'
}
}
ide.cjs — IDE 配置
module.exports = {
keil: {
device: 'GD32F103ZE',
cpu: 'Cortex-M3'
},
cmake: {
toolchain: 'arm-none-eabi-gcc'
}
}
外设模板配置
外设的 UI 界面和代码生成逻辑分开配置:
UI 配置 (ips/{IP}/ui/)
以 JavaScript 对象定义外设的配置面板和参数:
// ips/GPIO/ui/gpio_base.cjs
const project = {
generate_code: { value: true },
function_name: { value: 'Studio_GPIO_Init' },
firmware: {
value: 'std',
options: [
{ label: 'Standard', value: 'std' },
{ label: 'HAL', value: 'hal' },
{ label: 'LL', value: 'll' }
]
}
}
const parameters = {
mode: {
label: 'Mode',
type: 'select',
options: [
{ label: 'Output Push-Pull', value: 'OUT_PP' },
{ label: 'Input Floating', value: 'IN_FLOATING' }
]
}
}
module.exports = { project, parameters, functions }
代码模板 (ips/{IP}/code/{version}/)
// ips/GPIO/code/1.0/pre.cjs — 数据预处理
module.exports = ({ ip, locals }) => {
const ip_pins = locals.global.GPIO.get_ip_gpios([ip.$name])
Object.assign(ip, ip_pins)
}
<!-- ips/GPIO/code/1.0/std.c.ejs — 代码模板 -->
void <%= ip.function_name.value %>(void) {
<% ip.ports.forEach(port => { %>
gpio_init(<%= port %>, ...);
<% }) %>
}
版本管理
配置文件以版本号组织,实现跨芯片型号复用:
ips/I2C/code/
├── 1.0/ # 基础版本
├── 2.0/ # 新增 DMA 支持
└── 3.0/ # 优化代码生成
不同芯片型号可选择不同版本:
GD32F103 → I2C code v1.0
GD32F30x → I2C code v2.0
详见 版本管理机制。
构建与发布
# 构建芯片包
npm run build
# 发布到平台
npm run publish
