STM32F103使用内部rc振荡器做时钟源

2019-05-25来源: eefocus关键字:STM32F10  内部rc振荡器  时钟源

写在前面:标题“使用内部rc振荡器做时钟源”其实不太准确,实际应该是“使用内部rc振荡器经PLL倍频后做时钟源”,为了简单本文统一用“使用内部rc振荡器做时钟源”。


在做开发时,一些场合对时钟要求不是非常精确的时候可以省掉外部晶体和两个电容,好处是可以简化布线,节省成本并进一步降低功耗;缺点也很明显,HSI不够精准,官方给出的误差是在1%(25摄氏度)。根据手册,USB时钟不能用HSI经PLL后得到,但是实际应用时这样做是可以的(只是能用,但是非常不推荐)。


在用正点原子例程时,一直找不到相关例程,网上的一些教程也只是谈到了原理,代码部分都需要改动库函数,不方便移植。后来发现野火的例程里有,而且可以直接调用,就直接用了,详细文件是“16-RCC—使用HSE或者HSI配置系统时钟”的“bsp_clkconfig.c”和“bsp_clkconfig.h”。


文件中有如下函数


void HSI_SetSysClock(uint32_t pllmul)

{

__IO uint32_t HSIStartUpStatus = 0;


// 把RCC外设初始化成复位状态,这句是必须的

  RCC_DeInit();


  //使能HSI

RCC_HSICmd(ENABLE);

  // 等待 HSI 就绪

HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;

// 只有 HSI就绪之后则继续往下执行

  if (HSIStartUpStatus == RCC_CR_HSIRDY)

  {

//----------------------------------------------------------------------//

    // 使能FLASH 预存取缓冲区

    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);


    // SYSCLK周期与闪存访问时间的比例设置,这里统一设置成2

// 设置成2的时候,SYSCLK低于48M也可以工作,如果设置成0或者1的时候,

// 如果配置的SYSCLK超出了范围的话,则会进入硬件错误,程序就死了

// 0:0 < SYSCLK <= 24M

// 1:24< SYSCLK <= 48M

// 2:48< SYSCLK <= 72M

    FLASH_SetLatency(FLASH_Latency_2);

//----------------------------------------------------------------------//

 

    // AHB预分频因子设置为1分频,HCLK = SYSCLK 

    RCC_HCLKConfig(RCC_SYSCLK_Div1); 

  

    // APB2预分频因子设置为1分频,PCLK2 = HCLK

    RCC_PCLK2Config(RCC_HCLK_Div1); 


    // APB1预分频因子设置为1分频,PCLK1 = HCLK/2 

    RCC_PCLK1Config(RCC_HCLK_Div2);

//-----------------设置各种频率主要就是在这里设置-------------------//

    // 设置PLL时钟来源为HSE,设置PLL倍频因子

// PLLCLK = 4MHz * pllmul

RCC_PLLConfig(RCC_PLLSource_HSI_Div2, pllmul);

//------------------------------------------------------------------//


    // 开启PLL 

    RCC_PLLCmd(ENABLE);


    // 等待 PLL稳定

    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

    {

    }


    // 当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLK

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

//user_add

//SystemCoreClock=48000000;


    // 读取时钟切换状态位,确保PLLCLK被选为系统时钟

    while (RCC_GetSYSCLKSource() != 0x08)

    {

    }

  }

  else

  { // 如果HSI开启失败,那么程序就会来到这里,用户可在这里添加出错的代码处理

// 当HSE开启失败或者故障的时候,单片机会自动把HSI设置为系统时钟,

// HSI是内部的高速时钟,8MHZ

    while (1)

    {

    }

  }

}

本函数可以在主函数中的第一句调用。如果有外部晶体(8M,PLL倍频9),调用前系统时钟频率是72M;如果没有外部晶体,调用前系统时钟频率是HSI的8M。


在调用后,可以将OSC_IN和OSC_OUT引脚重映射(对于100脚以下的芯片,不包括100脚)到PD0,PD1并配置推挽输出低电平,代码实现如下:


void OSC_GPIO_Remap(void)

{

GPIO_InitTypeDef  GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO,ENABLE);

GPIO_PinRemapConfig(GPIO_Remap_PD01, ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOD, &GPIO_InitStructure);  

GPIO_ResetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_1);

}



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

上一篇:STM32 时钟RCC相关配置参考stm32f10x_rcc.h
下一篇:STM32 USB时钟设置

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

推荐阅读

stm32入门——跑马灯(基于stm32f103zet6)
的驱动都要使能相应的时钟,首先看stm32系统的时钟框图经查阅资料可知,GPIO的时钟在APB2的外设时钟使能寄存器上,相关函数的定义在stm32f10x_rcc.h中 void   RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)其源代码为:void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState){  /* Check the parameters */ //检查值的有效性&nbs
发表于 2019-10-21
stm32入门——跑马灯(基于stm32f103zet6)
stm32入门——跑马灯(基于stm32f103zet6)
的驱动都要使能相应的时钟,首先看stm32系统的时钟框图经查阅资料可知,GPIO的时钟在APB2的外设时钟使能寄存器上,相关函数的定义在stm32f10x_rcc.h中 void   RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)其源代码为:void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState){  /* Check the parameters */ //检查值的有效性&nbs
发表于 2019-10-21
stm32入门——跑马灯(基于stm32f103zet6)
STM32F103流水灯实验
#include "led.h"//初始化PB5和PE5为输出口.并使能这两个口的时钟     //LED IO初始化void LED_Init(void){  GPIO_InitTypeDef  GPIO_InitStructure;  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE); //使能PB,PE端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8
发表于 2019-10-19
STM32F4 SPI2初始化及收发数据【使用库函数】
我的STM32F4 Discovery上边有一个加速度传感器LIS302DL。在演示工程中,ST的工程师使用这个传感器做了个很令人羡慕的东西:解算开发板的姿态。当开发板倾斜时候,处于最上边的LED点亮,其他LED不亮。同时,用MicroUSB数据线将开发板连接电脑时,开发板就会虚拟成一个鼠标。倾斜开发板时,鼠标指针会向倾斜的方向移动。归根结底,就是牛B的ST工程师用加速度传感器完成了姿态解算。在开发板上,加速度传感器使用了SPI方式用STM32F4芯片进行通信。STM32F4的SPI1 作为主机,与LIS302Dl进行通信,读取或者写入数据。由于我没有使用过STM32的SPI口,因此在板子的空余资源中找到了SPI2接口来做实验
发表于 2019-10-19
使用STM32CubeMX,生成STM32F103ZE SPI3 HAL 工程
1,选择芯片型号为STM32F103ZET6,开始工程,引脚配置如下:主要是RCC,SPI3,和SYS三个模块2,时钟配置,可按下图进行:3,SPI3配置,如下图,配完这一步其它可以不管,直接生成工程。4,生成工程,打开工程手动输入红框中内容。运行:成功输出波形。
发表于 2019-10-18
使用STM32CubeMX,生成STM32F103ZE SPI3 HAL 工程
STM32F103xC 之 SPI 引脚分解
芯片:STM32F103RCT6 (64pin ,256K ,LQFP ,-40~85)对象:spiSPI1连接在APB2总线上;SPI2/3连接在APB1总线上;串行外设接口(SPI)在全双工和单工通信模式下,多达三个SPI能够在从属模式和主模式下以高达18 Mbits / s的速度进行通信。 3位预分频器提供8个主模式频率,并且帧可配置为8位或16位。 硬件CRC生成/验证支持基本的SD卡/ MMC模式。所有SPI都可以由DMA控制器提供服务。内部集成I2S两个标准的I2S接口(与SPI2和SPI3复用)可用,可以在主模式或从模式下运行。 这些接口可以配置为以16/32位分辨率工作,作为输入或输出通道。 支持8 kHz至48
发表于 2019-10-18
小广播
何立民专栏 单片机及嵌入式宝典

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

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