一、外部晶振与 MCU 的启动关系
-
外部晶振不会在板子上电后自动起振,需要 MCU 内部软件配置后才能起振。
-
MCU 上电后默认使用内部晶振(IRC) 运行,待 MCU 正常运行后,再通过软件配置切换到外部晶振(HXTAL)。
二、晶振由 8M 更换为 16M 后 MCU 无法运行的原因
-
当前使用的 Bootloader 程序是基于外部 8M 晶振配置 的,无法适配 16M 晶振。
-
解决方法:
-
修改 Bootloader 程序,使其支持 16M 晶振;
-
取消 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 晶振。