STM32F030 使用内部时钟和外部时钟

发布者:q13358975046最新更新时间:2019-10-09 来源: eefocus关键字:STM32F030  内部时钟  外部时钟 手机看文章 扫描二维码
随时随地手机看文章

static void SetSysClock(void)

{

  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

  

  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/

#if defined (PLL_SOURCE_HSI)

  /* At this stage the HSI is already enabled */

 

  /* Enable Prefetch Buffer and set Flash Latency */

  FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

 

  /* HCLK = SYSCLK */

  RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

      

  /* PCLK = HCLK */

  RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;

 

  /* PLL configuration = (HSI/2) * 12 = ~48 MHz */

  RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));

  RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL12);

            

  /* Enable PLL */

  RCC->CR |= RCC_CR_PLLON;

 

  /* Wait till PLL is ready */

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

  {

  }

 

  /* Select PLL as system clock source */

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

  RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    

 

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

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

  {

  }

#else

 #if defined (PLL_SOURCE_HSE)

  /* Enable HSE */    

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

 #elif defined (PLL_SOURCE_HSE_BYPASS)

  /* HSE oscillator bypassed with external clock */    

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

 #endif /* PLL_SOURCE_HSE */

   

  /* 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)

  {

    /* Enable Prefetch Buffer and set Flash Latency */

    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

 

    /* HCLK = SYSCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

      

    /* PCLK = HCLK */

    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;

 

    /* PLL configuration = HSE * 6 = 48 MHz */

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));

    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);

            

    /* Enable PLL */

    RCC->CR |= RCC_CR_PLLON;

 

    /* Wait till PLL is ready */

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

    {

    }

 

    /* Select PLL as system clock source */

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

    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    

 

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

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

    {

    }

  }

  else

  { /* If HSE fails to start-up, the application will have wrong clock 

         configuration. User can add here some code to deal with this error */

  }  

#endif /* PLL_SOURCE_HSI */  

}


关键字:STM32F030  内部时钟  外部时钟 引用地址:STM32F030 使用内部时钟和外部时钟

上一篇:STM32F030F4P6单片机由外部时钟改为内部时钟的步骤
下一篇:基于ARM平台的钢琴游戏 实现琴键按下效果

推荐阅读最新更新时间:2024-11-12 14:25

STM8 CAN外部时钟控制寄存器
STM8 CAN外部时钟控制寄存器(CLK_CANCCR) 地址偏移值:0x0B 复位值:0x00 位7:3 保留。始终为0。 位2:0 CANDIV :外部CAN时钟分频值 由软件写入,用于指定外部CAN时钟的分频值。详情请参见章节23.9 000:外部CAN时钟=fHSE/1(复位值) 001:外部CAN时钟=fHSE/2 010:外部CAN时钟=fMASTER/4 … 111:外部CAN时钟=fMASTER/8
[单片机]
STM8 CAN<font color='red'>外部</font><font color='red'>时钟</font>控制寄存器
STM32F030和STM32F103的IO结构上的区别
STM32F103GPIO 功能描述 每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。 根据数据手册中列出的每个I/O端口的特定硬件特征,GPIO端口的每个位可以由软件分别配置成多种模式。 ─ 输入浮空 ─ 输入上拉 ─ 输入下拉 ─ 模拟输入 ─ 开漏输出 ─ 推挽式输出 ─ 推挽式复用功能 ─ 开漏复用功能 每个I/O端口位可以自由编程,然而必须按照32位字访问I/O端口寄存器
[单片机]
<font color='red'>STM32F030</font>和STM32F103的IO结构上的区别
什么是内部时钟方式和外部时钟方式
计算机工作时,是在统一的时钟脉冲控制下一拍一拍地进行的。这个脉冲是由单片机控制器中的时序电路发出的。单片机的时序就是CPU在执行指令时所需控制信号的时间顺序,为了保证各部件间的同步工作,单片机内部电路应在唯一的时钟信号下严格地控时序进行工作,在学习51单片机的时序之前,我们先来了解下时序相关的一些概念。 既然计算机是在统一的时钟脉冲控制下工作的,那么,它的时钟脉冲是怎么来的呢? 要给我们的计算机CPU提供时序,就需要相关的硬件电路,即振荡器和时钟电路。我们学习的8051单片机内部有一个高增益反相放大器,这个反相放大器的作用就是用于构成振荡器用的,但要形成时钟,外部还需要加一些附加电路。8051单片机的时钟产生有
[单片机]
STM32系统时钟设置,采用外部有源晶振相关配置问题
调试STM32系统时钟设置时遇到一个问题:TIM2定时1Ms,TIM2中断服务函数time++,time=100时LED状态改变。程序运行后发现LED不是按照0.1S的时间闪烁,闪烁的很慢。 查找程序发现在系统时钟初始化时,RCC_HSEConfig(RCC_HSE_Bypass); 语句配置不对,此语句解释为HSE晶振被外部时钟旁路。指将芯片内部的用于外部晶体起振和功率驱动等的部分电路和XTAL_OUT引脚断开,这时使用的外部时钟是有源时钟或者其他STM32提供的CCO输出等时钟信号,直接单线从XTAL_IN输入,这样即使外部有晶体也震荡不起来了。 因为之前用的是有源晶振,接法如下图1:HSE配置如下:RCC_HSEConfig
[单片机]
STM32F030 使用内部晶振,PF0与PF1作普通IO使用
static void SetSysClock(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0; //需要修改的关键地方,一定一定。。。。 //RCC- CR |= ((uint32_t)RCC_CR_HSEON); RCC- CR &= ~((uint32_t)RCC_CR_HSEON); do { HSEStatus = RCC- CR & RCC_CR_HSERDY; StartUpCounter++; } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIME
[单片机]
9.STM32之两只看门狗
1.独立看门狗 IWDG 由内部时钟LSI提供,故不需要时钟使能,为递减计数器。独立看门狗激活后,计数器递减到0时复位,因此需要在计数器减到0之前进行喂狗操作。 步骤:取消写保护-设置时钟分频系数-设置重装载值-看门狗使能-喂狗程序 相关函数:#include stm32f4xx_iwdg.h void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess); void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); void IWDG_SetReload(uint16_t Reload); void IWDG_Enable(
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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