本帖最后由 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 设置时钟函数如下(代码中注释的中文字会出现乱码,这里删掉了,同时附上图片和代码附件):
请问各位前辈,如何能切换为外部HSE时钟呢? |
头文件找不到
stm32进入stop模式被莫名其妙唤醒(应该是systick)但是无法被WKUP引脚唤醒。
软件为keil5,头文件未找到
通过FATFS文件系统读写SD卡创建文件可以了,但加入MSC,一直显示一个没有格式化的U盘盘符,也不能格式化,这是什么问题导致的
stm32f103汇编求助
cubemx 生成的freertos代码 在keil ac6下不能编译,有什么解决的方法吗
报错Could not determine GDB version using command: arm-none-eabi-gdb --version
stm32f107vct6配RTL8201例程
STM32F103VGT6 能代替 STM32F103VFT6 吗?
STM32 读取DHT20,跑的官方的例程一直读取失败,初学者,各位大佬能指点一下不
前辈 不如咱们换个角度去想这个问题,
// 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, 那么以后如果我用其他频率的改怎么办呢??
谢谢前辈您的回复,我用示波器测试我的晶振引脚,是正常的频率,比如24MHZ的板子晶振就是24MHZ,
应该算是外部晶振正常起振吧!
但是按照上面的倍频代码,现在的主频用TIM3测试过,就是24MHZ。可是要注意,我的代码是HSE两分频,然后PLL六倍频,如果这时主频是24MHZ,那么就应该是8MHZ的时钟输入。
开始我个人认为如果是24MHZ的外部输入,那么我用两分频,然后两倍频,那么输出24MHZ,但实际上用TIM3测试是8MHZ的主频。以上现象同样出现在外部晶振是16MHZ的板子上。
一切的前提是我的串口接收和发送数据是正常的,可以证明我的时钟系统没出现混乱!
不知前辈是否遇到这样的问题呢??
前辈,问一个事情,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>
这样的,很是苦恼,能介绍一款软件吗?
谢谢前辈的回答。
但是我用的是STM32F100系列芯片,主频最大就是24MHZ, 如果超频的话,串口应该就不好使了吧,但是我的串口一直都是好使的。。。。应该不是超频了。。。
不知前辈是否遇到过类似问题呢?
前辈你好。
但是我用的是STM32F100系列芯片,主频最大就是24MHZ, 如果超频的话,串口应该就不好使了吧,但是我的串口一直都是好使的。。。。应该不是超频了。。。
不知前辈是否遇到过类似问题呢?
我看了一下前辈您发的图,这样说吧,最开始的倍频是这样做的RCC_PLLConfig(RCC_PREDIV1_Div2, RCC_PLLMul_2);
我自己自以为是24MHZ两分频,然后两倍频还是24MHZ。
实际上输出的是8MHZ,
而改为RCC_PLLConfig(RCC_PREDIV1_Div2, RCC_PLLMul_6);,主频变为24MHZ了,而F100系列主频最大是24MHZ,再倍频我不知道会出现什么样的现象。
还有,前辈,芯片手册我也看过,按照我的程序来说,没超频,应该跟HSI没关系吧!
前辈,这个图我看得懂,我个人的想法就是认为应该是图上的那个流程运行的程序,
但是如果两分频然后再两倍频的话,用TIM3和SYSTICK定时器去验证主频,这个时候会是8MHZ,所以才有这样的疑问!
何解?
RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_2);//两分频, 再2倍 ,24M只能这一种,其它都是出错的, 就是 24/2 ,最后再2倍频=24M,倍频最低是2倍频,如果这里出错,系统就会自动更换成内部时钟,你的 RCC_PLLConfig(RCC_PREDIV1_Div2, RCC_PLLMul_6);是错误的
前面已经说过这里了,如果我写两倍频 用TIM3和SYSTICK验证主频,就是8MHZ。
对自己位数不多的自信就是TIM3和SYSTICK还是会用的。