GD32L235 更换外部晶振(8M → 16M)导致 MCU 无法启动的原因分析与解决方法

一、外部晶振与 MCU 的启动关系

  • 外部晶振不会在板子上电后自动起振,需要 MCU 内部软件配置后才能起振。

  • MCU 上电后默认使用内部晶振(IRC) 运行,待 MCU 正常运行后,再通过软件配置切换到外部晶振(HXTAL)。


二、晶振由 8M 更换为 16M 后 MCU 无法运行的原因

  • 当前使用的 Bootloader 程序是基于外部 8M 晶振配置 的,无法适配 16M 晶振。

  • 解决方法:

    1. 修改 Bootloader 程序,使其支持 16M 晶振;

    2. 取消 Bootloader,直接运行应用程序。

以下重点说明 取消 Bootloader 后,使能 16M 晶振配置的方法。


三、取消 Bootloader,使 16M 外部晶振配置生效的步骤

✅(1)修改 HXTAL 频率值
  • 文件:gd32l23x.h

  • 将高速晶体振荡器(HXTAL)的值修改为与外部晶振一致:

c

复制代码
#define HXTAL_VALUE  (16000000UL)   /* 16 MHz */

✅(2)取消 Bootloader 地址偏移
  • 文件:system_gd32l23x.c

  • 将向量表偏移地址从 Bootloader 的 0x00003000U 改为 0x00000000U

c

复制代码
#define VECT_TAB_OFFSET  (uint32_t)0x00000000U

✅(3)选择时钟源为外部高速晶振(HXTAL)
  • 文件:system_gd32l23x.c

  • 使用 HXTAL + PLL 获得 64MHz 系统时钟:

c

复制代码
//表示使用高速外部晶振(HXTAL)+ PLL 得到 64 MHz 系统时钟
#define __SYSTEM_CLOCK_64M_PLL_HXTAL         (uint32_t)(64000000) 

// // 表示使用内部16MHz RC振荡器(IRC16M)+ PLL 得到 64 MHz 系统时钟  
// #define __SYSTEM_CLOCK_64M_PLL_IRC16M      (uint32_t)(64000000)  

✅(4)配置 PLL 倍频系数
  • 文件:system_gd32l23x.c

  • PLL 输出频率 = PLL 输入频率 × 倍频系数

  • 16M 外部晶振,目标主频 64MHz → 倍频系数为 4:

c

复制代码
RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL4);   // 16MHz × 4 = 64MHz

✅(5)修改链接脚本(Linker Script)中的 Flash 配置
  • 文件:gd32l235x_flash.ld

  • 取消 Bootloader 后,应用程序直接从 Flash 起始地址开始,Flash 全部可用:

项目 有 Bootloader 无 Bootloader
起始地址(ORIGIN) 0x08003000 0x08000000
大小(LENGTH) 116K 128K
说明 Bootloader 占用 12K(0x3000) 全部 128K 可用

c

复制代码
/* 修改后示例 */
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K

四、总结

更换外部晶振后,必须确保 HXTAL 频率值、PLL 倍频系数、系统时钟宏定义、向量表偏移地址、Flash 起始地址 等配置与硬件一致。取消 Bootloader 后,MCU 可完全从 0x08000000 开始运行,使用全部 128K Flash,并正常起振 16M 外部晶振。

如果需要保留 Bootloader,则需同步修改 Bootloader 中的晶振与 PLL 配置,使其支持 16M 晶振。

相关推荐
振浩微433射频芯片1 小时前
从门锁到考勤,VRC522B如何在近场读卡场景中“稳坐C位”?
网络·人工智能·单片机·物联网
Groundwork Explorer13 小时前
W5500 网卡编程初始化与使用指南
python·单片机
智闲电子设计15 小时前
STM32 SD 卡 + FatFS 实战:掉电丢数据?f_sync 和簇对齐写救你
stm32·单片机·嵌入式硬件
ヾChen17 小时前
ESP32 OTA 踩坑实录
stm32·单片机·嵌入式硬件·物联网·学习
DevHub17 小时前
probe-rs 教程:一行命令替代 OpenOCD 烧写调试 Cortex-M
arm开发·嵌入式硬件·mcu·rust
小僧景贤17 小时前
嵌入式ADC高阶深度解析:基于STM32底层原理、误差溯源、硬件调校与工业级落地
单片机·嵌入式硬件·stm32 adc·工业级高精度采集·adc 误差校准·量产固件开发
黑猫学长呀18 小时前
【驱动开发常见问题】编译出现rm: cannot remove `asm/arch‘: Is a directory
驱动开发·单片机·嵌入式硬件·bug·编译报错·kernrl
雨田言炎18 小时前
STM32专题之内部FLASH详解
笔记·stm32·单片机
Be for thing20 小时前
【嵌入式成长10】STC89C51蜂鸣器|有源/无源蜂鸣器区分、三极管驱动、定时器播放音乐实战
单片机·嵌入式硬件·学习
郎哥编程课堂21 小时前
单片机零基础训练营第2天:嵌入式开发常用的三种进制
单片机·嵌入式硬件