【第二部分】STM32CubeMX 创建 STM32F103CBT6 完整标准流程
覆盖从新建工程→配置外设→时钟→中断→代码生成→MDK 编译下载全流程。
一、新建工程:选择 MCU
- 等待页面
Rendering UI加载完成- 点击中间板块ACCESS TO MCU SELECTOR进入芯片选择界面
- 芯片筛选:
- Series:选择
STM32F1 Series- Lines:选择
STM32F103- Part Number:输入
STM32F103CBT6,双击选中芯片- 弹出芯片引脚图窗口,点击Start Project,进入主配置界面(Pinout & Configuration)
根据单片机选择芯片
二、引脚与外设功能配置
| DMA | Direct Memory Access(直接存储器访问) | 无需CPU干预,在外设与存储器间高速搬运数据,释放CPU资源,常用于ADC、串口等大批量数据传输。 |
| GPIO | General Purpose Input/Output(通用输入输出) | 可配置为输入、输出、复用功能或模拟模式的引脚,用于连接LED、按键、传感器等外部硬件。 |
| WDG | WatchDog(看门狗),通常指IWDG(独立看门狗) | 硬件定时器,需定期“喂狗”以防超时;超时则强制复位系统。IWDG使用独立时钟(LSI),可靠性高。 |
| NVIC | Nested Vectored Interrupt Controller(嵌套向量中断控制器) | Cortex-M内核的中断管理单元,负责中断使能、优先级分组和嵌套抢占,实现高优先级中断及时响应。 |
| RCC | Reset and Clock Control(复位与时钟控制) | 管理系统复位、时钟源选择(晶振、PLL倍频)及外设时钟门控,是芯片的时钟总开关。 |
| SYS | System(系统控制),对应SYSCFG配置控制器 | 负责存储器地址重映射、IO补偿、Boot模式管理及调试接口(SWD/JTAG)等芯片级配置。 |
| WWDG | Window WatchDog(窗口看门狗) | 不仅有超时限制,还要求喂狗必须在预设的“时间窗口”内(不能太早也不能太晚),用于检测程序执行时序异常。 |
(1)配置RCC
【1】进入 RCC 配置页面
- 打开 CubeMX,完成芯片选择进入
Pinout & Configuration主界面- 左侧分类栏
System Core,点击勾选RCC进入时钟外设配置面板(对应你截图左侧红框)【2】高速外部时钟 HSE 基础配置(核心第一步)
- 找到
High Speed Clock (HSE)下拉框,选择:Crystal/Ceramic Resonator(无源晶振模式,你的硬件 8MHz 晶振)
- 【若硬件是有源晶振选
Bypass clock source;无外部晶振选Disable】Low Speed Clock (LSE):本工程不用 RTC,保持Disable;需日历则改为Crystal外接 32.768K 晶振Master Clock Output:取消勾选(无需 MCO 时钟输出调试)- 下方
GPIO Settings自动锁定 PD0 (OSC_IN)、PD1 (OSC_OUT) 为晶振模拟引脚,无需手动修改 GPIO 电气参数【3】进入 Clock Configuration 时钟树页面配置 PLL 与总线分频
点击顶部导航栏切换到Clock Configuration标签页
配置 HSE 预分频:HSE 输入分频选择
/1(8MHz 直接送入 PLL)PLL 倍频配置:
PLL Source:选择
HSE(时钟源取自外部 8M 晶振)PLL Mul 倍频系数:选择
×9,计算:8MHz × 9 = 72MHz系统时钟切换:System Clock Mux 选择
PLLCLK,SYSCLK 锁定 72MHz配置各总线预分频(和你工程完全匹配)
AHB Prescaler:
/1→ HCLK=72MHz(内核、DMA、Flash 时钟)APB1 Prescaler:
/2→ PCLK1=36MHz;APB1 定时器自动倍频 ×2=72MHzAPB2 Prescaler:
/1→ PCLK2=72MHz(TIM1、CAN、GPIOA 外设时钟)ADC Prescaler:
/6→ ADC 时钟 = 12MHz(F1 最大安全 14MHz 以内)页面红色报错框消失,点击
Resolve Clock Issues自动修正冲突
(2)配置定时器
定时器 工作模式 核心用途 时钟来源 TIM1 基础定时 + 更新中断 系统 1ms 时基、周期性任务 内部 72MHz 总线时钟 TIM2 中心对齐 PWM 输出 直流 / 步进电机驱动 内部 72MHz 总线时钟 TIM3 、4 正交编码器模式 旋转位置、速度采集 外部 A/B 相脉冲
- 打开 Pinout & Configuration,左侧 Categories 展开Timers
- 选中目标 TIM 外设,自动开启对应总线时钟;TIM1 挂载 APB2 (72MHz),TIM2/TIM4 挂载 APB1(定时器时钟倍频至 72MHz)
- 时钟树提前配置完成:HSE=8M,SYSCLK=72MHz,APB1 预分频 / 2
【1】TIM1 1ms 定时中断配置流程(通用系统时基)
步骤 1:Mode 模式基础设置
选中左侧
TIM1进入配置面板
Clock Source下拉选择Internal Clock(使用内部总线 72MHz 时钟)Slave Mode / Trigger Source:保持
DisableChannel1~Channel4、Combined Channels:全部
Disable(仅做定时,不用捕获 / PWM)步骤 2:Parameter Settings 计数参数配置
切换
Parameter Settings标签,展开 Counter Settings:
Prescaler(PSC):
71Counter Mode:
Up向上计数Counter Period(ARR):
1999Internal Clock Division(CKD):
No Division定时周期验算:
步骤 3:NVIC 中断开启(定时溢出中断)
切换
NVIC Settings标签找到
TIM1 update interrupt,勾选Enabled使能中断Preemption Priority:
2,Sub Priority:0(中等优先级)步骤 4:引脚校验
TIM1 仅做内部定时,无复用引脚,右侧 Pin 视图无绿色 TIM1 引脚,无需操作 GPIO。
【2】TIM2 两路中心对齐 PWM 输出配置流程(电机驱动)
步骤 1:Mode 模式 PWM 通道配置
左侧选中
TIM2Clock Source 自动跟随 APB1 定时器时钟,无需手动选择
Channel1:
PWM Generation CH1;Channel2:PWM Generation CH2Channel3/4、Combined Channels:
DisableSlave/Trigger Source:
Disable步骤 2:Parameter Settings 计数与波形模式
Prescaler(PSC):
71Counter Mode:
Center Aligned mode1中心对齐Counter Period(ARR):
99CKD:
No Division周期计算:步骤 3:GPIO 引脚自动分配
右侧 Pin 视图自动点亮:
PA0 = TIM2_CH1
PA1 = TIM2_CH2
引脚自动配置为复用推挽输出,无需手动修改 GPIO 模式。
步骤 4:NVIC(可选,本工程未开 TIM2 中断)
无需开启 TIM2 全局中断,仅输出波形不用中断。
【3】TIM3、4 正交编码器硬件计数配置流程(旋转编码器采集)
步骤 1:Mode 编码器模式配置
左侧选中
TIM4Clock Source 不勾选 Internal Clock(编码器使用外部 A/B 相脉冲作为计数时钟)
Channel1/2/3/4:全部
DisableCombined Channels 下拉选择Encoder Mode(正交编码器硬件模式)
Slave/Trigger Source:
Disable步骤 2:Parameter Settings 计数参数
Prescaler(PSC):
0(编码器脉冲不预分频,每脉冲计数一次)Counter Mode:
UpCounter Period(ARR):
65535(16 位定时器最大计数值,防止溢出)CKD:
No Division步骤 3:GPIO 输入引脚配置
切换
GPIO Settings标签:
PB6 = TIM4_CH1、PB7 = TIM4_CH2
GPIO mode:
Input modePull-up/Pull-down:
No pull-up/pull-down(编码器自带上下拉则浮空输入)步骤 4:NVIC(可选)
本工程未开启
TIM4 global interrupt,靠主循环读取计数值;需溢出判断再勾选中断。
(3)GPIO引脚外设勾选
引脚号 引脚名称 功能分类 具体功能/复用 使用状态 电气配置 备注说明 1 VBAT 系统电源 RTC后备电池供电 系统引脚 3.3V后备电池 本工程LSE禁用,可悬空 2 PC13 GPIO GPIO输出/EXTI13/RTC闹钟 未使用 浮空输入 可用于LED指示或按键 3 PC14 GPIO GPIO输出/EXTI14/OSC32_IN 未使用 浮空输入 LSE晶振输入(未用) 4 PC15 GPIO GPIO输出/EXTI15/OSC32_OUT 未使用 浮空输入 LSE晶振输出(未用) 5 PD0 RCC时钟 RCC_OSC_IN / HSE晶振输入 已使用 模拟专用引脚 8MHz外部晶振输入 6 PD1 RCC时钟 RCC_OSC_OUT / HSE晶振输出 已使用 模拟专用引脚 8MHz外部晶振输出 7 NRST 系统复位 硬件复位引脚,低电平有效 系统引脚 外部上拉10KΩ 复位按键连接 8 VSSA 模拟电源 模拟地 系统引脚 GND ADC模拟电路地 9 VDDA 模拟电源 模拟电源3.3V 系统引脚 3.3V ADC模拟电路电源 10 PA0 定时器 TIM2_CH1 / PWM通道1输出 已使用 复用推挽输出 中心对齐PWM输出 11 PA1 定时器 TIM2_CH2 / PWM通道2输出 已使用 复用推挽输出 中心对齐PWM输出 12 PA2 GPIO GPIO输出 / USART2_TX 已使用 推挽输出 通用输出/指示灯 13 PA3 GPIO GPIO输出 / USART2_RX 已使用 推挽输出 通用输出/指示灯 14 VSS 数字电源 数字地 系统引脚 GND 数字电路地 15 VDD 数字电源 数字电源3.3V 系统引脚 3.3V 数字电路电源 16 PA4 GPIO GPIO输出 / SPI1_NSS / DAC1_OUT 已使用 推挽输出 通用输出/指示灯 17 PA5 GPIO GPIO输出 / SPI1_SCK 已使用 推挽输出 通用输出/指示灯 18 PA6 GPIO GPIO输出 / SPI1_MISO / TIM3_CH1 已使用 推挽输出 通用输出/指示灯 19 PA7 GPIO GPIO输出 / SPI1_MOSI / TIM3_CH2 已使用 推挽输出 通用输出/指示灯 20 PB0 GPIO/ADC GPIO / ADC1_IN8 / TIM3_CH3 未使用 浮空输入 预留ADC采集通道 21 PB1 GPIO/ADC GPIO / ADC2_IN9 / TIM3_CH4 未使用 浮空输入 预留ADC采集通道 22 PB2 GPIO GPIO / BOOT1 未使用 浮空输入 BOOT1启动配置引脚 23 PB3 GPIO GPIO / JTDO / SPI1_SCK 未使用 浮空输入 JTAG调试引脚 24 PB4 GPIO GPIO / JNTRST / SPI1_MISO 未使用 浮空输入 JTAG调试引脚 25 PB5 GPIO GPIO / JTDI / SPI1_MOSI / I2C1_SMBA 未使用 浮空输入 JTAG调试引脚 26 PB6 定时器 TIM4_CH1 / 编码器A相输入 已使用 浮空输入 正交编码器CH1 27 PB7 定时器 TIM4_CH2 / 编码器B相输入 已使用 浮空输入 正交编码器CH2 28 BOOT0 系统启动 启动模式配置引脚 系统引脚 硬件接地 主闪存启动模式 29 PB8 外部中断 GPIO_EXTI8 / 上升沿触发中断 已使用 内部下拉输入 外部传感器/限位开关 30 PB9 外部中断 GPIO_EXTI9 / 上升沿触发中断 已使用 内部下拉输入 外部传感器/限位开关 31 VSS 数字电源 数字地 系统引脚 GND 数字电路地 32 VDD 数字电源 数字电源3.3V 系统引脚 3.3V 数字电路电源 33 PB10 外部中断 GPIO_EXTI10 / 上升沿触发中断 已使用 内部下拉输入 按键/故障检测 34 PB11 外部中断 GPIO_EXTI11 / 上升沿触发中断 已使用 内部下拉输入 按键/故障检测 35 PB12 外部中断 GPIO_EXTI12 / 上升沿触发中断 已使用 内部下拉输入 按键/故障检测 36 PB13 外部中断 GPIO_EXTI13 / 上升沿触发中断 已使用 内部下拉输入 按键/故障检测 37 PB14 外部中断 GPIO_EXTI14 / 上升沿触发中断 已使用 内部下拉输入 按键/故障检测 38 PB15 外部中断 GPIO_EXTI15 / 上升沿触发中断 已使用 内部下拉输入 按键/故障检测 39 PA8 GPIO GPIO / MCO / TIM1_CH1 未使用 浮空输入 可用于时钟输出调试 40 PA9 GPIO GPIO / USART1_TX / TIM1_CH2 未使用 浮空输入 预留串口发送 41 PA10 GPIO GPIO / USART1_RX / TIM1_CH3 未使用 浮空输入 预留串口接收 42 PA11 CAN通信 CAN_RX / CAN总线数据接收 已使用 复用输入 CAN总线接收 43 PA12 CAN通信 CAN_TX / CAN总线数据发送 已使用 复用推挽输出 CAN总线发送 44 PA13 GPIO GPIO / JTMS / SWDIO 未使用 浮空输入 SWD调试数据引脚 45 VSS 数字电源 数字地 系统引脚 GND 数字电路地 46 VDD 数字电源 数字电源3.3V 系统引脚 3.3V 数字电路电源 47 PA14 GPIO GPIO / JTCK / SWCLK 未使用 浮空输入 SWD调试时钟引脚 48 PA15 GPIO GPIO / JTDI / SPI1_NSS / TIM2_CH1_ETR 未使用 浮空输入 JTAG调试引脚
引脚名 初始输出电平 GPIO 工作模式 上下拉配置 最大输出速度 是否手动修改 (Modified) 功能说明 PA2 Low Output Push Pull(推挽输出) No pull-up/pull-down(无上下拉) Low 未勾选 通用数字输出,上电默认低电平,用于指示灯 / 继电器 PA3 Low Output Push Pull(推挽输出) No pull-up/pull-down(无上下拉) Low 未勾选 通用数字输出,上电默认低电平,用于指示灯 / 继电器 PA4 Low Output Push Pull(推挽输出) No pull-up/pull-down(无上下拉) Low 未勾选 通用数字输出,上电默认低电平,用于指示灯 / 继电器 PA5 Low Output Push Pull(推挽输出) No pull-up/pull-down(无上下拉) Low 未勾选 通用数字输出,上电默认低电平,用于指示灯 / 继电器 PB8 n/a Input mode(普通输入) Pull-down(内部下拉) n/a ✅ 已勾选 普通电平采集输入,需 CPU 轮询读取电平 PB9 n/a Input mode(普通输入) Pull-down(内部下拉) n/a ✅ 已勾选 普通电平采集输入,需 CPU 轮询读取电平 PB10 n/a Input mode(普通输入) Pull-down(内部下拉) n/a ✅ 已勾选 普通电平采集输入,需 CPU 轮询读取电平 PB11 n/a Input mode(普通输入) Pull-down(内部下拉) n/a ✅ 已勾选 普通电平采集输入,需 CPU 轮询读取电平 PB12 n/a External Interrupt(外部中断) Pull-down(内部下拉) n/a ✅ 已勾选 上升沿触发外部中断,信号跳变自动进入中断服务函数 PB13 n/a External Interrupt(外部中断) Pull-down(内部下拉) n/a ✅ 已勾选 上升沿触发外部中断,信号跳变自动进入中断服务函数
三、NVIC 中断优先级配置(Pinout 页面 NVIC 标签)![]()
【1】进入 NVIC 配置界面
- 打开工程
Pinout & Configuration主页面- 左侧分类栏
System Core,点击NVIC,进入中断配置总表页面【2】中断使能与优先级配置(按截图红框逐条操作)
表格三列:
Enabled(使能)/Preemption Priority(抢占优先级)/Sub Priority(子优先级)1. CAN RX1 interrupt(CAN 接收中断)
- 勾选
Enabled开启中断- Preemption Priority:
0(最高抢占优先级)- Sub Priority:
1作用:CAN 总线收到报文立即触发,保证通信实时性
2. TIM1 update interrupt(TIM1 1ms 定时溢出中断)
- 勾选
Enabled开启更新中断- Preemption Priority:
2(中等优先级)- Sub Priority:
0作用:每 1ms 进入中断执行周期任务,优先级低于 CAN、外部中断
3. EXTI line [15:10] interrupts(PB10~PB15 外部中断)
- 勾选
Enabled开启中断- Preemption Priority:
1- Sub Priority:
0作用:PB10~PB15 电平上升沿触发中断,优先级高于定时、低于 CAN
4. USART1 global interrupt(串口 1 全局中断)
- 勾选
Enabled开启串口收发中断- Preemption Priority:
0(与 CAN 同级最高抢占)- Sub Priority:
05. 其余中断全部取消勾选
CAN SCE、TIM1 刹车 / 捕获比较、TIM2/3/4 全局、ADC、RCC、Flash 等中断全部不使能。
【3】中断优先级规则说明(F1 系列默认分组 2)
STM32F1 默认 NVIC 分组 2:2 位抢占优先级 + 2 位子优先级优先级数值越小,响应权限越高:
- 抢占优先级
0>1>2:高抢占可打断低抢占中断
- CAN RX、USART1:抢占 0(最高,可抢占外部中断、定时器)
- EXTI10~15:抢占 1(可抢占 TIM1 定时中断)
- TIM1 更新:抢占 2(最低,不会打断其他中断)
- 子优先级仅在同抢占优先级时生效,不支持中断嵌套:CAN RX 抢占 0、子 1;USART1 抢占 0、子 0 → 同时触发时,USART1 优先执行
四、工程管理参数配置(Project Manager 标签)
Project 工程基础设置
- Project Name:自定义工程名(如 Motor_CAN)
- Project Location:选择英文无空格路径(禁止中文文件夹)
- Toolchain/IDE:选择STM32CubelDE
