STM32CubeMX生成工程不运行 卡在HAL_SYSTICK_Config

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 配置的内存布局,导致:

  1. SysTick_Config() 函数内部尝试配置中断向量表时,地址计算错误
  2. Keil 的 Linker 未使用 CubeMX 设置的内存地址(如 RAM: 0x20000000FLASH: 0x08000000)。
  3. 程序卡在 HAL_SYSTICK_Config(实际是中断向量表地址错误导致无法进入中断)。

关键点 :STM32F3 系列的中断向量表起始地址为 0x08000000 + 0x2000(与 F4/F7 不同),Keil 需要明确知道这个地址。


✅ 解决步骤(亲测有效)

第一步:打开 Keil 工程的 Target 设置
  1. 在 Keil 5 中,右键点击工程名 → Options for Target 'Target 1'

    → 切换到 Target 选项卡。

  2. 确认内存布局(必须与 CubeMX 一致):

    • RAM0x20000000(大小 6KB,STM32F334 的 SRAM 起始地址)
    • FLASH0x08000000(大小 16KB,STM32F334 的 Flash 起始地址)

    💡 如果 CubeMX 生成的 stm32f3xx_it.cSystemInit() 已正确设置地址,但 Keil 未加载,就会卡死。

第二步:强制 Keil 使用 CubeMX 的内存布局
  1. 切换到 Linker 选项卡 → Misc Controls(其他控制)。

  2. 勾选Use Memory Layout from Target Dialog

    (✅ 这是核心操作!)

  3. 点击 OK 保存设置。

第三步:重新编译并下载
  1. 重新编译工程(Rebuild all target files)。
  2. 下载到芯片(Download),进入调试模式后 不再卡在 HAL_SYSTICK_Config

📌 为什么这个操作有效?

Keil 默认行为 问题 修复后行为
使用 Keil 自带的默认内存布局 地址错误(如 RAM: 0x00000000 读取 CubeMX 在 Target 选项卡 中设置的内存布局
SysTick_Config() 无法正确设置中断向量表 程序卡死 中断向量表地址正确(0x08000000 + 0x2000

💡 原理
HAL_SYSTICK_Config() 内部调用 SysTick_Config(),后者会配置中断向量表地址。

Keil 未加载 CubeMX 的内存布局 → 地址计算错误 → 中断无法触发 → 程序卡死。


⚠️ 其他常见陷阱

  1. 未在 CubeMX 中配置时钟

    → 在 Clock Configuration 中检查 HSE/HSI 是否启用,确保 System Clock 为 72MHz(STM32F334 默认)。

  2. 未正确设置中断优先级

    → 在 NVIC 设置中,确保 SysTick 优先级 > 0(例如 0x00)。

  3. 工程未包含 system_stm32f3xx.c

    → 检查 Core/Src 文件夹是否包含该文件(CubeMX 会自动生成)。


💡 操作验证(关键步骤)

  1. main.c 中添加简单测试:

    c 复制代码
    int main(void) {
      HAL_Init();
      SystemClock_Config(); // CubeMX 生成的时钟配置
      HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_PIN); // 闪烁 LED
      while (1);
    }
  2. 下载后观察 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 有效! 😄


相关推荐
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
Lester_11015 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
LCG元5 天前
低功耗显示方案:STM32L0驱动OLED,动态波形绘制与优化
stm32·嵌入式硬件·信息可视化
三佛科技-187366133975 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315205 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
古译汉书5 天前
【IoT死磕系列】Day 7:只传8字节怎么控机械臂?学习工业控制 CANopen 的“对象字典”(附企业级源码)
数据结构·stm32·物联网·http
Alaso_shuang5 天前
STM32 核心输入、输出模式
stm32·单片机·嵌入式硬件
2501_918126915 天前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
z20348315205 天前
STM32F103系列单片机定时器介绍(一)
stm32·单片机
星马梦缘5 天前
驱动层开发——蜂鸣器驱动
stm32·单片机·嵌入式硬件·hal·驱动