datasheet

STM32F407时钟设置

2019-06-13来源: eefocus关键字:STM32F407  时钟设置  RCC

这里我们写一个RCC配置函数来说明各函数的用途,其中HSE = 8MHz。

 

/**

  *  @说明  配置STM32F407的时钟系统

  * @参数  无

  * @返回  无

  * @说明  void Clock_Config(void) 按如下表格配置时钟

  *

*==================================================================

*        Supported STM32F4xx device revision    | Rev A

        *-----------------------------------------------------------------------------

*        System Clock source                             | PLL (HSE)

*-----------------------------------------------------------------------------

        *        SYSCLK(Hz)                              | 168000000

        *-----------------------------------------------------------------------------

*        HCLK(Hz)                                | 168000000

        *-----------------------------------------------------------------------------

*        AHB Prescaler                                       | 1

*-----------------------------------------------------------------------------

*        APB1 Prescaler                                  | 4

*-----------------------------------------------------------------------------

*        APB2 Prescaler                                | 2

*-----------------------------------------------------------------------------

*        HSE Frequency(Hz)                           | 8000000                                    

*-----------------------------------------------------------------------------

 *        PLL_M                                 |8

*-----------------------------------------------------------------------------

*        PLL_N                                   | 336

*-----------------------------------------------------------------------------

        *        PLL_P                                       | 2

*-----------------------------------------------------------------------------

*        PLL_Q                                  |7

*===================================================================

*/

void Clock_Config(void){

 

     ErrorStatus        State;

     uint32_t           PLL_M;      

     uint32_t           PLL_N;

     uint32_t           PLL_P;

     uint32_t           PLL_Q;

 

    /*配置前将所有RCC重置为初始值*/

     RCC_DeInit();

 

     /*这里选择 外部晶振(HSE)作为 时钟源,因此首先打开外部晶振*/

     RCC_HSEConfig(RCC_HSE_ON);

     /*等待外部晶振进入稳定状态*/

     while( RCC_WaitForHSEStartUp() != SUCCESS );

 

     /*

     **我们要选择PLL时钟作为系统时钟,因此这里先要对PLL时钟进行配置

     */

 

     /*选择外部晶振作为PLL的时钟源*/

    

     /* 到这一步为止,已有 HSE_VALUE = 8 MHz.

        PLL_VCO input clock = (HSE_VALUE or HSI_VALUE / PLL_M),

        根据文档,这个值被建议在 1~2MHz,因此我们令 PLL_M = 8,

        即 PLL_VCO input clock = 1MHz */

     PLL_M         =    8;  

    

     /* 到这一步为止,已有 PLL_VCO input clock = 1 MHz.

        PLL_VCO output clock = (PLL_VCO input clock) * PLL_N,

        这个值要用来计算系统时钟,我们 令 PLL_N = 336,

        即 PLL_VCO output clock = 336 MHz.*/       

     PLL_N        =    336;

 

     /* 到这一步为止,已有 PLL_VCO output clock = 336 MHz.

        System Clock = (PLL_VCO output clock)/PLL_P ,

        因为我们要 SystemClock = 168 Mhz,因此令 PLL_P = 2.

        */

     PLL_P         =    2;

 

     /*这个系数用来配置SD卡读写,USB等功能,暂时不用,根据文档,暂时先设为7*/

     PLL_Q         =    7;

    

     /* 配置PLL并将其使能,获得 168Mhz 的 System Clock 时钟*/

     RCC_PLLConfig(RCC_PLLSource_HSE, PLL_M, PLL_N, PLL_P, PLL_Q);

     RCC_PLLCmd(ENABLE);

 

     /*到了这一步,我们已经配置好了PLL时钟。下面我们配置Syetem Clock*/

     /*选择PLL时钟作为系统时钟源*/

     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

 

    

 

 

/*到了这一步,我们已经配置好了系统时钟,频率为 168MHz. 下面我们可以对 AHB,APB,外设等的 时钟进行配置*/

     /*时钟的结构请参考用户手册*/

 

     /*首先配置 AHB时钟(HCLK). 为了获得较高的频率,我们对 SYSCLK 1分频,得到HCLK*/

     RCC_HCLKConfig(RCC_HCLK_Div1);

 

     /*APBx时钟(PCLK)由AHB时钟(HCLK)分频得到,下面我们配置 PCLK*/

 

     /*APB1时钟配置. 4分频,即 PCLK1 = 42 MHz*/

     RCC_PCLK1Config(RCC_HCLK_Div4);

 

     /*APB2时钟配置. 2分频,即 PCLK2 = 84 MHz*/

     RCC_PCLK2Config(RCC_HCLK_Div2);

 

/*****函数结束******/

 

/*以上函数可以大体上说明这些库函数的作用*/

}

 

对于 RCC_PLLConfig();函数,大家可能会迷惑。

其函数原型为:

void RCC_PLLConfig(uint32_t  RCC_PLLSource,

                   uint32_t  PLLM,

                   uint32_t  PLLN,

                   uint32_t  PLLP,

                   uint32_t  PLLQ);

 

迷惑的地方肯定在于后面 4个参数 PLLM / PLLN / PLLP / PLLQ.

 

在库函数源文件 system_stm32f4xx.c 中可以找到这 4个参数的说明,请看下图注释部分:

 

(下面的是从 库函数源文件 stm32f4xx_rcc.c 中找到的。其他函数可以直接去看库函数,注释非常详细)

 

/**

  * @brief  Configures the main PLL clock source, multiplication and division factors.

@简介 配置主PLL时钟源,以及分频因子

[1] [2]

关键字:STM32F407  时钟设置  RCC

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/ic464498.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32F4系统时钟设置之二
下一篇:STM32时钟配置方法详解

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32F030R8-Nucleo使用PA2、PA3 UART2不能使用的问题

1. 开发环境开发平台:官方开发板STM32F030R8-Nucleo开发软件:Keil uVision5.24开发库:STM32Cube_FW_F0_V1.9.02. 实验现象根据官方例程,将UART1的配置更改为UART2,然后使用杜邦线接到PA2、PA3引脚,可串口就是无法收发数据。之后查看原理图发现,官方的Demo板,默认就没有将PA2、PA3扩展到外部引脚上,而是将这个USART2串口连接到了ST-Link的串口上,这样,ST-Link既可以下载程序,也可以当做开发板的USART2使用。截取部分具体电路图如下:其中SB14、SB13、SB63和SB62都是零欧姆电阻,问题就在这里了,SB14、SB13焊接了,但是SB63
发表于 2019-06-14
STM32F030R8-Nucleo使用PA2、PA3 UART2不能使用的问题

基于Ymodem协议的STM32F407的串口IAP

发送数据。成功接收的不会被确认。有错误的块被确认(NAK),并重发。Ymodem类似于Xmodem-1K,不同之处是提供批处理模式(batch mode)。在批处理模式下,可以使用一个命令发送一些文件。Ymodem使用循环冗余码校验作为错误校验方式。——摘自百度百科基于Ymodem协议的IAP引导程序硬件平台原子探索者STM32F407开发板通信接口串口实现流程按住复位键时按下KEY1键,在松开复位键之前按住KEY1不放,松开复位键,红色LED灯常亮,这时便进入固件升级程序,不断向上位机发送字符’C’请求上位机发送应用程序固件。这时打开上位机查询请求,上位机接收到请求后,通过串口发送第一个数据包,这个数据包主要包含了传输的文件的文件名和文
发表于 2019-06-14
基于Ymodem协议的STM32F407的串口IAP

STM32F10xxx支持三种复位

STM32F10xxx支持三种复位形式,分别为系统复位、上电复位和备份区域复位。一、系统复位除了时钟控制器的RCC_CSR寄存器中的复位标志位和备份区域中的寄存器(见图4)以外,系统复位将复位所有寄存器至它们的复位状态。当发生以下任一事件时,产生一个系统复位:1. NRST引脚上的低电平(外部复位) 2.  窗口看门狗计数终止(WWDG复位) 3.  独立看门狗计数终止(IWDG复位) 4.  软件复位(SW复位) 5.  低功耗管理复位可通过查看RCC_CSR控制状态寄存器中的复位状态标志位识别复位事件来源。软件复位通过将Cortex™-M3中断应用
发表于 2019-06-14
STM32F10xxx支持三种复位

一则STM32f103莫名反复复位的经验记录

最近在调试STM32F103RBT6时,发现只要一打开AD就会反复复位,将断点设置到启动代码处,发现复位是非常有规律的,总是执行过断点后就又回到断点了。找原理,查硬件,一切均没有问题。最后怀疑到代码上来,因为AD采样是另外一个产品中正常使用移植过来的,分为三大部分:对AD涉及到的外设和存储等的初始化,对AD的采集与存储(主要是中断),对AD的数据进行计算分析。将三大模块全部注释后再逐一开放,发现是对AD的初始化会导致复位。对AD的初始化代码再全部注释后逐一开放,发现是启动定时器TIM4的代码会导致复位。后来将与定时器有关的代码全部审查了一遍,也没有发现问题,同样的相似代码在TIM1上工作的很好。查网上的相似问题,也没有改善
发表于 2019-06-14

STM32F4的CCM内存之一

我们知道STM32F4当中有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢? 首先,我们可以使用Keil的设置选项,将IRAM2打勾,让编译器选择什么时候使用这个内存。显然,我们还可以将这两个地址修改一下,将IRAM1改为0x10000000,这样,编译器就会优先分配CCM内存。 我们来看看结果,在MAP文件中,表明确实使用了这段内存,但是因为我们使用的内存较少, 还没有用到CCM。 这种自动分配的方式有什么问题呢?这段内存是内核专有的,除了内核任何其它总线都不能访问,这就意味着,一旦编译器将数据分配到CCM中,而同时使用了DMA
发表于 2019-06-14
STM32F4的CCM内存之一

STM32F4的CCM之二

前言有客户用STM32F427芯片,程序将CSTACK放在CCM RAM中,结果测试过一段时间的板子都出现了不能正常运行的情况。这个现象一度让我们怀疑是否是CCM RAM在测试过程中遭到了破坏,导致我们在解决问题的道路上浪费了不少时间。事实证明STM32的CCM RAM并没有那么脆弱,而解决问题时尽力从多个角度进行验证,不放过所有可能出问题的环节之心态更为重要。在具体讨论问题的原因之前,不妨先介绍一下STM32F4/STM32F3系列芯片上的CCM RAM。CCM RAM介绍ST的STM32F303, STM32F358, STM32F328, STM32F334系列和STM32F4的Advanced line系列芯片里都有CCM
发表于 2019-06-13
STM32F4的CCM之二

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved