datasheet

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://www.eeworld.com.cn/mcu/ic462881.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

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

推荐阅读

STM32F4定时器时钟频率和时钟源

~TIM14的时钟为APB1的时钟的两倍。根据时钟分析,点击打开链接,可知因为系统初始化SystemInit函数里初始化APB1总线时钟为4分频即42M,APB2总线时钟为2分频即84M,所以TIM1、TIM8~TIM11的时钟为APB2时钟的两倍即168M,TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟的两倍即84M。知道定时器的时钟源频率我们用定时器做延时就很方便了,只要设定合适的分频系数即可,附一下用中断实现延时的公式:(摘自原子的STM32F4开发指南)             
发表于 2019-06-18
STM32F4定时器时钟频率和时钟源

STM32CubeMX开发stm32f103rbt6 CAN例程(二)

1、STM32CubeMX配置    2、生成代码查看  3、编写代码程序下载:http://download.csdn.net/download/white_loong/101374684、使用CAN分析仪测试(波特率125K)问题:程序CAN收发同时打开例如:1、main() {     HAL_CAN_Receive_IT();     HAL_CAN_Transmit_IT(); }  HAL_CAN_RxCpltCallback() { 
发表于 2019-06-18
STM32CubeMX开发stm32f103rbt6 CAN例程(二)

stm32f407之CAN控制器(操作寄存器)

),和can2(从),其中过滤器的设置是通过can1来设置,其他工作模式,波特率等,可以各自设置。每个控制器有三个发送邮箱,两个fifo,每个fifo有三个接收邮箱。发送:选择一个空的发送邮箱,把帧信息写到该发送邮箱的寄存器里,请求发送,控制器就会根据标识符的优先级把帧先后发送出去。接收:如果接收到的帧的标识符能过过滤表的一系列过滤,该帧信息就会保存在fifo接收邮箱的寄存器里。过滤器:stm32f407共有28组过滤器,每组过滤器可以设置关联到fifo0或者fifo1,每组都包括两个32位存储器,可以配置成一个32位有位屏蔽功能的标识符过滤器,或者两个32位完全匹配的标识符过滤器,或者两个16位有位屏蔽功能的标识符过滤器,或者四个16位完全
发表于 2019-06-18
stm32f407之CAN控制器(操作寄存器)

stm32F4 hal库之CAN通信的实现

目标:通过can总线,用stm32的CAN模块实现对电机驱动发送指令,从而实现对电机的控制。硬件设计:①收发芯片的功能:把单片机送来的信号通过收发芯片的转换从而实现信号的具体传输。②120欧终端电阻:主要是为了防止信号的干扰,一般来说,终端设备的CAN_H和CAN_L也要加上120欧终端电阻。软件设计基本知识:其实各种通信方式的本质都是一样的,均分为两个部分;①波特率:以何种速度来通信②具体准则:发送端和接收端对发送来的数据的解释。特色:CAN工作于4种模式;类似于手机的飞行模式,正常模式,待机状态,是一种感觉。CAN常用的工作模式是(1)回环模式:也就是自己发,自己收。(2)正常工作模式,也就是用于正常的接收,发送。一.公共部分
发表于 2019-06-18
stm32F4 hal库之CAN通信的实现

STM32f407的数字采集电路ADC的设计与使用

IN5   AD_CH2_Y    PA6   ADC1 IN6   AD_CH2_X    PA7   ADC1 IN7   */ #ifndef __BSP_ADC_H#define __BSP_ADC_H #include "stm32f4xx.h" #include "stm32f4xx.h" void bsp_InitADC(void);u16 bsp_GetAdValue(u8 chx); 
发表于 2019-06-18

STM32F207运用串口空闲中断+DMA接收不定长数据

;       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);//开启DMA时钟          DMA_InitStructure.DMA_Channel = DMA_Channel_4;//通道4           DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)USART1_DR_Address; //外设地址
发表于 2019-06-18

小广播

何立民专栏

单片机及嵌入式宝典

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

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