历史上的今天
返回首页

历史上的今天

今天是:2024年12月18日(星期三)

正在发生

2018年12月18日 | stm32时钟初始化分析

2018-12-18 来源:eefocus

之前在系统应用中都是直接用的void SystemInit (void)函数进行系统时钟的初始化,从来没有考虑怎样进行时钟初始化的细节,但是突然硬件时钟无法起振了,所以才考虑利用系统内部,stm32内部提供了一个8M的内部时钟,不是很准确,但是可以用。如果还是按照调用系统时钟的方法,程序运行起来会很慢,因为SystemInit函数运行之后如果硬件晶振无法启动,就是自动切换到HSI时钟启动,所以只能用8M的时钟,不能用PLL进行倍频。在网上找到一串内部晶振初始化的程序,先贴上。


void RCC_Configuration(void)

{

  RCC_DeInit();

  RCC_HSICmd(ENABLE);

  

  while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET){}

  if(1)

  {  

    /* Enable Prefetch Buffer */

    FLASH->ACR |= FLASH_ACR_PRFTBE;

 

    /* Flash 2 wait state */

    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);

    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;  

   

    /* HCLK = SYSCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

      

    /* PCLK2 = HCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

    

    /* PCLK1 = HCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;

    

    //Configure PLLs

    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);

  

                

    //Enable PLL2 

    RCC_PLLCmd(ENABLE);

    //Wait till PLL2 is ready

    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

    {

    }

 

    //Select PLL as system clock source

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  

    //Wait till PLL is used as system clock source 

    //  0x00:HSI

    //  0x04:HSE

    //  0x08:PLL 

    while(RCC_GetSYSCLKSource() != 0x08)

    {

    }

  }

}


通过这个代码在对比SystemInit函数对系统初始化的整个过程就清楚许多。我们先看这个HSI作为时钟源的初始化过程,首先调用RCC_DeInit()将外设rcc寄存器设置为缺省值,就是将系统时钟从新设置为默认方式,这样就将系统恢复为HSI时钟,然后使能HSI时钟(这个使能其实有点多余,因为去掉之后也根本没有作用,但是对于SystemInit函数的理解具有一定的作用),然后系统等待时钟的启动完毕,HSI时钟启动之后就开始进入系统其他时钟总线的设置,前面是flash的设置(具体含义不太明白),在系统设置中也有相同的设置,然后设置HCLK=sysclk,系统时钟的分频系数,然后分别设置PLCK2、PLCK1,这三个就是我们的系统时钟、APB2时钟、APB1时钟的分频系数的设置,然后设置PLL,设置锁相环时钟来源以及倍频系数,这里设置的是HSI二分频作为时钟源,16倍频,设置之后对PLL锁相环进行使能,等待PLL启动完成,设置锁相环作为时钟源,最后等待设置成功。这就是整个设置的过程。而SystemInit()函数的设置过程与上面的一致,只是在程序直观表达上不太容易理解,下面就是SystemInit函数的代码我们可以通过第一个设置代码来理解这个系统时钟的初始化过程。


void SystemInit (void)

{

  /* Reset the RCC clock configuration to the default reset state(for debug purpose) */

  /* Set HSION bit */

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

 

  /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */

#ifndef STM32F10X_CL

  RCC->CFGR &= (uint32_t)0xF8FF0000;

#else

  RCC->CFGR &= (uint32_t)0xF0FF0000;

#endif /* STM32F10X_CL */   

  

  /* Reset HSEON, CSSON and PLLON bits */

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

 

  /* Reset HSEBYP bit */

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

 

  /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */

  RCC->CFGR &= (uint32_t)0xFF80FFFF;

 

#ifdef STM32F10X_CL

  /* Reset PLL2ON and PLL3ON bits */

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

 

  /* Disable all interrupts and clear pending bits  */

  RCC->CIR = 0x00FF0000;

 

  /* Reset CFGR2 register */

  RCC->CFGR2 = 0x00000000;

#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)

  /* Disable all interrupts and clear pending bits  */

  RCC->CIR = 0x009F0000;

 

  /* Reset CFGR2 register */

  RCC->CFGR2 = 0x00000000;      

#else

  /* Disable all interrupts and clear pending bits  */

  RCC->CIR = 0x009F0000;

#endif /* STM32F10X_CL */

    

#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)

  #ifdef DATA_IN_ExtSRAM

    SystemInit_ExtMemCtl(); 

  #endif /* DATA_IN_ExtSRAM */

#endif 

 

  /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */

  /* Configure the Flash Latency cycles and enable prefetch buffer */

  SetSysClock();

 

#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 

}


推荐阅读

史海拾趣

Artaflex公司的发展小趣事

面对全球电子市场的不断扩张,Artaflex公司制定了全球化的发展战略。公司通过设立海外分支机构、拓展国际市场、参与国际展会等方式,不断提升品牌知名度和市场份额。同时,公司还积极引进国际先进技术和管理经验,提升自身的竞争力。这一战略的实施使得Artaflex在全球电子行业中占据了重要地位。

Green Power Solutions公司的发展小趣事
电解电容漏液、击穿或老化也会影响稳压器的性能。
Exclara Inc公司的发展小趣事

随着技术的不断成熟和产品的日益完善,Exclara开始将目光投向全球市场。公司积极拓展海外市场,通过参加国际展会、与当地合作伙伴建立战略合作关系等方式,不断提升品牌知名度和市场份额。同时,公司也在全球范围内建立了完善的销售网络和售后服务体系,以确保客户能够享受到优质的产品和服务。

Accelink Technologies Co Ltd公司的发展小趣事

在Exclara看来,质量是企业的生命线。公司始终坚持质量至上的原则,从原材料采购到生产过程的每一个环节都严格把关,确保产品质量的稳定性和可靠性。同时,公司还建立了完善的客户服务体系,为客户提供全方位、个性化的服务支持。这种以客户为先的经营理念不仅赢得了客户的信任和支持,也为公司赢得了良好的口碑和声誉。

Antenova公司的发展小趣事

Antenova公司在行业内率先推出了第二代GPS射频天线模块,这一创新产品为嵌入式GPS应用提供了高性能的解决方案。该产品的推出不仅树立了行业标杆,还为公司带来了可观的收入增长。同时,Antenova还不断推出其他领先产品,进一步巩固了公司在天线设计领域的领先地位。

FEMA Electronics Corporation公司的发展小趣事

FEMA的创始人李明(化名)是一位资深的电子工程师,他在一次与客户的交流中,发现了市场对高质量电子元件的迫切需求。于是,他毅然决定创办FEMA,专注于研发和生产高性能的电子元器件。创业初期,公司面临着资金短缺、技术瓶颈等重重挑战。然而,李明凭借坚定的信念和不懈的努力,成功攻克了技术难关,并与多家知名企业建立了合作关系,为公司的发展奠定了坚实的基础。

问答坊 | AI 解惑

**** 如果你在EVC中用过浏览网页的控件的话请进来帮帮我?(很简单的,得到答案后立即赠分) ****

我在EVC下用到了浏览网页的控件 HWND  m_hCtlHtml = ::CreateWindow(TEXT(\"DISPLAYCLASS\"), NULL, WS_VISIBLE, 0, 0, 100, 100, m_hWnd, NULL, g_hInst, NULL); 网页已经可以打开了,但是我现在想实现的功能是,不通过拖动滚动条, 而 ...…

查看全部问答>

2005年电子竞赛文集

本帖最后由 paulhyde 于 2014-9-15 09:42 编辑   好资料  …

查看全部问答>

你们在使用IAR时有没有觉得它内存泄漏了?

我总感觉它有内存泄漏,然后过不了多久,资源就耗尽了……有时编辑器还出现文字丢失,开始是注释全没了,然后是其它文字也没了,再滚动几下,可能就死掉了,我晕……难道是我的系统有问题…………………

查看全部问答>

高效免费的ST7专用16KC编译器

此帖内容为2年前所发,二姨打扫卫生时把旧货全扔了,我跑到千里之外把它捡回来了。ST7的C编译器主要是COSMIC 和HIWARE(现在叫METROWERKS)。这两种C编译器的早期免费版本功能太弱(1~2k的程序量),基本没甚么实用价值。 COSMIC最 ...…

查看全部问答>

STM32用SWD调试时要烧写FLASH是不是一定要接RESET?

一直在核心板上玩 103ZE 都是些小程序  都是在RAM中调试的 而且只接三根线GND SWDIO SWCLK (VCC 直接接JLINK内部的) 很爽利 不过今天要试IIS 要放一个大的数据进去 于是要烧到FLASH中去  发现很快进度条走完 & ...…

查看全部问答>

430串口通讯问题

//两块电路板,单片机都是MSP430F427,一块通过串口发送,另一块通过串口接收,现在问题是 //发送板一直没有发出信号,测量输出端口(TX),一直保持高电平,通过硬件仿真跟踪发现只要 //将该串口引脚设置为串口功能该引脚(TX)就一直处于高电平 ...…

查看全部问答>

帮帮忙 程序进不了中断

#include \"msp430x14x.h\" void  main (void){ WDTCTL = WDTPW + WDTHOLD; //unsigned char i;  /*------选择系统主时钟为8MHz-------*/    /*BCSCTL1 &= ~XT2OFF;     &nb ...…

查看全部问答>

直线位移传感器原理与使用要求

  直线位移传感器是通过电位器元件将机械位移转换成与之成线性或任意函数关系的电阻或电压输出的装置。普通直线电位器和圆形电位器都可以分别用作直线位移和角位移传感器。但是,为实现测量位移目的而设计的电位器,就一定要要求在位移变化和电 ...…

查看全部问答>