stm32F051 HSI 时钟作为主时钟

发布者:月光男孩最新更新时间:2018-06-26 来源: eefocus关键字:stm32F051  HSI  时钟  主时钟 手机看文章 扫描二维码
随时随地手机看文章

最近要用 stm32F051, 因为板子比较小,故就没有外部晶体,想用内部8M RC为作48M系统时钟的来源。但是一下子,没弄出来,上网找了找,其实想快弄出来。结果还是看了一下代码,和手册,既然花了时间,就分享给大家吧,免得再耽误时间了。

两种方法:

1. 在系统启动时自动检测,没有外部晶体,就用内部HSI作为时钟源,代码如下:

/** 

  * @brief  Configures the System clock frequency, 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)  

{  

  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;  

  

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

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

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

    

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

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

  {  

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

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

              

    /* enable HSI */  

    RCC->CR &= ~RCC_CR_HSION;  

    while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)  

    {}  

      

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

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

    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_PREDIV | 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)  

    {}  

  }    

}  

将system_stm32f0xx.c  中的 SetSysClock() 函数的 else 填充加粗部分代码,这样,HSE启动不了的时候,自动转HSI


2. 自己写函数,可以通过这个函数,在有外部晶体的时候主动切换到HSI,代码如下:


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

* Function Name: system_clk_config 

* Description: 

* Input Params: 

* Return: 

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

void system_clk_config_HSI(void)  

{  

   RCC_DeInit();  

    /* enable HSI */  

    RCC_HSICmd(ENABLE);  

    while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)  

    {}  

      

    /* Enable Prefetch Buffer */  

    FLASH_PrefetchBufferCmd(ENABLE);  

    /* set Flash Latency, 0-24M: FLASH_Latency_0, 24M < sysclk <48M: FLASH_Latency_1*/  

    FLASH_SetLatency(FLASH_Latency_1);  

      

    /* Configures the AHB clock (HCLK)  */  

    RCC_HCLKConfig(RCC_CFGR_HPRE_DIV1);  

      

    /* Configures the APB clock (PCLK) */  

    RCC_PCLKConfig(RCC_CFGR_PPRE_DIV1);  

      

    /* Configures PLL source, (8M/2) * 12 = 48M */  

    RCC_PLLConfig(RCC_CFGR_PLLSRC_HSI_DIV2, RCC_CFGR_PLLMULL12);   

    RCC_PLLCmd(ENABLE);  

    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)  

    {}  

      

    /* Configures system clock source */  

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  

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

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

    {}  

}  

注:下面要以看到STM32F051的时钟树,HSI供给PLL的时候是强制 2分频的,所以到PLL就只有 4M了,



关键字:stm32F051  HSI  时钟  主时钟 引用地址:stm32F051 HSI 时钟作为主时钟

上一篇:STM32 FSMC 总结
下一篇:不用晶振,STM32内部HSI时钟的倍频使用

推荐阅读最新更新时间:2024-03-16 16:07

时钟芯片SD2200ELP与AVR单片机TWI接口控制的设计
  在提升机制动闸瓦间隙实时在线检测的设计中,需要保存故障时间和故障数据。   大部分仪器仪表中都要使用时钟芯片,但是很多的实时时钟芯片(如PCF8563)没有掉电保护,须外接晶振和电池,比较麻烦。而深圳兴威帆电子技术有限公司生产的SD2200ELP是内置32 KBE2PROM的串行实时时钟芯片,不需要外接器件支持,连线简单、可靠,提供的数据精确,断电后也能继续工作。微控制器采用Atmel公司的ATmegal6单片机,利用AT-megai6的硬件TWI接口可直接对SD2200ELP进行操作,无需软件模拟I2C方式,使用方便、可靠。   1 SD2200L简介   SD2200L系列(包括SD2200B/C/D/E/FLP)是一
[单片机]
<font color='red'>时钟</font>芯片SD2200ELP与AVR单片机TWI接口控制的设计
msp时钟设置程序
吐槽一下MSP430需要明白的东西: 在430中,一个时钟周期 = MCLK晶振的倒数。如果MCLK是8M,则一个时钟周期为1/8us; 一个机器周期 = 一个时钟周期,即430每个动作都能完成一个基本操作; 一个指令周期 = 1~6个机器周期,具体根据具体指令而定。 另:指令长度,只是一个存储单位与时间没有必然关系。 MSP430根据型号的不同最多可以选择使用3个振荡器。我们可以根据需要选择合适的振荡频率,并可以在不需要时随时关闭振荡器,以节省功耗。这3个振荡器分别为: (1)DCO 数控RC振荡器。它在芯片内部,不用时可以关闭。DCO的振荡频率会受周围环境温度和MSP430工作电压的影响,且同一型号的芯片所产生的频率也不相
[单片机]
msp<font color='red'>时钟</font>设置程序
用普中开发板做的51单片机的智能时钟具有闹钟功能
本贴针对学完单片机并且有读懂代码的非新手同学。本人目前放寒假,这个是本人在上个学期的单片机课上要求做的综合实验,现在重新修改了下增加了菜单目前测试毫无问题可以完美使用。有志向做闹钟的同学可以参考一下,原码上由本人写的大量注释可以方便看懂。 使用了LCD1602、DS1302、DS18B20用来测试温度、内部含闹钟系统但本人没有做EEPROM有需要的同学可以自行添加。 单片机源程序如下: #include reg52.h #include key.h #include LCD1602.h #include DS1302.h #include music.h #include DS18B20.H #define no
[单片机]
ATmega88 时钟
ATmega88芯片有如下几种通过Flash熔丝位进行选择的时钟源。时钟输入到AVR时钟发生器,再分配到相应的模块。 不同的时钟选项将在后续部分进行介绍。任何时钟源都需要足够高的Vcc来启动振荡器,并且还要有一个最小振荡周期以保证在开 始正常工作之前电源达到稳定电平 。 为保证有足够高的 Vcc,在其它复位源释放之后,器件在一个超时延迟时间 (tTOUT) 之内保持内部复位状态。 P37”系统控制和复位” 描述了内部复位的开始条件。这个延时(tTOUT)由看门狗振荡器定时,而延时的周期数通过熔丝位 SUTx 与 CKSELx 来设定。 Table5 列 出了可选的延迟。看门狗振荡器的频率由工作电压决定,详见 P283”ATme
[单片机]
ATmega88 <font color='red'>时钟</font>源
51单片机倒计时秒表/可调整时钟
(1)控制功能: ①启动/停止:秒表和时钟选择功能的总开关允许位。没按或偶次按下,关闭时钟和秒表功能选择。单次按下,允许进行秒表和时钟功能选择。 ②暂停:秒表或时钟的停止信号。任何时候按下按钮停止秒表倒计时或停止时钟计时和撤销报警信号。 ③复位:秒表和时钟复位信号。任何时候按下按钮秒表显示或时钟显示恢复初始状态:00.00.00.0 。 (2)调节功能: 通过6位按钮可以对数码的六位显示进行调整。任何时候都可以分别可以通过HH、HL、MH、ML、SH、SL对时的十位、时的个位、分的十位、分的个位、秒的十位和秒的个位进行调节并设定。 (3)显示功能: 同8个8段数码管进行显示。显示精度为0.01秒;最后一段数码管显示工作状态,“H”
[单片机]
51单片机倒计时秒表/可调整<font color='red'>时钟</font>
基于PCI总线数字信号处理机的硬件设计
   引言   以INTEL公司为主推出的PCI总线规范。采用PCI总线设备所具有的配置空间以及PCI总线通过桥接电路与CPU相连的技术使PCI总线具有广泛的适应性,同时能满足高速设备的要求。   另一方面,DSP的发展也异常迅速。ADI公司于2001年发布了其高性能TigerSHARC系列DSP的新成员,采用这样系列的芯片,可研制出处理能力更强,体积更小,开发成本更低,性价比更高的信号处理机。并广泛地应用于信号处理、通信、语音、图像和军事等各个领域。 TS101S介绍   本系统采用美国ADI公司的高性能TigerSHARC 101S作为主处理器,简称TS101S。ADSP TS101S处理支持32bit和64bit浮点,
[应用]
STM8 低功耗时钟管理
  第一次做低功耗设备,单片机 STM8s003 ,起初只设置了进入 Halt模式,IO配置是使用之前的状态。客户测试结果,9v的电池,10天电压损失比率为 13.5%。   自己做了下测试,运行状态电流 -- 7.2mA,待机电流 1.6mA.   首次改进,由于使用的是外部上拉,在进入 Halt模式前将单片机 IO全部配置为浮空输入状态,按键使用的 IO加上下降沿触发中。测试结果:运行状态电流 6.7mA;待机电流 133uA.   第二次改进,将 12M的内部时钟 4分频,CPU时钟 4分频,外设时钟只保留两个定时器和一个看门狗;测试结果:运行状态电流 2.36mA;待机电流 127uA. 经理说还是太大,至少要降到两位数,
[单片机]
基于FPGA的时钟设计
对于一个设计项目来说,全局时钟是最简单和最可预测的时钟。在PLD/FPGA设计中最好的时钟方案是由专用的全局时钟输入引脚驱动的单个主时钟去钟控设计项目中的每一个触发器。只要可能就应尽量在设计项目中采用全局时钟。PLD/FPGA都具有专门的全局时钟引脚,它直接连到器件中的每一个寄存器。这种全局时钟提供器件中最短的时钟到输出的延时。   1 全局时钟   全局时钟的实例如图1所示。图1中定时波形示出触发器的数据输入D 应遵守建立时间和保持时间的约束条件。建立和保持时间的数值在PLD数据手册中给出,也可用软件的定时分析器计算出来。如果在应用中不能满足建立和保持时间的要求,则必须用时钟同步输入信号。   2 门控时钟   在许
[嵌入式]
基于FPGA的<font color='red'>时钟</font>设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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