变量
芯片模板中可用的全局变量和表达式语法。
$root
当前外设实例的根节点。通过 $root 访问该外设的所有参数、模式和子面板:
$root.Mode.value // 当前外设的 Mode 参数值
$root.BaudRate.value // 波特率
$root.$name // 外设实例名,如 'USART1'
$root.enabled() // 外设是否使能
$clock
时钟树实例。通过节点 ID 访问时钟频率:
$clock['IRC8M'].outclk // IRC8M 输出频率:8000000
$clock['HXTAL'].outclk // HXTAL 输出频率
$clock['PLLMF'].outclk // PLL 倍频后频率
$clock['SYSSEL'].outclk // 系统时钟选择器输出
$clock['IRC8M'].disabled // IRC8M 是否禁用
每个时钟节点的属性:
| 属性 | 说明 |
|---|---|
outclk | 输出频率 (Hz) |
inclk | 输入频率 (Hz) |
disabled | 是否禁用 |
value | 当前值 |
$pins
引脚实例。$pins.pins 为芯片所有引脚的数组。
$pins.pins // 所有引脚数组
$pins.pins[i].name // 如 'PA0'
$pins.pins[i].port // 如 'GPIOA'
$pins.pins[i].af // 复用功能数组 [{name, value}]
$global
所有外设实例的集合。用于跨外设访问:
$global['USART1'] // USART1 外设实例
$global['GPIO'].enabled() // GPIO 是否使能
$global['ADC0'].Mode.value // ADC0 的 Mode 值
ip(pre.cjs 专用)
在 ips/{IP}/code/{version}/pre.cjs 中使用,代表当前外设的配置对象:
ip.$name // 外设实例名
ip.firmware.value // 固件类型 ('std' | 'hal' | 'll')
ip.DMA // DMA 面板配置
ip.NVIC // NVIC 面板配置
ip.function_name.value // 生成的函数名
locals(pre.cjs 专用)
全局上下文对象:
locals.global // 所有外设函数集合,等同 global
locals.defineMap // 寄存器宏映射表(common/define.cjs + chip define.cjs)
@get: 表达式
在 ui.cjs 的配置值中使用,实现响应式引用和计算:
// 直接引用
"@get: $root.Mode.value"
// 引用时钟树
"@get: $clock['IRC8M'].outclk"
// 引用其他外设
"@get: USART1.enabled()"
// 条件表达式
"@get: $root.NbrOfConversion.value <= 1"
// 复杂表达式
"@get: parseFloat($parent.selected.label.replace('x', ''))"
// 条件禁用
disabled: "@get: $clock['HXTAL'].disabled"
// 条件可见
visible: "@get: $root.EnableWatchDog.value === true"
@set:
用于将计算结果写回指定路径,配合 @get: 实现双向绑定:
// 选择器的 value 随父级输入值变化
value: "@set: $parent.inclk"
// 根据选项动态设置 semaphore(信号量)
semaphore: "@set: '@get: $parent.value === \"Disable\" ? \"\" : $parent.value'"
// 配合 @get 实现联动赋值
"@set: @get: $root.Mode.value === 'enable' ? $parent.outclk : 0"
@value:
简化版的值获取,直接返回表达式计算结果,不建立响应式依赖:
// 获取计算后的值但不追踪依赖
value: "@value: $parent.inclk * 2"
// 用于需要当前值但不关心后续变化的场景
"@value: $pins.pins.length"
