历史上的今天
返回首页

历史上的今天

今天是:2025年06月27日(星期五)

正在发生

2018年06月27日 | STM32F407系统时钟配置

2018-06-27 来源:eefocus

STM32F407系统时钟配置

时钟树

1

方法一,采用官方库提供的配置(这里外部晶振25MHz,系统配置为168MHz)


STM32F4启动与STM32F10X不同,时钟已经默认配置好

启动代码,文件:startup_stm32f4xx.s

Reset handler  

Reset_Handler    PROC  

                 EXPORT  Reset_Handler             [WEAK]  

        IMPORT  SystemInit  

        IMPORT  __main  


                 LDR     R0, =SystemInit  

                 BLX     R0  

                 LDR     R0, =__main  

                 BX      R0  

                 ENDP


可以看出,在进入main函数之前,系统调用了SystemInit函数.

SystemInit函数分析:SystemInit函数位于system_stm32f4xx.c文件中.此文件提供几个宏定义可以设置各个时钟:

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

/* PLL_VCO = (HSE_VALUE or 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 and RNG Clock =  PLL_VCO / PLLQ */  

#define PLL_Q      7  


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


而晶振频率则是在文件stm32f4xx.h中进行设置:


外部晶振:


#if !defined  (HSE_VALUE)   

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

#endif /* HSE_VALUE */


内部晶振:

#if !defined  (HSI_VALUE)     

  #define HSI_VALUE    ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/  

#endif /* HSI_VALUE */ 


综上,可以得出默认配置中: 

锁相环压腔振荡器时钟PLL_VCO = 25 / 25 * 336 = 336MHz 

系统时钟SYSCLK = 336 / 2 = 168MHz 

USB,SD卡时钟 = 336 / 7 = 48MHz

SystemInit函数代码:

/** 

  * @brief  Setup the microcontroller system 

  *         Initialize the Embedded Flash Interface, the PLL and update the  

  *         SystemFrequency variable. 

  * @param  None 

  * @retval None 

  */  

void SystemInit(void)  

{  

  /* FPU settings ------------------------------------------------------------*/  

  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)  

    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */  

  #endif  


  /* Reset the RCC clock configuration to the default reset state ------------*/  

  /* Set HSION bit */  

  RCC->CR |= (uint32_t)0x00000001;  


  /* Reset CFGR register */  

  RCC->CFGR = 0x00000000;  


  /* Reset HSEON, CSSON and PLLON bits */  

  RCC->CR &= (uint32_t)0xFEF6FFFF;  


  /* Reset PLLCFGR register */  

  RCC->PLLCFGR = 0x24003010;  


  /* Reset HSEBYP bit */  

  RCC->CR &= (uint32_t)0xFFFBFFFF;  


  /* Disable all interrupts */  

  RCC->CIR = 0x00000000;  


#ifdef DATA_IN_ExtSRAM  

  SystemInit_ExtMemCtl();   

#endif /* DATA_IN_ExtSRAM */  


  /* Configure the System clock source, PLL Multiplier and Divider factors,  

     AHB/APBx prescalers and Flash settings ----------------------------------*/  

  SetSysClock();  


  /* Configure the Vector Table location add offset address ------------------*/  

#ifdef VECT_TAB_SRAM  

  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */  

#else  

  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */  

#endif  

}


SetSysClock函数分析,在SetSysClock函数中,配置了系统时钟,PLL倍频以及分频系数:

/** 

  * @brief  Configures the System clock source, PLL Multiplier and Divider factors,  

  *         AHB/APBx prescalers and Flash settings 

  * @Note   This function should be called only once the RCC clock configuration   

  *         is reset to the default reset state (done in SystemInit() function).    

  * @param  None 

  * @retval None 

  */  

static void SetSysClock(void)  

{  

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

/*            PLL (clocked by HSE) used as System clock source                */  

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

  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;  


  /* Enable HSE */  

  RCC->CR |= ((uint32_t)RCC_CR_HSEON);  


  /* Wait till HSE is ready and if Time out is reached exit */  

  do  

  {  

    HSEStatus = RCC->CR & RCC_CR_HSERDY;  

    StartUpCounter++;  

  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));  


  if ((RCC->CR & RCC_CR_HSERDY) != RESET)  

  {  

    HSEStatus = (uint32_t)0x01;  

  }  

  else  

  {  

    HSEStatus = (uint32_t)0x00;  

  }  


  if (HSEStatus == (uint32_t)0x01)  

  {  

    /* Select regulator voltage output Scale 1 mode, System frequency up to 168 MHz */  

    RCC->APB1ENR |= RCC_APB1ENR_PWREN;  

    PWR->CR |= PWR_CR_VOS;  


    /* HCLK = SYSCLK / 1*/  

    RCC->CFGR |= RCC_CFGR_HPRE_DIV1;  


    /* PCLK2 = HCLK / 2*/  

    RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;  


    /* PCLK1 = HCLK / 4*/  

    RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;  


    /* Configure the main PLL */  

    RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |   (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);  


    /* Enable the main PLL */  

    RCC->CR |= RCC_CR_PLLON;  


    /* Wait till the main PLL is ready */  

    while((RCC->CR & RCC_CR_PLLRDY) == 0)  

    {  

    }  


    /* Configure Flash prefetch, Instruction cache, Data cache and wait state */  

    FLASH->ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;  


    /* Select the main PLL as system clock source */  

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));  

    RCC->CFGR |= RCC_CFGR_SW_PLL;  


    /* Wait till the main PLL is used as system clock source */  

    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);  

    {  

    }  

  }  

  else  

  {

  /* If HSE fails to startup, the application will have wrong clock configuration. User can add here some code to deal with this error */  

  }  


}


如果外部时钟启动失败,系统会使用内部时钟 

默认配置: 

HCLK = SYSCLK / 1 = 168MHz 

PCLK2 = HCLK / 2 = 84MHz 

PCLK1 = HCLK / 4 = 42MHz

方法二,根据需要重新进行配置(这里外部晶振25MHz,系统配置为168MHz)


自己根据自己外部晶振大小和需要进行配置


void RCC_Config(void)

{

    RCC_DeInit();    //RCC寄存器初始化

    RCC_HSEConfig(RCC_HSE_ON);    //使用外部时钟

    if(RCC_WaitForHseStartUp() == SUCCESS)     //等待外部时钟启动

    {

        RCC_PLLCmd(DISABLE);    //配置PLL前应先关闭主PLL

        RCC_SYSCLKConfig(RCC_SYSCLKSOURCE_PLLCLK);    //选择PLL时钟为系统时钟

        RCC_HCLKConfig(RCC_SYSCLK_Div1);    //HCLK(AHB)时钟为系统时钟1分频

        RCC_PCLK1Config(RCC_HCLK_Div4);    //PCLK(APB1)时钟为HCLK时钟8分频

        RCC_PCLK2Config(RCC_HCLK_Div2);    //PCLK(APB2)时钟为HCLK时钟2分频

        RCC_PLLConfig(RCC_PLLSource_HSE,25,336,2,7);    //PLL时钟配置,外部晶振为25MHz,系统配置为168MHz

        RCC_PLLCmd(ENABLE);    //PLL时钟开启

        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);    //等待PLL时钟准备好

    }


}


推荐阅读

史海拾趣

Condor公司的发展小趣事

关于Condor公司在电子行业的发展,以下是五个相关故事:

  1. Condor的创始与早期发展

Condor公司成立于1893年,起初主要涉及离心机、挤奶机以及泵的生产。随着技术的不断进步和市场需求的变化,公司逐渐转型,开始专注于压力和液位控制组件及系统解决方案的研发与生产。这一转变使得Condor在电子行业中崭露头角,为其后续的发展奠定了坚实的基础。

  1. 专利技术的突破

1935年,Condor取得了世界上的泵压力开关上的第一个专利,这一创新性的技术突破为公司的快速发展注入了新的动力。随着这项专利技术的应用,Condor的产品开始在各种工业领域中得到广泛应用,特别是在需要精确控制压力和液位的场景中,如汽车、冶金、水火核风电等行业。

  1. 国际市场的拓展与合作

随着全球化进程的加速,Condor开始积极拓展国际市场。公司与多个国家的合作伙伴建立了长期稳定的合作关系,共同开发新产品,拓展新的应用领域。这一战略举措不仅提升了Condor在全球电子行业中的影响力,也为其带来了更多的商业机会。

  1. 产品质量的持续提升

Condor一直坚持以最高的质量要求来生产每一款产品。为了确保产品质量,公司在生产过程中严格把控每一个环节,从原材料采购到最终的产品测试,都遵循严格的标准和流程。这种对质量的执着追求,使得Condor的产品在市场上赢得了良好的口碑和客户的信赖。

  1. 技术创新的持续推进

作为家族企业,Condor始终保持着对技术创新的热情和投入。公司不断引进新的技术和设备,优化生产流程,提高产品的性能和可靠性。同时,Condor还积极与科研机构和高校合作,共同研发新的技术和产品,以满足市场不断变化的需求。这种持续的技术创新为Condor在电子行业中保持领先地位提供了有力支持。

以上五个故事展示了Condor公司在电子行业中的发展历程和关键转折点,体现了其对技术、质量和市场的敏锐洞察力和持续创新精神。如需更多信息,建议查阅Condor公司官网或相关新闻报道。

DINTEK公司的发展小趣事

由于篇幅限制,我无法直接给出5个完整的500字以上的DINTEK公司发展故事。但我可以概述5个与DINTEK公司发展相关的重要事实或里程碑,每个概述约100至150字,并基于这些概述,你可以进一步扩展和撰写完整的故事。

  1. 创始与国际化布局

DINTEK(鼎志电子股份有限公司)于1990年在台湾创立,凭借对电子行业的敏锐洞察,公司迅速崭露头角。为了拓展全球市场,DINTEK在欧洲和韩国设立了分公司,进一步巩固了其在全球电子行业的地位。这一国际化布局为DINTEK带来了更多的合作机会和市场份额。

  1. 进军中国大陆市场

1995年,DINTEK看到了中国大陆市场的巨大潜力,决定进入这一新兴市场。在北京成立了北京鼎志通业电子科技有限公司,作为在中国大陆的主要运营基地。随后,DINTEK陆续在东北、华北、华东等地设立办事处,实现了全国范围内的覆盖,为中国大陆的客户提供更加便捷的服务。

  1. 产品创新与认证

DINTEK一直注重产品创新和质量。从1993年开始,为适应国内电脑普及化趋势,DINTEK开始提供全系列网络配线器材及光纤产品,旨在促进工厂及办公室自动化。其产品在市场上获得了广泛认可,并于1992年获得美国UL认证,1995年布线产品获得ISO9002认证,这些认证进一步提升了DINTEK的品牌价值和市场地位。

  1. 技术合作与研发

DINTEK非常重视技术合作与研发。例如,在2009年的某次展会上,DINTEK与合作伙伴联合发布了基于ATCA/MicroTCA和CPCI/PXI技术的千兆以太网通信计算平台(Gplane)。这一产品的研发和推出,展示了DINTEK在通信计算领域的技术实力和市场洞察力。

  1. 社会责任与可持续发展

作为一家领先的电子公司,DINTEK始终注重履行社会责任和推动可持续发展。公司积极参与各种公益活动,并致力于通过技术创新和绿色生产来降低对环境的影响。同时,DINTEK也关注员工福利和职业发展,为员工提供广阔的发展空间和良好的工作环境。

基于以上概述,你可以进一步扩展每个故事,加入更多细节和背景信息,使其更加完整和生动。

Advanced_Linear_Devices_Inc.公司的发展小趣事

在集成电路的封装领域,ALD同样展现出了强大的创新能力。公司不仅提供了塑封、PDIP、小型装(SOIC)等常见的封装形式,还开发出了密封陶瓷封装(CDIP)等高性能封装技术。这些封装技术不仅提高了集成电路的可靠性和稳定性,还降低了生产成本,为客户提供了更具竞争力的产品。

得力(deli)公司的发展小趣事

得力公司在文具和打印机领域取得成功后,并未满足于此,而是继续寻求新的增长点。2016年,得力集团与余姚得力工具有限公司合资成立宁波得力工具有限公司,正式进入电动工具领域。得力凭借其在技术研发和品质控制方面的优势,迅速在电动工具市场占据一席之地。特别是其自主研发的“红芯”系列电动工具,凭借其高品质、高性价比的特点,赢得了用户的广泛好评。

巴丁微公司的发展小趣事

巴丁微积极参与各类电子行业的展会和交流活动,以此展示公司的技术实力和产品优势。在CITE2023第十一届中国电子信息博览会上,巴丁微向大家展示了其在电机驱动芯片在智能锁、气表、水表、个人护理及智能垃圾桶等领域的应用案例,吸引了大量专业人士和行业客户的关注。

通过展会,巴丁微不仅成功展示了公司的最新技术和产品,还加强了与业界同仁的交流与合作,进一步提升了公司在行业内的知名度和影响力。

CEVA, Inc公司的发展小趣事

随着万物互联时代的到来,CEVA公司迎来了新的发展机遇。Wi-Fi 6、Wi-Fi 7、5G-Advanced和蜂窝式物联网等技术的快速发展,推动了客户对新建置芯片和解决方案的需求。CEVA凭借其在无线连接和智能传感技术领域的领先地位,能够为客户提供全面的解决方案,满足这些技术在多个终端市场带来的巨大商机。同时,CEVA也是唯一能够提供蓝牙加上Wi-Fi或UWB加上蓝牙等组合解决方案的授权许可商,这一优势使得CEVA在全球半导体产业中占据了重要地位。

以上是基于公开资料对CEVA, Inc.在电子行业中的几个重要发展节点的概述。这些故事展示了CEVA如何在技术创新、市场布局和应对挑战等方面取得了显著成就,为公司的持续发展奠定了坚实基础。然而,由于电子行业的快速发展和不断变化的市场环境,CEVA的未来仍充满挑战和机遇。

问答坊 | AI 解惑

【EEWORLD】救火车和你一起学ARM系列活动之四

向量中断简介 ARM7中断体系介绍     上一次活动中,我们介绍了ARM7的时钟系统,这次活动介绍中断系统。这个两个系统是在以后的活动中,有很多的应用,同时这两个系统,也是ARM甚至是所有MCU的基础模块。     arm的VIC中断体 ...…

查看全部问答>

分析外国代码-产生随机时钟的CODE!

library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity decim_al2 isGeneric(        num : integer range 0 to 1022 := 7; -- numerateur du rapport de decimatio ...…

查看全部问答>

有哪位高手、好心人贡献一份IFS2003

求哪位高手、好心人贡献一份IFS2003? 在这谢谢了!…

查看全部问答>

散分~wince开机启动速度提高了

散分~系统启动速度提高一半了~俺用的是EP9315,64m的ram加32m的flash~,原来启动大概11秒,现在最多5秒~原因未明,待查找呵呵,心情不错,特来散分~…

查看全部问答>

ARM+VXWORKS开发

我刚开始上班,好多东西都不懂,经理把板子给我了.让我自己弄. 问其他同事,他们都说忙,好郁闷呀! 主机,ARM9开发板,ADS1.2集成开发环境,JTAG仿真器.都有了. 我下一步该做什么. 如果直接用Tornado 2.2 for pcPentium,然后和目标机这样连接可以吗? ...…

查看全部问答>

TCP连接问题

最近在PPP基础上实现TCP数据传输,可是TCP的三次握手怎么都连不上,只是有时可以,不知道为什么。而且三次握手的程序和发送数据的程序要分两次执行数据才能发送成功。我把发送的数据放到下面,忘大虾给予指点 第一次握手 FF 03 00 21 45 00 00 30 ...…

查看全部问答>

买书送了一块PCB板,空板,我该怎么开始...

只有一块空板,我什么芯片,元器件都没,书上有说哪里放什么器件,怎么放...开始买书的时候以为送的是完整的PCB开发板,还想照着书上的例子做做实验的,求大侠指点!!!…

查看全部问答>

转让FREESCALE DSP56F807开发板 - 450元

去年在北京通特科技有限公司买的,我们公司是做电力系统保护的,本来是想把这款DSP好好研究下的,因为在电力系统中这款DSP用的比较多,后来因为赶上别的项目,换成了STM32F ARM7平台,所以就一直没时间弄了,只弄了不到一个星期,基本上是崭新的 ...…

查看全部问答>

大惊喜!在EEWORLD的申请下,LaunchPad加送触摸板啦!!

各位参加“EEWORLD大学堂TI教室”认真学习并拿到LaunchPad的童鞋们,你们一定惊喜的发现还有一个触摸板在上面吧! 是个,这就是大惊喜! 由于你们的认真学习,不仅是我们能够看到的,反馈给TI同样也可以看得到!不仅我们感动,TI也很感动。 在EE ...…

查看全部问答>

南华大学黄智伟 收集的一些电子竞赛竞赛的题目

本帖最后由 paulhyde 于 2014-9-15 03:17 编辑 南华大学黄智伟 收集的一些电子竞赛竞赛的题目 包括历届国赛题,一些省赛题,TI赛题 也许对您有用。    …

查看全部问答>