Die Oberfläche ist lokalisiert; Skill-Beschreibungen und -Dokumente werden per KI automatisch in Ihre Sprache übersetzt. Code, Befehle, Pfade und Fachbegriffe bleiben im Original, maßgeblich ist das Dokument des Autors.
Skills entdecken
Entwicklung · SKILL.md

stm32-keil

stm32-keil

Use when Codex needs to generate, review, validate, flash, debug, or diagnose STM32 Keil/CubeMX projects, especially .ioc files, HAL peripheral configuration, ST-Link/OpenOCD/CubeProgrammer flashing, and serial console workflows.

Independent GitHub snapshot · Automated classification · Original documentation governs

Skill-Dokumentation

GitHub

name: stm32-keil description: Use when Codex needs to generate, review, validate, flash, debug, or diagnose STM32 Keil/CubeMX projects, especially .ioc files, HAL peripheral configuration, ST-Link/OpenOCD/CubeProgrammer flashing, and serial console workflows.

STM32 Keil Skill

AI 工作规范文档。工具层(Python)保证格式正确,AI 负责意图理解和问答。


工作流程

1. 解析需求  → 识别外设列表、引脚意图
2. 问答补全  → 有缺失必填项时,一次性列出 + 默认值,等用户确认
3. 生成 .ioc → ioc_writer.py(mcu, config_dict) → project.ioc
4. 自动验证  → ioc_parser.py 回读 + check_project.py 冲突检查
5. 用户确认  → 提示用CubeMX打开验证无报错,确认后继续

引脚复用规则(冲突决策树)

STM32F103 常见复用冲突,遇到时不问用户,直接报警告 + 推荐替代:

引脚复用1复用2推荐
PA6TIM3_CH1(编码器)SPI1_MISO编码器用PA6时,SPI1改用SPI2
PA7TIM3_CH2(编码器)SPI1_MOSI同上
PA9TIM1_CH2(PWM)USART1_TXPWM用PA9时,调试串口改USART3(PB10)
PA10TIM1_CH3USART1_RX同上
PB6I2C1_SCLTIM4_CH1I2C用PB6时,TIM4 PWM改CH3(PB8)/CH4(PB9)
PB7I2C1_SDATIM4_CH2同上

外设配置必填项

每类外设 AI 必须确认以下参数后才能生成 .ioc:

TIM(PWM 输出)

  • channel:通道号(CH1/CH2/CH3/CH4)
  • pin:对应引脚(从下表查,唯一)
  • freq_hz:PWM 频率(默认 10000)
  • period 和 prescaler 由工具根据 sysclk=72MHz 和 freq_hz 自动计算

TIM(编码器)

  • timer:TIM2 或 TIM3(TIM1/TIM4 不支持编码器模式)
  • ch1_pin / ch2_pin:固定映射,无需问用户(见下表)

ADC

  • channels:通道号列表(IN0~IN15)
  • dma:是否启用 DMA(默认 true,超过 2 路时强制 true)
  • 采样时间默认 ADC_SAMPLETIME_71CYCLES_5,不问用户

I2C

  • bus:I2C1 或 I2C2
  • speed_hz:默认 100000,不问用户
  • 不需要填从机地址(地址是代码层的事,.ioc 不管)

UART

  • instance:USART1/2/3
  • baudrate:默认 115200,不问用户

GPIO

  • pin:必须用户指定(自由GPIO没有固定映射)
  • direction:output / input
  • pull:输入时默认 PULLUP

固定引脚映射表(AI 自动确认,不问用户)

外设信号引脚备注
TIM1_CH1PWMPA8唯一映射
TIM1_CH2PWMPA9唯一映射(注意与USART1_TX冲突)
TIM1_CH3PWMPA10
TIM1_CH4PWMPA11
TIM2_CH1编码器APA0PA0 = PA0-WKUP,ioc写法特殊
TIM2_CH2编码器BPA1
TIM3_CH1编码器APA6
TIM3_CH2编码器BPA7
TIM4_CH1PWMPB6与I2C1_SCL冲突
TIM4_CH2PWMPB7与I2C1_SDA冲突
TIM4_CH3PWMPB8
TIM4_CH4PWMPB9
I2C1_SCLI2CPB6
I2C1_SDAI2CPB7
I2C2_SCLI2CPB10与USART3_TX冲突
I2C2_SDAI2CPB11与USART3_RX冲突
USART1_TXUARTPA9与TIM1_CH2冲突
USART1_RXUARTPA10
USART2_TXUARTPA2
USART2_RXUARTPA3
USART3_TXUARTPB10
USART3_RXUARTPB11
ADC1_IN8ADCPB0
ADC1_IN9ADCPB1
ADC1_IN10ADCPC0
ADC1_IN11ADCPC1
ADC1_IN12ADCPC2
ADC1_IN13ADCPC3
ADC1_IN14ADCPC4
ADC1_IN15ADCPC5

易错点清单

  1. PA0 的 .ioc 写法:信号名必须用 S_TIM2_CH1_ETR,引脚名写 PA0-WKUP,不是 PA0
  2. TIM1 是高级定时器:需要额外写 RepetitionCounter=0;PWM 生成对应的 SH 块是 SH.S_TIM1_CH1.0=TIM1_CH1,PWM Generation1 CH1
  3. TB6612 STBY 引脚:必须初始化为高电平(GPIO_PIN_SET),否则电机不工作
  4. DMA 通道固定映射(F103):ADC1 → DMA1_Channel1,USART3_TX → DMA1_Channel2,USART3_RX → DMA1_Channel3
  5. TIM4 作调度中断:不需要任何通道,只需 TIM4 基础计时器配置 + NVIC 中断使能;VP 虚拟引脚必须写 VP_TIM4_VS_ClockSourceINT
  6. ADC 的 Rank 字段:每个通道必须有对应的 Rank-N 字段(从1开始),缺失会导致 CubeMX 打开报错
  7. SH. 共享信号块*:所有 TIM 通道和 ADC 通道都需要对应的 SH.* 块,AI 经常遗漏这部分
  8. NVIC 格式:必须用 true\:priority\:subpriority\:false\:false\:true\:... 格式,不是简单的布尔值

问答策略

何时问用户

情况处理
自由 GPIO 引脚未指定(蜂鸣器/LED/方向控制)必须问,无法推断
总线类型不确定(灰度传感器 ADC 还是 I2C)必须问
同一引脚被两个功能争用不问,报警告 + 推荐替代
外设参数有合理默认值(PWM频率/I2C速度/波特率)自动使用默认值,写入 assumptions
外设参数影响正确性且无默认值(ADC通道列表)必须问

问答格式

一次性列出所有缺失项,不要逐个问:

需要确认以下信息才能生成 .ioc:

1. 蜂鸣器接哪个引脚?(如 PB12)
2. LED 接哪个引脚?(如 PB13)
3. 电机方向控制:AIN1/AIN2/BIN1/BIN2 接哪四个引脚?
4. TB6612 STBY 接哪个引脚?

以下参数已使用默认值,如需修改请说明:
- PWM 频率:20kHz(TIM1,Period=3599)
- 编码器模式:TI12(四倍频)
- I2C 速度:100kHz
- 调试串口:115200

验证步骤

自动验证(ioc_parser.py + check_project.py)

  • 引脚无重复分配
  • 所有 TIM 通道有对应 SH.* 块
  • ADC 通道有对应 Rank 字段
  • DMA 通道映射合法

手动验证(必须用户执行)

  1. 用 STM32CubeMX 6.x 打开生成的 .ioc
  2. 确认无报错弹窗
  3. 检查引脚视图,确认引脚分配符合预期
  4. Generate Code,确认 main.c 中初始化函数齐全

CubeMX CLI 说明

CubeMX 6.x 的 -q headless 模式不可靠:

  • 在无显示器环境(CI/SSH)可能静默失败
  • 不建议在 skill 流程中依赖它做自动代码生成
  • 可以用它做 .ioc 格式验证(打开不报错即为合法)

.ioc 文件格式速查

格式为 INI key=value,大小写敏感。关键规则:

# MCU 信息
Mcu.UserName=STM32F103RCTx
Mcu.CPN=STM32F103RCT6
Mcu.Name=STM32F103R(C-D-E)Tx     # CubeMX 内部名,不同于 UserName

# 引脚信号(注意 PA0 的特殊写法)
PA0-WKUP.Signal=S_TIM2_CH1_ETR
PA0-WKUP.GPIO_Label=ENC_L_A

# 共享信号块(TIM/ADC 必须有)
SH.S_TIM1_CH1.0=TIM1_CH1,PWM Generation1 CH1
SH.S_TIM1_CH1.ConfNb=1

# NVIC 格式
NVIC.TIM4_IRQn=true\:1\:0\:false\:false\:true\:true\:true\:true

# 虚拟引脚(每个用到 ClockSource 的 TIM 都需要)
VP_TIM4_VS_ClockSourceINT.Mode=Internal
VP_TIM4_VS_ClockSourceINT.Signal=TIM4_VS_ClockSourceINT
Gespeicherte Skills