历史上的今天
返回首页

历史上的今天

今天是:2025年08月21日(星期四)

正在发生

2018年08月21日 | STM32不同外部晶振时工程的配置问题

2018-08-21 来源:eefocus

遇到的问题:

同样的串口配置代码在一种407开发板上能正常输出,但是换到另一种407开发板上后就出现乱码,检查串口输出波形后发现,电平转换芯片没有问题,但是波特率却有问题。

 

问题原因:

   经过故障排查发现出现上述问题的原因是两种STM32F407使用的外部晶振的频率不一样,前者使用的是25MHZ的晶振,而后者却是使用的8MHZ的晶振,如果代码未经更改而直接用在后者身上,就会出现上述串口乱码的情况,而且后者的每bite位的周期就是前者的三倍左右。

 

解决办法:


    方法一:

因为 STM32F407的库文件中默认晶振值为25MHz,若外接晶振8MHz。所以:

1.首先需要修改"Option for target 'xxx'"中的Target -> Xtal(Mhz)处的值(改为8MHz)。此处修改影响Debug时观察到的时钟数值。


2.stm32f4xx.h默认25M外部晶振(HSE):

#if !defined  (HSE_VALUE)

  #defineHSE_VALUE    ((uint32_t)25000000) /*!

#endif /* HSE_VALUE*/

如果改为8M或其他值,需要修改此宏定义。 

为了尽量保持官方固件库的完整性,可在stm32f4xx_conf.h中添加代码

#if defined (HSE_VALUE)

/* Redefine the HSE value;it's equal to 8 MHz on the STM32F4-DISCOVERY Kit*/

#undef HSE_VALUE

#define HSE_VALUE   ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */

#endif /* HSE_VALUE */


注:但PLL_M定义在system_stm32f4xx.c中的,此方法对其不可用,亲测。

 

3. 打开文件 "system_stm32f4xx.c" ,搜索”PLL_M",修改默认PLL_M的参数:

/*************************PLL Parameters *************************************/

/* PLL_VCO = (HSE_VALUEor HSI_VALUE / PLL_M) * PLL_N */

#define PLL_M      25

#define PLL_N      336

 

/* SYSCLK = PLL_VCO /PLL_P */

#define PLL_P      2

 

/* USB OTG FS, SDIO andRNG Clock =  PLL_VCO / PLLQ */

#define PLL_Q      7

 

/******************************************************************************/

同样改为8M的话,PLL_M也应该改为8.(假设最后的时钟值不变)。 
PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N = 
25/25*336 = 336M (8/8*336=336M) 
SYSCLK = PLL_VCO / PLL_P = 
336 / 2 = 168M 默认是168M时钟。    

 

 

方法二:(目前找到的最好解决方法,若有更好的方法,欢迎前来交流)

1.首先需要修改"Option for target 'xxx'"中的Target -> Xtal(Mhz)处的值(改为12MHz)。此处修改影响Debug时观察到的时钟数值。



2. 在"Option for target 'xxx'"中的C/C++-> Define处添加

HSE_VALUE=8000000, 宏


在这里修改HSE的值,然后依然要修改"system_stm32f4xx.c"文件中的PLL_M,否则,在115200以上波特率下,首字节字符是乱码。亲测。(修改stm32f4xx.h里面的值不是不可以,但是感觉修改里面的东西不是很好,毕竟都是库来的,以后调用的时候也不用想着这个问题。但是,现在尚未找到更好的解决办法)

 

3. 打开文件 "system_stm32f4xx.c" ,搜索”PLL_M",修改默认PLL_M的参数:

/*************************PLL Parameters *************************************/

/* PLL_VCO = (HSE_VALUEor HSI_VALUE / PLL_M) * PLL_N */

#define PLL_M      25

#define PLL_N      336

 

/* SYSCLK = PLL_VCO /PLL_P */

#define PLL_P      2

 

/* USB OTG FS, SDIO andRNG Clock =  PLL_VCO / PLLQ */

#define PLL_Q      7

 

/******************************************************************************/


推荐阅读

史海拾趣

德崧电子(D-SWITCH)公司的发展小趣事

在电子开关行业,防水性能一直是重要的技术指标。德崧电子(D-SWITCH)公司在成立初期就意识到了这一点,并投入大量资源进行研发。经过数年的努力,公司成功研发出了具有TUV IP67/IP68防水等级认证的防水型开关。这一突破性的技术不仅解决了市场上防水开关性能不稳定的问题,还大大提高了产品的可靠性和使用寿命。凭借这一技术优势,德崧电子在市场上迅速崭露头角,赢得了客户的广泛认可。

DURACELL公司的发展小趣事

2016年3月1日,DURACELL公司正式成为伯克希尔·哈撒韦集团的一部分。这一重要事件标志着DURACELL公司在电子行业的地位得到了进一步巩固和提升。伯克希尔·哈撒韦集团是全球知名的投资公司之一,其强大的资本实力和市场影响力将为DURACELL公司提供更多的发展机遇和挑战。在伯克希尔·哈撒韦的支持下,DURACELL公司将继续致力于推动电池技术的创新和发展,为全球消费者提供更优质的产品和服务。

Advanced Thermal Products Inc公司的发展小趣事

ATP公司深知品质是企业生存和发展的基石。因此,他们建立了严格的质量管理体系,从原材料采购到产品出厂的每一个环节都进行严格把控。同时,公司注重品牌建设,通过广告宣传、参加展会等方式提升品牌知名度和美誉度。这些举措使得ATP公司在市场上逐渐树立了良好的品牌形象。

BELDEN公司的发展小趣事

BELDEN公司的故事始于1902年,当Joseph C. Belden在美国芝加哥创立这家公司时,他怀揣着对电线电缆制造的深厚热情与独特见解。初创时期,公司致力于研发和生产高品质的电线电缆产品,很快便在市场中赢得了良好的声誉。经过多次试验,公司成功发明了“Beldenamel”绝缘材料,这种柔韧的珐琅绝缘材料为公司的成功奠定了坚实的基础。随着产品的不断优化和市场的逐步拓展,BELDEN逐渐在电子行业中崭露头角。

Advanced Microelectronic Products Inc公司的发展小趣事

随着公司业务的不断发展,AMP公司意识到与国际伙伴合作的重要性。于是,公司积极寻求与国际知名企业的战略合作,通过技术交流和资源共享,共同开发新型电子产品。这些国际合作不仅提升了AMP公司的技术水平,还进一步提升了其品牌影响力和国际知名度。公司因此获得了更多海外市场的认可,实现了业务的全球化布局。

Global Connector Technology公司的发展小趣事
继电器内部元件损坏或老化,影响其正常工作。

问答坊 | AI 解惑

ALTERA CPLD器件的配置与下载

一、 配置方式   ALTERA CPLD器件的配置方式主要分为两大类:主动配置方式和被动方式。主动配置方式由CPLD器件引导配置操作过程,它控制着外部存储器和初始化过程;而被动配置方式由外部计算机或控制器控制配置过程。根据数据线的多少又可以将CP ...…

查看全部问答>

原创:吉林大学电子学院考题: 2008-11-26

吉林大学电子学院考题: 2008-11-26 物理学院及材料学院本科生 一. 填空题  (每空一分,共21分) 1.构成静态工作点Q的4个要素是:(        ),(  ),(  ),( ). 2 ...…

查看全部问答>

安规与EMC之相互关联问题

这个东东很值的看看,好久没时间上来,给大家分享这个!希望对你的工作学习有用…

查看全部问答>

KEIL软件初步学习,有例程

这个压缩包里有一篇PDF文档是周立功公司给初学者学习C51时的指导文档,关于KEIL 软件的使用,比较基础,在这个文档中讲了一个关于点亮LED小灯的程序,我把它作了扩展。   点亮LED我用了三种方式,都作了详细的说明,程序可读性比较好。虽 ...…

查看全部问答>

蓝牙视频传输任务外包

希望制作一个模块,一端将摄像头与蓝牙连接,另一端将蓝牙跟arm相连,通过arm将视频进行处理。希望承接这个项目的人曾做过相关项目。项目费用暂定2500吧(可另议)谢谢!…

查看全部问答>

关于信号量的问题

小弟有个测试程序,是用信号量来激活进程的,如下: SEM_ID  binarySem; int semCount; void semGive() {      int count;      for(count=0;count…

查看全部问答>

ADS下如何声明一个空的结构体?

typedef struct{}raw_spinlock_t; 以上是在ADS下头文件中申明一个空结构体. 编译的时候出错: Error : C2491E: \'struct\'has no members 这个程序是从linux下移植过来的. 在linxu下编译并无错误. 请问ADS下如何声明一个空的结构体?…

查看全部问答>

怎样发现SCSI卡的设备名

在用户态想操作SCSI卡,可是SCSI的驱动调用的是Windows的miniport接口,没有发现设备名,在用户态使用CreateFile的话,须知道设备名,怎么才能找到啊?…

查看全部问答>

CE工程文件,代码文件如何利用版本管理器管理

请问大家,在定制CE的时候,工文件如何添加到版本管理器中?BSP的代码又如何添加呢? 这里如何添加指的是添加那些文件。…

查看全部问答>