你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F100C8T6B的时钟问题

[复制链接]
ligongxiaobie 提问时间:2015-9-19 18:15 /
本帖最后由 ligongxiaobie 于 2015-9-19 21:18 编辑

问题如下:
我自己焊的两块板子一个外部晶振16MHZ,一个外部晶振24MHZ。
如果不更改时钟初始化函数,则板子不能启动,改变时钟函数后,发现貌似是用了内部额8MHZ的晶振,这个是通过我自己用SYSTICK和TIM3验证的,比如我现在的程序在我16MHZ和24MHZ板子上运行是同样的现象,所以我认为是使用了内部8MHZ晶振。
串口发送与接收数据时正确的。
我启动文件是startup_stm32f10x_md_vl.s,在Options define 里的宏为STM32F10X_MD_VL.USE_STDPERIPH_DRIVER
设置时钟函数如下(代码中注释的中文字会出现乱码,这里删掉了,同时附上图片和代码附件):
  1. void SystemInit (void)
  2. {
  3.                 RCC_DeInit();
  4.                 RCC_HSEConfig(RCC_HSE_ON);
  5.                 if(RCC_WaitForHSEStartUp() == SUCCESS)
  6.                 {
  7.                                 RCC_HCLKConfig(RCC_SYSCLK_Div1);
  8.                                 RCC_PCLK2Config(RCC_SYSCLK_Div1);
  9.                                 RCC_PCLK1Config(RCC_SYSCLK_Div1);
  10.                                 
  11.                                 FLASH_SetLatency(FLASH_Latency_2);
  12.                                 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
  13.                                 
  14.                                 RCC_PLLConfig(RCC_PREDIV1_Div2, RCC_PLLMul_6);
  15.                                 RCC_PLLCmd(ENABLE);


  16.                 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ;
  17.                 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK );
  18.                 while(RCC_GetSYSCLKSource() != 0x08);
  19. //                        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);                        
  20.                         ;;;;;

  21.          }
复制代码
现在通过RCC_PLLConfig(RCC_PREDIV1_Div2, RCC_PLLMul_6);这段代码,使我的主频为24MHZ,但很明显,我想用外部晶振使主频达到24MHZ...
请问各位前辈,如何能切换为外部HSE时钟呢?


QQ截图20150919181341.png

24MHZ.zip

下载

6.77 MB, 下载次数: 100, 下载积分: ST金币 -1

STM32F100完全手册.pdf

下载

6.27 MB, 下载次数: 93, 下载积分: ST金币 -1

收藏 评论21 发布时间:2015-9-19 18:15

举报

21个回答
ligongxiaobie 回答时间:2015-9-20 15:44:07
本帖最后由 ligongxiaobie 于 2015-9-20 17:01 编辑
chifen 发表于 2015-9-20 13:12
RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_2);//两分频, 再2倍 ,24M只能这一种,其它都是 ...

前辈 不如咱们换个角度去想这个问题,
//                                RCC_PLLConfig(RCC_PREDIV1_Div2, RCC_PLLMul_6);
//                                RCC_PLLCmd(ENABLE);
//                while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ;
//                RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK );
//                while(RCC_GetSYSCLKSource() != 0x08);
                        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);        

如果我这样注释掉这几段代码 即为不适用PLL,然后直接应用HSE为主频时钟,这个时候主频确实是24MHZ,
即为应用了外部晶振。
但是这个时候串口发送数据就不对了!! 高四位在几个固定数据上有乱码。
这个 时候如果换成16MHZ的外部晶振,则主频即为16MHZ。但是串口依然有部分乱码!!
我修改了这个HSE_VALUE宏定义的值,在24MHZ的晶振下改为24000000,串口就正确了。        同样,在16MHZ的晶振下改为16000000,就也正确了。

但是这是在我直接应用HSE为系统时钟的时候这样可以,但是如果我还是想用PLL,则还是出现应用内部8MHZ的HSI,这个时候如果我更改#define HSI_VALUE    ((uint32_t)8000000) /*!< Value of the Internal oscillator in Hz*/

比如改为24,那么串口就不好使了,而且系统时钟也紊乱了。。。

不过还是很开心,起码终于用上了外部时钟,而且一切正常了。

但是最开始的问题还是没解决,比如用外部时钟倍频到24MHZ,因为这次我用的是外部晶振24MHZ, 那么以后如果我用其他频率的改怎么办呢??


ligongxiaobie 回答时间:2015-9-20 09:22:02
本帖最后由 ligongxiaobie 于 2015-9-20 09:23 编辑
chifen 发表于 2015-9-20 07:07
当外频工作不正常时,比如超频过高或晶振没有起振 会自动切换到内部晶振,保证系统运行正常 ...

谢谢前辈您的回复,我用示波器测试我的晶振引脚,是正常的频率,比如24MHZ的板子晶振就是24MHZ,
应该算是外部晶振正常起振吧!
但是按照上面的倍频代码,现在的主频用TIM3测试过,就是24MHZ。可是要注意,我的代码是HSE两分频,然后PLL六倍频,如果这时主频是24MHZ,那么就应该是8MHZ的时钟输入。
开始我个人认为如果是24MHZ的外部输入,那么我用两分频,然后两倍频,那么输出24MHZ,但实际上用TIM3测试是8MHZ的主频。以上现象同样出现在外部晶振是16MHZ的板子上。
一切的前提是我的串口接收和发送数据是正常的,可以证明我的时钟系统没出现混乱!
不知前辈是否遇到这样的问题呢??
ligongxiaobie 回答时间:2015-9-21 16:56:23
chifen 发表于 2015-9-20 19:37
我没有 24M晶源做实验,我用8M晶振做的, 我把主频倍频到72M不变, HCLK 为2分频,APB2和APB1 用的是4分频 ...

前辈,问一个事情,Bootloader.SUBLIME-PROJECT 能打开这个工程文件的软件前辈你用过吗,
里边的头文件都是 #include <libopencm3/stm32/f1/rcc.h>
#include <libopencm3/stm32/f1/gpio.h>
#include <libopencm3/stm32/f1/flash.h>
#include <libopencm3/stm32/usart.h>
#include <libopencm3/stm32/systick.h>
这样的,很是苦恼,能介绍一款软件吗?
ligongxiaobie 回答时间:2015-9-19 18:19:15
不知大家遇没遇到过类似的问题呢,我明明打开的是HSE,但是貌似用的是HSI啊!!
chifen 回答时间:2015-9-19 18:56:44
STM32  有 倍频功能   ,比如 你用的 16M晶振   采用6倍频的算那就是 96M ,这个芯片最大是72M,超了,
你好我好大家好! 回答时间:2015-9-19 19:32:25
楼上说的有理
ligongxiaobie 回答时间:2015-9-19 21:20:24
ligongxiaobie 发表于 2015-9-19 18:19
不知大家遇没遇到过类似的问题呢,我明明打开的是HSE,但是貌似用的是HSI啊!! ...

谢谢前辈的回答。
但是我用的是STM32F100系列芯片,主频最大就是24MHZ, 如果超频的话,串口应该就不好使了吧,但是我的串口一直都是好使的。。。。应该不是超频了。。。
不知前辈是否遇到过类似问题呢?
ligongxiaobie 回答时间:2015-9-19 21:21:17

前辈你好。
但是我用的是STM32F100系列芯片,主频最大就是24MHZ, 如果超频的话,串口应该就不好使了吧,但是我的串口一直都是好使的。。。。应该不是超频了。。。
不知前辈是否遇到过类似问题呢?
chifen 回答时间:2015-9-20 07:07:56
当外频工作不正常时,比如超频过高或晶振没有起振 会自动切换到内部晶振,保证系统运行正常
chifen 回答时间:2015-9-20 09:37:43
你看一下这个图应该就明白了
24M.png
ligongxiaobie 回答时间:2015-9-20 10:08:24
chifen 发表于 2015-9-20 09:37
你看一下这个图应该就明白了

我看了一下前辈您发的图,这样说吧,最开始的倍频是这样做的RCC_PLLConfig(RCC_PREDIV1_Div2, RCC_PLLMul_2);
我自己自以为是24MHZ两分频,然后两倍频还是24MHZ。
实际上输出的是8MHZ,
而改为RCC_PLLConfig(RCC_PREDIV1_Div2, RCC_PLLMul_6);,主频变为24MHZ了,而F100系列主频最大是24MHZ,再倍频我不知道会出现什么样的现象。
还有,前辈,芯片手册我也看过,按照我的程序来说,没超频,应该跟HSI没关系吧!
chifen 回答时间:2015-9-20 10:58:50
你是 F100最大只有24M你就没有什么倍频了, 如果你超出正常频率就是使用内部8M晶振的
24-1.png
24-2.png
ligongxiaobie 回答时间:2015-9-20 12:34:00
chifen 发表于 2015-9-20 10:58
你是 F100最大只有24M你就没有什么倍频了, 如果你超出正常频率就是使用内部8M晶振的

...

前辈,这个图我看得懂,我个人的想法就是认为应该是图上的那个流程运行的程序,
但是如果两分频然后再两倍频的话,用TIM3和SYSTICK定时器去验证主频,这个时候会是8MHZ,所以才有这样的疑问!
何解?
chifen 回答时间:2015-9-20 13:12:29

    RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_2);//两分频, 再2倍 ,24M只能这一种,其它都是出错的, 就是 24/2 ,最后再2倍频=24M,倍频最低是2倍频,如果这里出错,系统就会自动更换成内部时钟,你的 RCC_PLLConfig(RCC_PREDIV1_Div2, RCC_PLLMul_6);是错误的
ligongxiaobie 回答时间:2015-9-20 15:30:51
chifen 发表于 2015-9-20 13:12
RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_2);//两分频, 再2倍 ,24M只能这一种,其它都是 ...

前面已经说过这里了,如果我写两倍频 用TIM3和SYSTICK验证主频,就是8MHZ。
对自己位数不多的自信就是TIM3和SYSTICK还是会用的。
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版