STM32从零到量产开发:四路继电器工业控制模块开发— CubeMX 配置表
芯片:STM32F103RCT6(LQFP64,256KB Flash / 48KB RAM)
工具链:STM32CubeMX 6.x | FW_F1 V1.8.x | Keil MDK-ARM V5.32
文档状态:已确认(配置与固件 v1.0.0 一致,实测 32/32 通信全 PASS) — 见 §6 配置审计结论
1. 系统总览
| 项目 |
值 |
| MCU 型号 |
STM32F103RCT6 |
| 封装 |
LQFP64 |
| Flash / RAM |
256KB / 48KB |
| 主频 |
72MHz(HSE 8MHz × PLL9) |
| 调试接口 |
Serial Wire(PA13=SWDIO, PA14=SWCLK) |
| 时钟源 |
HSE = 8MHz Crystal (PD0/PD1);LSE = 32.768kHz Crystal (PC14/PC15,已焊接但未启用 RTC) |
| 已启用外设(4 个) |
GPIO, IWDG, USART1, UART4(+ RCC 系统时钟、SYS 调试接口) |
| 未启用外设 |
ADC / DAC / CAN / TIM / RTC / DMA(P02 为纯继电器+DI 模块,无此类需求) |
2. Clock Configuration(时钟树)
┌──────────────────────────────────────────────┐
HSE(8MHz)─┬─/1──►│ PLL (×9) ──► SYSCLK = 72MHz │
│ │ ├─→ HCLK = 72MHz (AHB) │
│ │ ├─→ APB1 = 36MHz (÷2) │
│ │ │ └─→ APB1 Timer = 72MHz (×2) │
│ │ └─→ APB2 = 72MHz │
│ │ (无 ADC,无需 ADC 预分频) │
LSE(32.768kHz)─►│ ○──► (PC14/PC15 已配置,RTC 未启用) │
└───────┴──────────────────────────────────────────────┘
| 参数 |
值 |
备注 |
| HSE Source |
Crystal/Ceramic Resonator (PD0/PD1) |
8MHz 外部晶振 |
| PLL Source |
HSE |
|
| PLLMUL |
×9 (RCC_PLL_MUL9) |
8×9 = 72MHz |
| SYSCLK Source |
PLLCLK |
|
| AHB Prescaler (/1) |
72MHz |
HCLK |
| APB1 Prescaler (/2) |
36MHz |
APB1 peripheral clock |
| APB1 Timer Prescaler (×2) |
72MHz |
USART1/UART4 时钟源 |
| APB2 Prescaler (/1) |
72MHz |
APB2 peripheral clock |
| LSE Source |
Crystal/Ceramic Resonator (PC14/PC15) |
32.768kHz,引脚已配置;P02 未启用 RTC |
3. Pinout & GPIO 引脚分配(完整)
来源:.ioc + 生成的 main.h / gpio.c
3.1 通信类
| 标签 |
引脚 |
复用功能 |
方向 |
上拉/下拉 |
默认输出 |
说明 |
| USART1_TX |
PA9 |
USART1_TX |
输出 |
— |
— |
RS485 发送 |
| USART1_RX |
PA10 |
USART1_RX |
输入 |
— |
— |
RS485 接收 |
| RS485_DE |
PA8 |
GPIO_Output |
输出 |
No pull-up |
Low |
RS485 DE/RE 方向控制(高=发送) |
| UART4_TX |
PC10 |
UART4_TX |
输出 |
— |
— |
RS232 调试发送 |
| UART4_RX |
PC11 |
UART4_RX |
输入 |
— |
— |
RS232 调试接收 |
3.2 继电器输出(4 路,低电平有效)
| 标签 |
引脚 |
复用功能 |
方向 |
默认输出 |
说明 |
| RELAY1 |
PB6 |
GPIO_Output |
输出 |
High |
继电器1(低有效:RESET/低=吸合 ON,SET/高=安全断开 OFF;上电默认 High=安全态) |
| RELAY2 |
PB7 |
GPIO_Output |
输出 |
High |
继电器2 |
| RELAY3 |
PB8 |
GPIO_Output |
输出 |
High |
继电器3 |
| RELAY4 |
PB9 |
GPIO_Output |
输出 |
High |
继电器4 |
3.3 数字输入(DI / 光耦,4 路)
| 标签 |
引脚 |
复用功能 |
方向 |
上拉/下拉 |
说明 |
| DI1 |
PB0 |
GPIO_Input |
输入 |
Pull-up |
光耦输入1(有效=外部短接 GND→低电平) |
| DI2 |
PB1 |
GPIO_Input |
输入 |
Pull-up |
光耦输入2 |
| DI3 |
PB10 |
GPIO_Input |
输入 |
Pull-up |
光耦输入3 |
| DI4 |
PB11 |
GPIO_Input |
输入 |
Pull-up |
光耦输入4 |
3.4 按键(3 路用户键)
| 标签 |
引脚 |
复用功能 |
方向 |
上拉/下拉 |
说明 |
| KEY1 |
PB3 |
GPIO_Input |
输入 |
Pull-up |
用户按键1(按下=低)— Serial Wire 已释放此引脚 ✓ |
| KEY2 |
PB4 |
GPIO_Input |
输入 |
Pull-up |
用户按键2(按下=低)— Serial Wire 已释放此引脚 ✓ |
| KEY3 |
PB5 |
GPIO_Input |
输入 |
Pull-up |
用户按键3(按下=低) |
注意(与 P05 差异):P02 的 PB5 是普通用户键 KEY3,并非 P05 的硬件急停 E_STOP。P02 无独立急停功能,安全保护由「通信故障安全」承担(见 §4.3 / 硬件配置表 §4)。
3.5 状态指示灯(LED,4 路单功能,低有效)
| 标签 |
引脚 |
复用功能 |
方向 |
默认输出 |
语义(系列对齐) |
| STATUS_LED (RUN) |
PC6 |
GPIO_Output |
输出 |
High |
运行指示 RUN(1Hz 慢闪,永不改变) |
| COMM_LED |
PC7 |
GPIO_Output |
输出 |
High |
COMM(收到有效 Modbus 帧脉冲 50ms) |
| FAULT_LED |
PC8 |
GPIO_Output |
输出 |
High |
FAULT(故障安全触发时快闪 10Hz) |
| RS232_LED |
PC9 |
GPIO_Output |
输出 |
High |
RS232(收到串口字符脉冲 50ms) |
已确认:CubeMX 标签 STATUS_LED/COMM_LED/FAULT_LED/RS232_LED 映射到 PC6~PC9,固件 bsp_led.c 实现为四盏单功能 LED,低电平有效(亮=GPIO_LOW)。语义已固化,非"建议"。
⚠️ 抗重生成提醒:若用 CubeMX 重新 Generate Code,务必在 Pinout 中把 PC6/PC7/PC8/PC9 也设为 GPIO_Output,否则生成代码会覆盖 main.h 的引脚宏(代码注释已注明)。
3.6 其他系统引脚
| 引脚 |
功能 |
说明 |
| PD0/PD1 |
HSE OSC_IN/OUT |
8MHz 主晶振 |
| PC14/PC15 |
LSE OSC_IN/OUT |
32.768kHz 晶振(引脚已配置,RTC 未启用) |
| NRST |
系统复位 |
|
| PA13/PA14 |
SWDIO/SWCLK |
Serial Wire 调试(SYS=Serial Wire ✓) |
| VP_IWDG_VS_IWDG |
内部 |
IWDG 看门狗激活 |
| VP_SYS_VS_Systick |
内部 |
SysTick 时基 |
4. Peripheral Configuration(外设参数)
4.1 USART1(RS485 / Modbus RTU)
| 参数 |
值 |
| Mode |
Asynchronous |
| Baud Rate |
CubeMX .ioc 配置 9600 Bits/s;运行时由 Flash 参数 BaudIndex(默认 0→9600)经 Modbus_Init() 实际应用 |
| Word Length |
8 Bits (including Parity) |
| Parity |
None |
| Stop Bits |
1 |
| Data Direction |
Receive and Transmit |
| Over Sampling |
16 Samples |
| Hardware Flow Control |
Disable |
| NVIC |
USART1 global interrupt: Enabled, Preemption=0, SubPriority=0 |
⚠️ CubeMX 与运行时不一致的坑:.ioc 中 USART1 BaudRate=9600,但生成 usart.c 模板里 huart1.Init.BaudRate=115200。实际波特率由 Modbus_Init() 读取 Flash 参数 BaudIndex 再 HAL_UART_Init 覆盖,出厂默认 BaudIndex=0 → 9600。若将来 CubeMX 重新生成代码,模板值 115200 会被再次写入,但运行时仍由 Flash 参数决定,不影响出厂默认 9600。RS485 波特率档位:0=9600 / 1=19200 / 2=38400 / 3=57600 / 4=115200。
4.2 UART4(RS232 调试口)
| 参数 |
值 |
| Mode |
Asynchronous |
| Baud Rate |
115200 Bits/s(固定,TTL 3.3V) |
| Word Length |
8 Bits |
| Parity |
None |
| Stop Bits |
1 |
| Over Sampling |
16 Samples |
| Data Direction |
Receive and Transmit |
| Hardware Flow Control |
Disable |
| NVIC |
UART4 global interrupt: Enabled, Preemption=0, SubPriority=0 |
4.3 IWDG(独立看门狗)
| 参数 |
值 |
| Mode |
Activated |
| IWDG counter clock prescaler |
64 |
| IWDG down-counter reload value |
3999 |
| 计算超时 |
≈ 6.4 秒(LSI≈40kHz: 3999×64/40000≈6.4s) |
与 P05 差异:P05 的 IWDG 超时≈2s(Prescaler=64, Reload=1250);P02 为 ≈6.4s(Reload=3999)。主循环每轮 HAL_IWDG_Refresh() 喂狗,死机约 6.4s 后自动复位。
4.4 NVIC 中断优先级分组
| 参数 |
值 |
| Priority Group |
4 bits for pre-emption(全抢占式) |
| Force DMA channels interrupts |
☑ |
已启用中断汇总
| 中断名称 |
使能 |
抢占优先级 |
子优先级 |
| SysTick |
☑ |
15 |
0 |
| HardFault / MemManage / BusFault / UsageFault / NMI |
☑ 全部 |
0 |
0 |
| USART1 global interrupt (RS485) |
☑ |
0 |
0 |
| UART4 global interrupt (RS232) |
☑ |
0 |
0 |
中断优先级设计要点:最高优先级(0):SysTick(15)、HardFault 等系统异常、USART1/UART4;未使用的中断保持禁用。
4.5 Project Manager 设置
| 参数 |
值 |
| Project Name |
P02_Relay_Controller_4Channels Relay Industrial Control Module |
| Target Toolchain |
MDK-ARM V5.32 |
| Firmware Package |
STM32Cube FW_F1 V1.8.x |
| Keep User Code when regenerating |
☑ Enabled ✅(必须!) |
| Heap Size |
0x200 (512 bytes) |
| Stack Size |
0x400 (1024 bytes) |
| Main Location |
Core/Src |
| Optimize Level |
-O2 (Optimize For speed) |
5. 未使用的引脚(Unused GPIOs)
P02 使用 PB0PB11(DI/KEY/继电器)、PC6PC11(LED/RS232)、PA8~PA10(RS485)、PA13/14(SWD)、PD0/1(HSE)。其余引脚(如 PA07、PA11/12、PA15、PC05、PC12~15 中除 LED/LSE 外、PB12~15 等)在 .ioc 中多保留为默认(Analog/未配置)。这属于引脚富余,非配置错误。
6. 配置审计结论(是否符合要求)
✅ 符合要求的配置项(对标系列规范)
| 序号 |
检查项 |
结论 |
说明 |
| C01 |
MCU 型号 STM32F103RCT6 LQFP64 |
✅ |
256KB/48KB |
| C02 |
SYS = Serial Wire(释放 JTAG) |
✅ |
PB3/PB4/PB5 可作 GPIO(KEY1/2/3) |
| C03 |
HSE 8MHz Crystal |
✅ |
PD0/PD1 |
| C04 |
PLL ×9 = 72MHz |
✅ |
主频正确 |
| C05 |
USART1(RS485) PA9/TX PA10/RX |
✅ |
引脚正确 |
| C06 |
RS485_DE = PA8 GPIO_Output |
✅ |
方向控制引脚正确,默认 Low(接收态) |
| C07 |
UART4(RS232) PC10/TX PC11/RX |
✅ |
引脚正确 |
| C08 |
UART4 波特率 115200 |
✅ |
调试口固定波特率 |
| C09 |
4 路继电器 PB6~PB9 |
✅ |
低电平有效,上电默认全断开 |
| C10 |
4 路 DI (PB0/1/10/11) |
✅ |
统一 Pull-up,光耦隔离 5~24V |
| C11 |
4 路 LED (PC6~PC9) |
✅ |
单功能、低有效 |
| C12 |
IWDG 已启用 |
✅ |
硬看门狗保护,≈6.4s |
| C13 |
KeepUserCode=true |
✅ |
重生成不覆盖用户代码 |
| C14 |
NVIC 优先级分组 4-bit preemption |
✅ |
全抢占式 |
| C15 |
故障安全默认开启 |
✅ |
FailSafeEn=1, FailSafeSec=10 |
✅ 设计决策确认结论(已落地到固件)
| 编号 |
决策点 |
落地结果 |
固件位置 |
| q-1 |
RS485 默认波特率 |
9600(索引 0),可配 19200/38400/57600/115200 |
flash_param DEFAULT_BAUD_INDEX=0 |
| q-2 |
继电器路数 |
4 路(PB6~PB9) |
bsp_relay.c RELAY_CH_NUM=4 |
| q-3 |
继电器电平逻辑 |
低电平有效(RESET/低=吸合 ON,SET/高=安全断开 OFF) |
bsp_relay.c BSP_Relay_Set |
| q-4 |
DI 上下拉 |
统一 Pull-up |
gpio.c DI1~4 全 Pull-up |
| q-5 |
IWDG 超时 |
≈6.4s(Prescaler=64, Reload=3999) |
iwdg.c MX_IWDG_Init |
| q-6 |
LED 语义 |
RUN/COMM/FAULT/RS232(四盏单功能,低有效) |
bsp_led.c / main.h |
| q-7 |
故障安全 |
默认开启(FailSafeEn=1, FailSafeSec=10) |
system_app.c Modbus_CheckFailSafe |
| q-8 |
本地可覆盖远程安全态 |
允许(RS232 调试口可在故障安全态下手动操作继电器) |
rs232_shell.c Cmd_Relay(设计权衡,见调试文档 F4) |
上表设计决策由固件/代码库已落地确认,与产品说明书、通讯协议文档一致。
所有评论(0)