光
最近有个项目因为供货周期把 STM32F103 换成了引脚兼容的 GD32F103,板子不用改,代码几乎不用改——但上电后串口偶尔丢字节、ADC 读数漂移,折腾了两天才定位。把实测差异记下来,供参考。
一、时钟树是第一道坎
GD32F103 主频可以跑到 108MHz,而 STM32F103 是 72MHz。直接沿用原来的 PLL 配置,时钟翻倍后 Flash 等待周期、总线分频全乱了。做法:先把时钟树按原设计降到 72MHz 跑通,再逐步上调主频,每档测一次串口波特率误差和定时器精度。
二、ADC 精度别只看位数
同样 12 位 ADC,GD32 的采样保持时间、输入阻抗特性与 STM32 有细微差别。实测同一路分压信号,GD32 的读数噪声比原来大 2~3 个 LSB。处理办法:延长采样时间一个档位,采样点做滑动平均,关键通道单独校准零点和满度。
三、外设细节差异清单
- USART:同样波特率设置下,实测波特率误差方向相反,高速率(115200 以上)建议实测校验;
- Flash:GD32 的 Flash 等待周期配置与主频绑定,升主频前先改等待周期,否则随机 HardFault;
- 上电时序:GD32 上电复位释放更快,外设初始化前加 10ms 延时更稳。
四、替换验证流程
我现在的做法是:先跑时钟+串口+定时器三件套冒烟测试,再跑 ADC/DAC 精度比对,最后做 72 小时老化跑数。全部通过才算替换完成。
大家做过类似的国产替代吗?引脚兼容的芯片,你们还踩过哪些“看起来一样、用起来不一样”的坑?
一、时钟树是第一道坎
GD32F103 主频可以跑到 108MHz,而 STM32F103 是 72MHz。直接沿用原来的 PLL 配置,时钟翻倍后 Flash 等待周期、总线分频全乱了。做法:先把时钟树按原设计降到 72MHz 跑通,再逐步上调主频,每档测一次串口波特率误差和定时器精度。
二、ADC 精度别只看位数
同样 12 位 ADC,GD32 的采样保持时间、输入阻抗特性与 STM32 有细微差别。实测同一路分压信号,GD32 的读数噪声比原来大 2~3 个 LSB。处理办法:延长采样时间一个档位,采样点做滑动平均,关键通道单独校准零点和满度。
三、外设细节差异清单
- USART:同样波特率设置下,实测波特率误差方向相反,高速率(115200 以上)建议实测校验;
- Flash:GD32 的 Flash 等待周期配置与主频绑定,升主频前先改等待周期,否则随机 HardFault;
- 上电时序:GD32 上电复位释放更快,外设初始化前加 10ms 延时更稳。
四、替换验证流程
我现在的做法是:先跑时钟+串口+定时器三件套冒烟测试,再跑 ADC/DAC 精度比对,最后做 72 小时老化跑数。全部通过才算替换完成。
大家做过类似的国产替代吗?引脚兼容的芯片,你们还踩过哪些“看起来一样、用起来不一样”的坑?

