写在前面:标题“使用内部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();//使能HSIRCC_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 <= 72MFLASH_SetLatency(FLASH_Latency_2);
//----------------------------------------------------------------------//// AHB预分频因子设置为1分频,HCLK = SYSCLK RCC_HCLKConfig(RCC_SYSCLK_Div1); // APB2预分频因子设置为1分频,PCLK2 = HCLKRCC_PCLK2Config(RCC_HCLK_Div1); // APB1预分频因子设置为1分频,PCLK1 = HCLK/2 RCC_PCLK1Config(RCC_HCLK_Div2);//-----------------设置各种频率主要就是在这里设置-------------------//// 设置PLL时钟来源为HSE,设置PLL倍频因子// PLLCLK = 4MHz * pllmulRCC_PLLConfig(RCC_PLLSource_HSI_Div2, pllmul);
//------------------------------------------------------------------//// 开启PLL RCC_PLLCmd(ENABLE);// 等待 PLL稳定while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}// 当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLKRCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//user_add//SystemCoreClock=48000000;// 读取时钟切换状态位,确保PLLCLK被选为系统时钟while (RCC_GetSYSCLKSource() != 0x08){}}else{ // 如果HSI开启失败,那么程序就会来到这里,用户可在这里添加出错的代码处理// 当HSE开启失败或者故障的时候,单片机会自动把HSI设置为系统时钟,// HSI是内部的高速时钟,8MHZwhile (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);
}

STM32F103学习笔记(一)使用内部rc振荡器做时钟源相关推荐

  1. STM32F103单片机使用内部RC振荡器做时钟源

    平时在做项目的时候都用的是外部晶振做为时钟源,想试试用内部RC振荡器做为时钟源,在网上搜了一下如何设置内部时钟,发现资料比较少的.决定将设置内部RC振荡器做为时钟源的方法记录下来. 用的单片机是STM ...

  2. STM32F103学习笔记四 时钟系统

    STM32F103学习笔记四 时钟系统 本文简述了自己学习时钟系统的一些框架,参照风水月 1. 单片机中时钟系统的理解 1.1 概述 时钟是单片机的脉搏,是单片机的驱动源 用任何一个外设都必须打开相应 ...

  3. STM32F103学习笔记(5)——数码管驱动TM1650使用

    一.简介 TM1650 是一种带键盘扫描接口的 LED(发光二极管显示器)驱动控制专用电路.内部集成有 MCU 输入输出控制数字接口.数据锁存器.LED 驱动.键盘扫描.辉度调节等电路.TM1650 ...

  4. STM32F103学习笔记(2)——收音机模块TEA5767使用

    一.简介 TEA5767是由菲利普公司推出的一款低功耗立体声收音机接收器芯片.频率范围从76-108MHz自动数字调谐.高灵敏度,高稳定性,低噪音,收音模块.一片低功耗电调谐调频立体声收音机电路,其内 ...

  5. STM32使用内部RC振荡器作为系统时钟开发项目--内晶振启动模板工程

    STM32使用内部RC振荡器时,OSC32_IN,OSC32_OUT接法: 1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空. 2)对于少于100脚的产品,有2种接法:   ...

  6. Slicer学习笔记(四十二)slicer c++源码编译

    Slicer学习笔记(四十二)slicer c++源码编译 1.cmake生成项目 2.编译失败的原因汇总 2.1.下载代码失败 之前在windows下编译slicer,没有做笔记. 后面再次编译还会 ...

  7. 【vn.py学习笔记(六)】vn.py constant源码阅读、委托生命周期

    [vn.py学习笔记(六)]vn.py constant源码阅读.委托生命周期 写在前面 1 constant 1.1 Direction 1.2 Offset 1.3 Status 1.4 Prod ...

  8. (实验15)单片机,STM32F4学习笔记,代码讲解【RTC实时时钟实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 RTC初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...

  9. 5214页PDF的进阶架构师学习笔记,阿里巴巴内部Jetpack宝典意外流出

    背景 在深度使用 Flutter 开发过程中,我们遇到了业务代码耦合严重,代码可维护性糟糕,如入泥泞.我们需要一个统一的应用框架来摆脱当下的开发困境,而这也是 Flutter 领域空缺的一块处女地. ...

最新文章

  1. Java NIO之Selector(选择器)
  2. ubantu使用apt安装时出现: xxx is not found 的解决方法
  3. coach和mentor,教练和导师的区别
  4. 数字与企鹅的战争,看周红衣的高明之处
  5. Versant 对象型数据库
  6. 通信教程 | 串口丢数据常见的原因
  7. php里的stdclass,PHP中的stdClass是什么?
  8. 1105学习笔记 数组的算法上
  9. 利用redis-sentinel+keepalived实现redis高可用
  10. linux软件包管理解析,linux学习笔记_09_软件包管理解析.doc
  11. yii2.0框架debug模式
  12. @程序员,快来 Get 常用的 Linux 命令和技巧!
  13. web前端:技术提升必学的HTML用法
  14. manual 离线手册 韩顺平php_传智播客韩顺平php视频教程(400集全)
  15. nstrFetchProhibited,stack overflow,Task watchdog got triggered解决办法
  16. 【嵌入式软件开发】之面试常识(一)
  17. 预训练模型在金融 NLP场景下的应用
  18. 2021.1知识图谱表示与推理综述(自己总结)
  19. IDEA2022配置Tomcat服务器教程(超细致版)
  20. 智能可穿戴设备如何跨越监测数据不准的鸿沟?

热门文章

  1. java sitemap_JAVA 针对 sitemap.xml 文件读写修改操作
  2. Android 各个平台的加密算法的了解
  3. 敏捷迭代管理 --每日站会
  4. onedrive实现excel在线编辑 online excel
  5. allegro 16.6 导出gerber文件---art文件
  6. shape 阴影实现方式,总有一款适合你
  7. 滴滴、美团、饿了么 无锡“外卖大战”,岂止是疯狂!然而…
  8. 湃睿科技公开课圆满成功
  9. Alternative Thinking
  10. ICLR2022:基于积分梯度的迁移对抗攻击