GD32F103与STM32F103时钟配置差异详解:移植代码时如何避免‘掉坑’

GD32F103与STM32F103的区别 2021.6.2 GD32F103和STM32F103区别介绍 关键词Key words: GD32F103、STM32F103 摘要Abstract: 本文主要是GD32F103和STM32F103区别进行介绍。 目录 简介 GD32和STM32的区别 2.1. 内核 2.2. 主频 2.3. 供电 2.4. FLASH差异 2.5. 功耗 2.6. 串口 2.7. ADC差异 2.8. FSMC 2.9. 103系列RAM&FLASH大小差别 2.10. 抗干扰能力 GD32替换STM32注 阅读详情

GD32F103与STM32F103时钟系统深度对比与移植实战

从STM32F103转向GD32F103开发时,时钟系统的差异往往是第一个需要攻克的"隐形陷阱"。这两款基于Cortex-M3内核的MCU虽然引脚兼容且外设相似,但在时钟架构、配置细节和性能边界上存在关键差异,直接影响到代码移植的成败。

1. 时钟架构差异全景分析

GD32F103和STM32F103的时钟树在整体结构上相似,都包含HSE(高速外部时钟)、HSI(高速内部时钟)、PLL(锁相环)等基本组件,但魔鬼藏在细节中:

核心频率差异对比表

参数 STM32F103 GD32F103
标称最大主频 72MHz 108MHz
实际稳定运行上限 72MHz 96MHz(长期验证)
HSE输入范围 4-16MHz 4-32MHz
PLL倍频系数范围 2-16倍 2-32倍
USB时钟精度要求 ±0.25% ±0.25%

在GD32上,PLL配置的灵活性更高,这既是优势也是隐患。例如,当使用8MHz外部晶振时:

// STM32F103典型PLL配置(72MHz)
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

// GD32F103等效配置(
国产单片机GD32系列开坑,带你零死角玩转GD32 第一章 【开坑国产单片机GD32系列,带你零死角玩转GD32】 第一章 资料下载,GD32对应的KEIL4&&5芯片包下载安装 目录【开坑国产单片机GD32系列,带你零死角玩转GD32】第一章 资料下载,GD32对应的KEIL4&&5芯片包下载安装前言一、STM32 VS 国产MCU二、GD32与STM32的对比1.STM32F103xxxx与GD32F103xxxx的对比2.读入数据总结 前言 这两年因为疫情的原因,ST,NXP等国外半导体公司产能紧张,用以供应国内的STM32系 阅读详情

相关推荐

【实战解析】GD32替换STM32的移植要点与避坑指南

本文详细解析了从STM32迁移至GD32的硬件兼容性调整、时钟配置优化、外设驱动适配等关键要点。针对电源设计、复位电路、Flash编程等差异提供了实战避坑指南,帮助开发者顺利完成MCU替换并提升系统性能。

d6e7f8g9h的博客 760

GD32F103时钟配置避坑指南:如何避免12MHz晶振下的108MHz主频翻车

本文针对GD32F103微控制器在12MHz外部晶振下配置108MHz系统时钟的常见问题,提供了详细的避坑指南和实战解决方案。文章深入分析了GD32与STM32在时钟配置上的关键差异,特别是PLL倍频参数计算和USB时钟要求,并给出了两种可靠的配置方法,帮助开发者避免系统不稳定、USB无法识别等典型问题。

lg888的博客 1114

GD32F103与STM32F103移植避坑指南:时钟树、寄存器、外设差异全解析

MCU移植并非简单替换芯片,而是深入理解底层硬件架构的系统工程。以Cortex-M3内核为代表的通用架构下,GD32F103与STM32F103虽标称兼容,实则在时钟树配置、寄存器位定义、DMA映射、中断优先级分组等关键维度存在十余处隐蔽差异。这些差异直接影响UART丢包、SPI卡死、PWM相位偏移、调试接口锁死等典型故障。掌握时钟源切换轮询、GPIO复用位移、向量表256字节对齐、GD32专属STAT寄存器轮询等技术要点,是保障嵌入式系统稳定迁移的核心能力。本文聚焦国产MCU替代实践,覆盖硬件设计协同、I

weixin_30843605的博客 304

GD32模拟I2C从机实战:STM32代码移植与优化指南

本文详细介绍了将STM32的I2C从机代码移植到GD32单片机的实战经验,重点分析了GD32与STM32在GPIO响应速度、时钟树结构等硬件差异,并提供了代码优化方案和稳定性提升技巧。通过时序优化、信号滤波和时钟校准等方法,成功实现了在GD32上稳定运行的模拟I2C从机功能,适用于智能家居等嵌入式应用场景。

weixin_29181861的博客 430

GD32F103与STM32对比实战:手把手移植原有工程(时钟配置避坑指南)

本文详细对比了GD32F103与STM32在硬件架构和时钟配置上的关键差异,提供了工程移植的实战指南。重点解析了PLL配置、APB预分频器等易错点,帮助开发者避开移植过程中的常见陷阱,实现从STM32到GD32F103的平滑过渡。

weixin_29185167的博客 148

GD32 vs STM32串口差异详解:从硬件设计到避坑指南

本文深度解析GD32与STM32在USART串口通信上的关键差异,涵盖硬件设计、时钟架构、发送逻辑BUG(如TC标志位问题)、停止位与字节间空闲位行为等核心区别。提供从硬件避坑到软件调优的实战指南,包括带超时保护的增强型发送函数、DMA+空闲中断配置要点及PCB设计考量,助力开发者实现稳定可靠的串口通信移植与开发。

weixin_28285943的博客 575

STM32F103缺货替代方案与国产MCU选型指南

在嵌入式系统开发中,MCU芯片选型直接影响项目成本和开发效率。Cortex-M系列微控制器凭借其性能与功耗的平衡,成为工业控制和消费电子的主流选择。当STM32F103等热门型号面临缺货时,开发者需要掌握硬件兼容替换和软件移植的核心技术。通过分析时钟树配置、外设差异等关键因素,可以实现在GD32、APM32等国产MCU平台的无缝迁移。本文基于实际工程经验,对比不同替代方案在电机控制、物联网等场景的应用效果,特别针对ADC精度、GPIO速度等硬件差异提供实测解决方案。

weixin_29166013的博客 543

GD32与STM32 PWM死区时间计算对比:GD32F103 TIMER0的特殊之处

本文深入对比了GD32F103与STM32在PWM死区时间计算上的关键差异,重点解析了GD32F103 TIMER0直接绑定系统时钟的特殊机制。通过详细的寄存器配置示例和分段计算公式,帮助开发者准确设置死区时间,避免电机控制和电源转换应用中的常见设计误区。

weixin_29194817的博客 208

从STM32F103换到GD32F103,我踩过的那些硬件坑(附完整电路修改清单)

本文详细介绍了从STM32F103迁移到GD32F103的硬件设计避坑指南,包括电源与复位电路设计、时钟与调试接口优化、外设接口关键差异以及PCB设计注意事项。通过实际项目经验,提供完整的电路修改清单和解决方案,帮助开发者顺利实现芯片移植并提升系统稳定性。

weixin_33728268的博客 329

GD32F103移植UCOSIII实战:时钟、中断与堆栈三大关键适配

实时操作系统(RTOS)是嵌入式系统实现确定性调度与多任务协同的核心技术,其稳定运行依赖于精确的系统节拍、可控的中断嵌套机制和严格的堆栈隔离管理。GD32F103作为主流国产Cortex-M3 MCU,虽引脚兼容STM32F103,但在UCOSIII移植中暴露出时钟源配置偏差、NVIC优先级分组差异及任务/中断/内核栈三重冲突等典型问题。这些底层差异直接影响节拍精度、中断响应延迟与系统鲁棒性,尤其在工业控制、智能传感等对实时性敏感的场景中尤为关键。本文聚焦GD32F103与UCOSIII深度适配,详解Sys

weixin_35797963的博客 274

[AHK] 自动化获取通达信股票代码:从消息钩子到数据提取

本文详细介绍了如何使用AHK(AutoHotkey)通过Windows消息钩子技术自动化获取通达信股票代码,实现高效数据提取和交易自动化。文章涵盖消息机制原理、AHK脚本开发、性能优化及安全注意事项,为股票交易者提供了一套完整的解决方案。

weixin_42614269的博客 618

Verilator+VSCode实战:5分钟搞定Verilog语法检查与波形调试

本文详细介绍了如何将Verilator仿真器与VSCode编辑器高效集成,打造极速的Verilog开发工作流。通过环境配置、实时语法检查、一键仿真与波形生成等实战技巧,帮助IC设计工程师在几分钟内完成从代码编写到波形调试的全过程,大幅提升中小规模模块的验证效率。

weixin_28454475的博客 470

Xilinx FPGA中利用JTAG实现MicroBlaze调试信息输出

本文详细介绍了在Xilinx FPGA开发中,如何利用JTAG接口为MicroBlaze软核处理器实现调试信息输出的完整方案。通过配置调试模块、设置Vitis软件工程以及使用XSCT工具,开发者可以建立一条不依赖外部硬件的可靠调试通道,有效解决早期硬件验证阶段串口不可用的问题,大幅提升调试效率。

weixin_29201859的博客 292

移动端UI自动化测试新框架Maestro:声明式语法与实战指南

UI自动化测试是保障移动应用质量的关键环节,其核心原理是通过脚本模拟用户操作,对应用界面进行自动验证。传统命令式框架(如基于Selenium WebDriver的Appium)虽然控制粒度细,但脚本编写和维护成本较高。声明式测试框架则通过描述“做什么”而非“怎么做”,显著降低了技术门槛和维护复杂度,其技术价值在于提升测试脚本的可读性、编写效率与跨团队协作能力。在移动端测试领域,这尤其适用于需要快速验证核心业务流程、进行冒烟测试和回归测试的场景。本文聚焦的**Maestro框架**,正是这一理念的杰出实践。它

weixin_32921023的博客 713

灵境视界:基于云计算与深度学习的智能手语识别AR眼镜

灵境视界”不仅仅是一款AR眼镜,它代表了未来无障碍沟通设备的发展方向。随着云计算与深度学习技术的不断进步,未来我们将进一步优化识别算法,提升翻译精度,并扩展更多语言和手语类型,为全球听障人士提供更加全面的沟通解决方案。是一款融合了云计算与深度学习技术的增强现实(AR)眼镜,专为听障人士和手语使用者设计。这款眼镜不仅具备先进的AR显示功能,还能实时识别并翻译手语,打破听障人士与健听人士之间的沟通障碍,推动无障碍社会的建设。,让沟通无界,视界无限。

qq_62634009的博客 727

SAP S4 HANA:按单生产(MTO)场景中的COGS分割

本文介绍了SAP S/4HANA中提供的各种选项,以在销售订单/商品是按订单生产(以下称为MTO)生产流程中的成本对象时,在基于帐户的COPA环境中报告COGS分割信息。

adam915的博客 1192

【Altium Designer】Off grid pin解决方法

​今天我画完原理图编译时,出现了太多的黄色(出现warning警告提示)Off grid pin警告,这个警告并不是原理图电气连接出问题了,而是元器件或器件PIN脚没有和栅格对齐造成的原因。再编译还是出现这个警告。 最后经过不断翻阅网上经验和实践,才最终解决,本经验详细记录了解决该警告的有效方法。 解决方案:以下是问题解决步骤... ​

夜半少年的博客 7551

使用AutoDL云服务器训练YOLO计算机视觉网络模型(AutoDL+Xftp+VS Code),附详细操作步骤

AutoDL AI算力云是一个提供人工智能算力服务的云平台。丰富的GPU资源:提供多种GPU型号,包括NVIDIA的A100A800L40V100RTX 4090RTX 3090等,能满足我们在不同场景下的需求,无论是进行大规模的AI训练还是复杂的科学计算等任务,都可以找到合适的GPU资源。灵活的付费方式:支持按量付费包日包周包月等多种付费模式。对于短期的实验或不确定时长的项目,可以选择按量付费;如果有长期稳定的算力需求,预付费或包周包月则可能更划算,可以根据自己的需求和预算进行选择。集成主流框架:集成了。

Limiiiing的博客 960

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上一篇: CTF实战:用Wireshark+WinHex从流量中提取隐藏图片(附完整操作截图)
下一篇: 四层板BGA扇出避坑指南:从过孔选择到布线优化的实战技巧
gitlab7runner
博客等级 码龄4年 78粉丝 1747原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值