Skill 开发实战
1. Skill 工作流程
向 Agent 发出开发指令后,Skill 按固定的四阶段流程推进:
flowchart LR
A[你描述需求] --> B[Agent 分析]
B --> C[Agent 出方案]
C --> D{你确认?}
D -->|确认| E[Agent 写代码]
D -->|要改| B
E --> F[编译验证]
F --> G{编译通过?}
G -->|通过| H[完成]
G -->|失败| I{重试 < 3 次?}
I -->|是| E
I -->|否| J[把错误信息发给你]
四个阶段的职责:
| 阶段 | Agent 做什么 | 你会看到什么 | 耗时 |
|---|---|---|---|
| 分析 | 读懂你的需求、检查引脚是否空闲、从 SDK 示例库里找最合适的模板、确定时钟方案(默认内部 32MHz) | — | 3~5 秒 |
| 出方案 | 输出规划摘要:工程名、引脚怎么分配、用哪个模板、时钟怎么配、代码长什么样 | 一份规划,等你确认或修改 | 取决于你 |
| 写代码 | 创建工程骨架 + 配置 .syscfg + 写 main.c + 处理 LQFP-100 → LQFP-64 封装适配 | 代码生成中,不用管 | 30~90 秒 |
| 验证 | 清理冗余文件 → SysConfig 生成配置 → gmake 编译。编译失败自动修,最多重试 3 次,3 次都失败就把错误信息发给你 | 编译进度,通过后告诉你产物在哪 | 10~30 秒 |
出方案阶段是你改需求的最佳时机
代码还没写,想换引脚、改参数、换模板,直接说就行,零成本:
- "换成 PB2 引脚"
- "闪烁间隔改为 200ms"
- "使用外部晶振"
- "不要用 PA9 和 PA10,后面要接传感器"
Agent 会重新出方案。
自动重试的边界
重试只处理编译错误(符号未定义、头文件路径不对等)。涉及硬件限制(比如引脚不支持某个功能),Agent 不会死循环,而是停下来告诉你问题在哪。
2. 基础实战:LED 闪烁
效率对比
| 传统手动开发 | Agent + Skill |
|---|---|
| 1. 查阅 MSPM0G3519 数据手册 GPIO 章节 | 输入:"LED 闪烁 PB22 500ms" |
| 2. 查 PA0 复用功能表 | |
| 3. 编写 GPIO 初始化代码 | |
| 4. 编写延时函数(SysTick / Timer) | |
| 5. 配置 CCS 工程与 sysconfig | |
| 6. 编译调试(通常多轮) | |
| 7. 烧录验证 | |
| ⏱ 约 30 分钟 | ⏱ 约 1 分钟 |
| 全程手动操作 | 开发者只需验证硬件行为 |
2.1 描述需求
在 Agent 对话框中输入:
帮我在天巧星上创建一个 LED 闪烁工程,LED 接在 PB2 引脚,闪烁间隔 500ms也可以不指定引脚,让 Agent 自动选择:
帮我在天巧星上做一个 LED 闪烁,帮我选一个空闲引脚需求描述技巧
需求越具体,规划越精准。可以附加约束条件:
- "不要用 PA9 和 PA10,后面要接串口"
- "使用定时器中断而不是 delay 循环"
- "闪烁频率用宏定义,方便后续调整"
2.2 Think 阶段输出
Agent 完成分析后输出:
| 分析项 | 结论 |
|---|---|
| 功能识别 | GPIO 推挽输出 + 定时翻转 |
| 引脚检查 | PB2 在 LQFP-64 封装上可用,未被板载外设占用 |
| SDK 模板 | gpio_toggle_output — GPIO 翻转输出示例 |
| 时钟方案 | SYSOSC 内部振荡器,32MHz |
2.3 Plan 阶段输出
工程名称:led_blink
SDK 模板:gpio_toggle_output
引脚分配:LED → PB2(推挽输出)
时钟配置:SYSOSC 32MHz
闪烁间隔:500ms(软件延时)
工程路径:./workspace/led_blink2
3
4
5
6
确认无误后回复"确认"。如需修改——换引脚、改间隔、改延时方式——在此阶段提出。
2.4 Code 阶段
Agent 自动执行以下操作:
创建工程骨架:
python scripts/scaffold.py led_blink gpio_toggle_output -o ./workspace从 SDK 的 gpio_toggle_output 示例复制工程结构,适配天巧星 LQFP-64 封装。
生成业务代码(main.c 核心逻辑):
#include "ti_msp_dl_config.h"
int main(void)
{
SYSCFG_DL_init();
while (1) {
DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
delay_cycles(DELAY_500_MSEC);
}
}2
3
4
5
6
7
8
9
10
11
配置 .syscfg:
- PB2 配置为 GPIO 推挽输出
- 时钟源:SYSOSC 32MHz
- 无外设中断
整个过程约 30~60 秒。
2.5 Verify 阶段
清理冗余文件:
python scripts/cleanup.py ./workspace/led_blink清理封装适配过程中产生的重复源文件。
编译:
python scripts/build.py ./workspace/led_blink调用 SysConfig CLI 生成 ti_msp_dl_config.c/h,再调用 gmake 编译链接,产物输出到 Debug/ 目录。
烧录:
python scripts/flash.py ./workspace/led_blink通过 DSLite 将 .out 文件写入芯片 Flash。
以上只是演示
上面展示的编译、烧录命令只是让你了解 Skill 在背后做了什么。实际操作时你不需要操心这些——Agent 收到你的需求后会自动完成全部步骤,你只需要等它告诉你"搞定了"。
烧录前提
天巧星开发板需XDS110 调试器连接电脑,且配套 XDS110 调试器已被系统正确识别。在设备管理器中应能看到 "XDS110 Class Debug Probe" 和 "XDS110 Class Application/User UART" 两个设备。
2.6 验证结果
烧录完成后按下天巧星复位键(或重新上电),PB2 引脚上的 LED 应以 500ms 间隔交替亮灭。
如果 LED 未点亮,按以下顺序排查:
| 排查项 | 检查方法 |
|---|---|
| LED 极性 | 确认 LED 阳极接 PA0、阴极经限流电阻接地(或反之,取决于电路设计) |
| 引脚连接 | 用万用表量 PA0 电压,应在 0V 和 3.3V 之间交替 |
| 烧录是否成功 | 检查 flash.py 的输出是否有 "Programming successful" |
| 复位 | 按下板上复位键,或拔插 USB 重新上电 |
3. 进阶实战:UART 串口通信
UART 是嵌入式系统中最基础的调试和通信接口。本节实现回显功能——PC 端发送的数据由芯片原样返回。
效率对比
| 传统手动开发 | Agent + Skill |
|---|---|
| 1. 查阅 UART 章节(波特率计算、中断配置) | 输入:"UART0 回显 115200" |
| 2. 配置引脚复用(PA9 TX / PA10 RX) | |
| 3. 配置时钟分频(精确波特率依赖时钟精度) | |
| 4. 编写中断服务函数 | |
| 5. 配置 NVIC 中断向量 | |
| 6. 调试波特率偏差问题 | |
| 7. 烧录 + 串口工具测试 | |
| ⏱ 约 1 小时 | ⏱ 约 2 分钟 |
3.1 描述需求
帮我在天巧星上创建一个 UART 串口通信工程,使用 UART0,波特率 115200,
实现回显功能——收到什么就发回什么2
3.2 Think 与 Plan
Think 分析结果:
| 分析项 | 结论 |
|---|---|
| 功能识别 | UART 串口通信,中断接收,回显模式 |
| 引脚检查 | UART0 TX → PA9,RX → PA10,均为空闲引脚 |
| SDK 模板 | uart_echo_interrupts — 串口中断回显示例 |
| 时钟方案 | SYSOSC 32MHz(115200 波特率误差在可接受范围内) |
| 波特率 | 115200 bps,8N1(8 数据位、无校验、1 停止位) |
Plan 规划摘要:
工程名称:uart_echo
SDK 模板:uart_echo_interrupts
脚分配:UART0_TX → PA9, UART0_RX → PA10
波特率:115200 (8N1)
中断模式:RX 接收中断
时钟配置:SYSOSC 32MHz
工程路径:./workspace/uart_echo2
3
4
5
6
7
确认后 Agent 进入 Code 阶段。
3.3 Code 与 Verify
流程与 LED 闪烁一致:生成工程 → 配置引脚(PA9 TX、PA10 RX)→ 设置波特率 → 编写中断回显逻辑 → 编译验证 → 烧录。
核心代码逻辑:
void UART_0_INST_IRQHandler(void)
{
switch (DL_UART_Main_getPendingInterrupt(UART_0_INST)) {
case DL_UART_MAIN_IIDX_RX:
uint8_t data = DL_UART_Main_receiveData(UART_0_INST);
DL_UART_Main_transmitData(UART_0_INST, data);
break;
default:
break;
}
}2
3
4
5
6
7
8
9
10
11
RX 中断触发时,读取接收缓冲区的数据并立即写入发送缓冲区,实现字节级回显。
3.4 运行验证
烧录成功后,使用串口工具连接天巧星:
python scripts/serial_console.py COM6 115200| 参数 | 说明 |
|---|---|
COM6 | 天巧星在当前电脑上的串口号 |
115200 | 波特率,必须与工程配置一致 |
确认串口号
Windows: 设备管理器 → "端口 (COM 和 LPT)" → 找到 "XDS110 Class Application/User UART" 对应的 COM 号。
macOS / Linux: 查看 /dev/ttyACM* 或 /dev/ttyUSB*。
快速定位: 拔掉 USB 线观察哪个端口消失,再插上观察哪个端口出现——那就是天巧星的串口。
连接成功后,在终端中输入任意字符,应立即收到相同字符的回显。回显正常说明 UART 的收发通路完全畅通。
在此基础上可以扩展:传感器数据上报、AT 指令解析、调试日志输出等,都是在回显逻辑上叠加业务代码。
4. 编译与烧录工具链详解
Skill 的编译烧录依赖以下脚本,理解它们的工作原理有助于问题排查。
4.1 编译流程
编译分两步:清理 → 构建。
Step 1:cleanup.py — 清理冗余文件
python scripts/cleanup.py ./workspace/led_blink作用:删除封装适配过程中产生的重复 .c 源文件。SDK 示例面向 LQFP-100,适配到 LQFP-64 时会残留无用的设备描述文件,不清理会导致链接阶段出现 "Duplicate symbol" 错误。
Step 2:build.py — 编译链接
python scripts/build.py ./workspace/led_blink内部执行顺序:
- 调用 SysConfig CLI,根据
.syscfg文件生成ti_msp_dl_config.c和ti_msp_dl_config.h - 调用 gmake,使用 TI Clang 编译器编译所有源文件
- 链接生成
.out可执行文件(ELF 格式)
产物位于工程的 Debug/ 目录下。
4.2 烧录流程
python scripts/flash.py ./workspace/led_blink内部执行顺序:
- 自动生成
.ccxml目标配置文件(指定调试器类型和芯片型号) - 调用 DSLite 命令行工具将
.out写入芯片 Flash - 烧录完成后自动复位芯片(取决于配置)
支持的调试器:
| 调试器 | 说明 |
|---|---|
| XDS110 | 天巧星配套调试器,USB 直连,一根线完成供电 + 烧录 + 串口 |
| J-Link | 外部调试器,需自行安装驱动并修改 .ccxml 中的调试器配置 |
4.3 串口监视
python scripts/serial_console.py <端口> <波特率>| 参数 | Windows 示例 | macOS/Linux 示例 |
|---|---|---|
| 端口 | COM6 | /dev/ttyACM0 |
| 波特率 | 115200 | 115200 |
使用 Ctrl+C 退出串口监视。
5. 开发技巧
5.1 SDK 模板速查
| 功能 | SDK 模板名称 | 典型应用 |
|---|---|---|
| GPIO 输出 | gpio_toggle_output | LED 控制、电平信号输出 |
| GPIO 输入 | gpio_input_interrupt | 按键检测、外部中断 |
| UART 回显 | uart_echo_interrupts | 串口调试、通信接口 |
| PWM 输出 | pwm_duty_cycle | 呼吸灯、电机调速、蜂鸣器 |
| ADC 采集 | adc_single_channel | 电压采样、传感器读数 |
| I2C 通信 | i2c_controller_rw | I2C 设备驱动(OLED、传感器) |
| SPI 通信 | spi_controller_external_loopback | SPI 设备驱动(Flash、SD 卡) |
| 定时器中断 | timer_periodic_interrupt | 精确定时、任务调度 |
不确定用哪个模板时,直接向 Agent 描述功能需求即可——模板选择是 Skill 的自动行为。
5.2 天巧星引脚占用表
以下引脚已被板载外设占用,分配时需注意避让:
| 板载外设 | 占用引脚 | 功能 |
|---|---|---|
| SPI Flash (W25Q64) | PB6, PB7, PB8, PB9 | 64Mbit NOR Flash 存储 |
| OLED 显示屏 | PA0, PA1 | 软件 I2C 驱动 |
| WS2812 RGB LED | PB26 | 可编程彩色灯珠 |
| 蜂鸣器 | PB27 | PWM 驱动 |
| 用户按键 | PA24 (KEY1), PB24 (KEY2), PB21 (ENTER), PA18 (BACK) | 输入控制 |
| USB 转串口 (CH340) | PA10, PA11 | UART0 调试串口 |
| 无线串口模块 | PB17, PB18 | UART7 |
| 旋转编码器 | PA29, PA30, PA31 | QEI + 按键 |
| IMU 姿态传感器 | PA0, PA1 | 共用 I2C 总线 |
| XDS110 调试接口 | PA19, PA20 | SWD 烧录和调试 |
| 外部晶振 (HFXT) | PA5, PA6 | 40 MHz 高速外部振荡器 |
高危引脚
PA19 / PA20(SWD 调试接口):误占用后将无法通过 XDS110 烧录,需要通过 BSL 引导模式恢复。除非明确知道后果,否则不要将这两个引脚分配给其他功能。
获取可用引脚: 在对话中直接询问 Agent:
天巧星上有哪些 GPIO 引脚可以用来驱动 LED?Agent 会根据 Skill 中的占用表返回当前空闲引脚列表。
5.3 增量开发
Skill 生成的工程是一个完整可编译的起点,后续可以通过持续对话进行增量修改,无需重新走完整流程:
- 添加外设:"在这个工程里再加一路 PWM 输出,用 PB0"
- 修改逻辑:"把 LED 闪烁改成呼吸灯效果(PWM 渐变)"
- 组合功能:"同时使用 UART 和 ADC,串口打印 ADC 采样值"
- 调整参数:"把波特率从 115200 改成 9600"
推荐的渐进式开发策略:先跑通单个外设功能,确认硬件连接正确后,再逐步叠加新功能。每一步都可独立验证,出问题时容易定位。
不要手动编辑 SysConfig 生成文件
ti_msp_dl_config.c 和 ti_msp_dl_config.h 由 SysConfig 根据 .syscfg 自动生成。任何手动修改在下次编译时都会被覆盖。
需要修改硬件配置时,应编辑 .syscfg 文件(或告诉 Agent 帮你改)。
6. 练习建议
按难度递进:
| 难度 | 练习内容 | 涉及知识点 |
|---|---|---|
| ★☆☆☆ | 将 LED 闪烁间隔从 500ms 改为 200ms | 参数修改、重新编译 |
| ★★☆☆ | UART 收到 '1' 点亮 LED,收到 '0' 熄灭 | GPIO + UART 联动、条件判断 |
| ★★★☆ | PWM 呼吸灯(LED 亮度平滑渐变) | 定时器 PWM 模式、占空比调节 |
| ★★★★ | ADC 采样 + UART 上报(简易电压表) | ADC 配置、数据格式化、串口输出 |
每个练习只需一句自然语言描述需求,Agent 完成代码生成和编译。你的任务是验证硬件行为是否符合预期,并理解生成的代码逻辑。
附:常见问题速查
Q:编译通过但 LED 不亮
排查顺序:硬件连接(LED 极性、限流电阻、杜邦线接触)→ 引脚编号一致性 → 烧录是否成功 → 是否需要按复位键。
Q:串口收到乱码
几乎都是波特率不匹配。确认 serial_console.py 的波特率参数与工程 .syscfg 中配置的完全一致。其次检查时钟配置——波特率依赖时钟精度,SYSOSC 在常温下误差通常可接受。
Q:Plan 阶段的方案不符合预期
直接在对话中提出修改意见。Plan 阶段的作用就是让用户审核决策——换模板、换引脚、改参数都可以,Agent 会重新规划。
Q:生成的工程能否用 CCS Theia 打开
可以。生成的工程是标准 CCS Theia 格式,可以用 CCS Theia IDE 打开,进行手动修改、图形化 SysConfig 配置、断点调试等操作。也可以继续通过 Agent 对话进行增量开发。