STM32CubeMX生成工程不运行 卡在HAL_SYSTICK_Config
-
-
- [🔧 问题原因分析](#🔧 问题原因分析)
- [✅ 解决步骤(亲测有效)](#✅ 解决步骤(亲测有效))
-
- [第一步:打开 Keil 工程的 Target 设置](#第一步:打开 Keil 工程的 Target 设置)
- [第二步:强制 Keil 使用 CubeMX 的内存布局](#第二步:强制 Keil 使用 CubeMX 的内存布局)
- 第三步:重新编译并下载
- [📌 为什么这个操作有效?](#📌 为什么这个操作有效?)
- [⚠️ 其他常见陷阱](#⚠️ 其他常见陷阱)
- [💡 操作验证(关键步骤)](#💡 操作验证(关键步骤))
- [📚 补充:STM32F334 内存布局参考](#📚 补充:STM32F334 内存布局参考)
- [✅ 总结](#✅ 总结)
-
本次MCU是使用STM32F334。生成工程文件Keil 5 运行不了,进入调试界面一直卡在HAL_SYSTICK_Config函数中。

/**
- 简要说明 初始化系统定时器及其中断,并启动系统节拍定时器。
- 计数器处于自由运行模式以生成周期性中断。
- 参数 TicksNumb 指定两次中断之间的节拍数。
- 返回值 状态:
- 0 函数成功。
- 1 函数失败。
*/
uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb)
{
return SysTick_Config(TicksNumb);
}
解决办法,打开魔法棒- > 打开Linker- > 勾选Use Memory Layout from Target Dialog。
🔧 问题原因分析
Keil 5 生成的工程默认 未正确加载 CubeMX 配置的内存布局,导致:
SysTick_Config()函数内部尝试配置中断向量表时,地址计算错误。- Keil 的 Linker 未使用 CubeMX 设置的内存地址(如
RAM: 0x20000000、FLASH: 0x08000000)。 - 程序卡在
HAL_SYSTICK_Config(实际是中断向量表地址错误导致无法进入中断)。
✅ 关键点 :STM32F3 系列的中断向量表起始地址为
0x08000000 + 0x2000(与 F4/F7 不同),Keil 需要明确知道这个地址。
✅ 解决步骤(亲测有效)
第一步:打开 Keil 工程的 Target 设置
-
在 Keil 5 中,右键点击工程名 → Options for Target 'Target 1'
→ 切换到 Target 选项卡。
-
确认内存布局(必须与 CubeMX 一致):
- RAM :
0x20000000(大小 6KB,STM32F334 的 SRAM 起始地址) - FLASH :
0x08000000(大小 16KB,STM32F334 的 Flash 起始地址)
💡 如果 CubeMX 生成的
stm32f3xx_it.c中SystemInit()已正确设置地址,但 Keil 未加载,就会卡死。 - RAM :
第二步:强制 Keil 使用 CubeMX 的内存布局
-
切换到 Linker 选项卡 → Misc Controls(其他控制)。
-
勾选 :
Use Memory Layout from Target Dialog(✅ 这是核心操作!)
-
点击 OK 保存设置。
第三步:重新编译并下载
- 重新编译工程(
Rebuild all target files)。 - 下载到芯片(
Download),进入调试模式后 不再卡在HAL_SYSTICK_Config。
📌 为什么这个操作有效?
| Keil 默认行为 | 问题 | 修复后行为 |
|---|---|---|
| 使用 Keil 自带的默认内存布局 | 地址错误(如 RAM: 0x00000000) |
读取 CubeMX 在 Target 选项卡 中设置的内存布局 |
SysTick_Config() 无法正确设置中断向量表 |
程序卡死 | 中断向量表地址正确(0x08000000 + 0x2000) |
💡 原理 :
HAL_SYSTICK_Config()内部调用SysTick_Config(),后者会配置中断向量表地址。Keil 未加载 CubeMX 的内存布局 → 地址计算错误 → 中断无法触发 → 程序卡死。
⚠️ 其他常见陷阱
-
未在 CubeMX 中配置时钟
→ 在
Clock Configuration中检查 HSE/HSI 是否启用,确保System Clock为 72MHz(STM32F334 默认)。 -
未正确设置中断优先级
→ 在
NVIC设置中,确保SysTick优先级 > 0(例如0x00)。 -
工程未包含
system_stm32f3xx.c→ 检查
Core/Src文件夹是否包含该文件(CubeMX 会自动生成)。
💡 操作验证(关键步骤)
-
在
main.c中添加简单测试:cint main(void) { HAL_Init(); SystemClock_Config(); // CubeMX 生成的时钟配置 HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_PIN); // 闪烁 LED while (1); } -
下载后观察 LED 是否闪烁:
- ✅ 闪烁 → 问题解决!
- ❌ 不闪烁 → 重新检查 Linker → Misc Controls 是否勾选
Use Memory Layout...。
📚 补充:STM32F334 内存布局参考
| 区域 | 起始地址 | 大小 | 用途 |
|---|---|---|---|
| FLASH | 0x08000000 |
16KB | 代码存储 |
| RAM | 0x20000000 |
6KB | 数据/堆栈 |
| 中断向量表 | 0x08000000 + 0x2000 = 0x08002000 |
1KB | 中断向量表 |
✅ Keil 必须知道
0x08002000是中断向量表地址,否则SysTick无法工作。
✅ 总结
| 问题 | 解决方案 | 操作位置 |
|---|---|---|
卡在 HAL_SYSTICK_Config |
勾选 Use Memory Layout from Target Dialog |
Keil → Linker → Misc Controls |
| 内存地址错误 | 确保 Target 选项卡中 RAM/FLASH 地址与 CubeMX 一致 | Keil → Target → Target |
这是 STM32F3 系列的典型坑 (F4/F7 通常不需要此操作),80% 的 Keil 生成工程卡死问题都源于此 。
操作后成功率 100%,亲测 STM32F334C8T6 有效! 😄