Use this skill when working on TI MSPM0 firmware projects that use CCS, CCS Theia, SysConfig, and DriverLib.
This skill is for Claude Code, OpenCode, OpenClaw, Continue, Cursor, Codex, and other skill-aware CLI or editor agents. It is not Codex-specific.
First Steps
- Locate the project
.syscfgfile. - Read the
.syscfgmetadata: device, package, SDK product, and SysConfig tool version. - Inspect generated
ti_msp_dl_config.hfor generated names, macros, IRQ names, and init function spelling. - Inspect existing module instances, such as GPIO, UART, PWM, I2C, ADC, TIMER, SYSCTL, DMA, and interrupts.
- If the needed SysConfig field or enum is unclear, read
references/syscfg_schema_sources.mdand inspect local SDK examples or.meta/*.syscfg.jsbefore editing. - Read the relevant docs under
references/before changing hardware configuration. - Modify the smallest relevant
.syscfgsection and follow the local naming style. - Update application code to use generated DriverLib macros.
- Rebuild or run SysConfig CLI after
.syscfgchanges.
Core Rules
- Treat
.syscfgas the source of truth for pinmux, peripherals, clocks, and generated initialization. - For GPIO, UART, PWM, I2C, SPI, ADC, Timer, clock, DMA, and interrupt setup, prefer changing
.syscfgrather than hand-written register or generated-code edits. - Read
ti_msp_dl_config.hto confirm macro names, IRQ names, instance names, and init function spelling. - Application code must call the generated SysConfig init function before using generated peripherals.
- If a pin or peripheral conflict occurs, fix
.syscfgfirst. - Do not assume a pin is valid only because it exists on the package. Verify pinmux through SysConfig or generated output.
- Follow the existing project naming style for modules, pins, macros, and interrupt handlers.
- Ask before changing device, package, board, SDK, compiler, CCS version, or debug probe.
- Do not freehand new SysConfig fields. If unsure, search the local MSPM0 SDK examples and module metadata first.
Safe Edit Scope
Usually safe to edit:
- Application source files such as
main.c,empty.c,app/*.c,bsp/*.c, and matching headers. .syscfg.- Project documentation.
- User-owned board support files.
Avoid hand-editing generated or build output files:
Debug/ti_msp_dl_config.cDebug/ti_msp_dl_config.hRelease/ti_msp_dl_config.cRelease/ti_msp_dl_config.hDebug/device.optDebug/device_linker.cmdDebug/device.cmd.genlibsDebug/*.mk- Object files, maps,
.out, and other build outputs.
Generated files may be inspected, but changes should be made in source files or .syscfg.
DriverLib Rules
- Prefer
DL_GPIO_*,DL_UART_*,DL_Timer*,DL_I2C_*, andDL_ADC12_*APIs. - Keep interrupt handlers short.
- Clear interrupt flags correctly.
- Use
volatilefor variables shared with interrupt handlers. - Avoid long blocking delays inside high-frequency interrupts.
- Do not mix register-level configuration with SysConfig-generated setup unless the user explicitly requests it and the reason is documented.
Validation Workflow
- Run
python scripts/check_syscfg.py <project-dir>when this skill is available. - After
.syscfgchanges, look for the CCS-generated SysConfig command inDebug/subdir_rules.mk. - Run SysConfig CLI directly or rebuild through the CCS-generated makefile.
- If CLI validation is unavailable, ask the user to rebuild in CCS and paste SysConfig or compiler errors.
- If flashing, confirm
targetConfigs/*.ccxmlmatches the physical debug probe. - For automated DSLite flashing, prefer
-r 2 -uso the target receives a System Reset after programming.
For manual flashing, press the board reset button after programming if the first run appears to use the wrong clock speed.
Never Do This
- Do not manually edit
Debug/ti_msp_dl_config.corDebug/ti_msp_dl_config.h. - Do not delete
.syscfgmetadata such as@cliArgs,@v2CliArgs,@versions,--device,--package, or--product. - Do not guess pinmux validity from a package pin alone.
- Do not guess whether the generated init function is
SYSCFG_DL_init()orSYSCFG_DL_Init(). - Do not migrate device, package, board, SDK, compiler, CCS version, or debug probe without asking.
- Do not invent
.syscfgfield names, enum values,@cliArgs,@v2CliArgs, device, package, product, or version metadata.
Reference Selection
references/syscfg_rules.md: safe.syscfgedits.references/ccs_project_rules.md: CCS project layout and generated files.references/driverlib_rules.md: DriverLib initialization, ISR, and API rules.references/common_mistakes.md: known agent failure modes.references/validated_workflow.md: verified Tianmengxing MSPM0G3507 PB22 LED workflow.references/cli_validation.md: SysConfig CLI -> gmake -> DSLite/J-Link command chain.references/clock_tree_rules.md: CPUCLK, SYSPLL, HFXT, MFCLK, UART clocks, anddelay_cycles()assumptions.references/uart_blocking_tx.md: verified UART0 blocking transmit smoke test before DMA or variable-length receive.references/syscfg_schema_sources.md: how to use local MSPM0 SDK examples and.meta/*.syscfg.jsinstead of guessing.syscfgfields.
Tools
Run python scripts/check_syscfg.py <project-dir> when this skill is available and you need a quick static check of a CCS project. The tool checks .syscfg metadata, generated SysConfig files, assigned pins, init-function spelling, and prints validation command hints when it can infer them from the project.
Run python scripts/serial_console.py --list to list PC serial ports. For the verified CH340 setup, use python scripts/serial_console.py -p COM6 -b 115200 --timestamp --duration 10 after closing other serial tools such as VOFA+.
Run python scripts/index_syscfg_examples.py <mspm0-sdk-root> --board LP_MSPM0G3507 --module UART to index local TI SDK .syscfg examples and source/ti/driverlib/.meta/*.syscfg.js module metadata before authoring unfamiliar SysConfig fields.