美文网首页
STM32使用内部rc振荡器做时钟源

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

作者: 光头不光还亮 | 来源:发表于2020-03-25 16:40 被阅读0次

在做开发时,一些场合对时钟要求不是非常精确的时候可以省掉外部晶体和两个电容,好处是可以简化布线,节省成本并进一步降低功耗;缺点也很明显,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);

}

版权声明:本文为CSDN博主「redgragon0」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/redgragon0/article/details/89356780

相关文章

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

    在做开发时,一些场合对时钟要求不是非常精确的时候可以省掉外部晶体和两个电容,好处是可以简化布线,节省成本并进一步降...

  • 10.11 嵌入式知识点总结

    1.内部时钟源采用 RC振荡器不精准 2.外部时钟源采用晶振精准 3.0xCCCC开始启动看门狗 4.0xAAAA...

  • 2018-04-26 STM32中使用内部RC振荡器做系统时钟

    STM32使用内部RC振荡器时,OSC32_IN,OSC32_OUT接法: 1)对于100脚或144脚的产品,OS...

  • 12/14

    STM32时钟系统在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。①HSI是高速内部时钟,...

  • STM32学习:STM32时钟系统

    一、时钟树介绍 三种不同的时钟源可被用来驱动系统时钟(SYSCLK): HSI振荡器时钟 HSE振荡器时钟 PLL...

  • 11.26

    时钟树 1 内部低速振荡器(LSI,40Khz) 2 外部低速振荡器(LSE,32.768Khz) 3 ...

  • 嵌入式9月14号总结。

    今天学习了时钟,开始配置内部时钟和外部时钟,展示了时钟的电路图,让我更加了解了stm32的运行模式,内部时钟输出9...

  • STM32一文通(4) RCC时钟控制理论

    我们使用库函数编程时, STM32默认调用了SetSysClockTo72()函数;已经配置了内部72MHz时钟,...

  • 9.14知识点总结

    内部时钟源和外部时钟源 复位和按键 蜂鸣器

  • STM32F10x之RCC

    1 综述 1.1 时钟源 在STM32中,一共有5个时钟源,分别是HSI、HSE、LSI、LSE、PLL。 HSI...

网友评论

      本文标题:STM32使用内部rc振荡器做时钟源

      本文链接:https://www.haomeiwen.com/subject/vtdxuhtx.html