STM32F105RBT6 -- RCC 系统时钟

news2024/12/24 20:20:04

1. STM32F105RBT6 系统时钟树

在这里插入图片描述

2. 使用外部时钟给系统提供时钟HSE,外接一个8Mhz的晶振

在这里插入图片描述

3. 系统在启动的时候就会调用系统初始化函数,配置RCC 时钟系统,在调用main函数之前调用SystemInit函数

startup_stm32f10x_hd.s

; Reset handler
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                IMPORT  SystemInit    ; 上电复位,在main函数之前调用系统初始化函数
                LDR     R0, =SystemInit
                BLX     R0               
                LDR     R0, =__main
                BX      R0
                ENDP

4. keil 宏定义 USE_STDPERIPH_DRIVER,STM32F10X_CL,HSE_VALUE=8000000

中间用逗号隔开 STM32F10X_CL 这里可以不用定义,因为选芯片stm32f105rbt6 的时候默认已经定义了,HSE_VALUE=8000000 这个也可以不用定义,因为后面代码里面会再定义一次

在这里插入图片描述

5. 设置宏 HSE_VALUE 的值,STM32F105RBT6 默认是接的25Mhz的晶振,这里需要改成8Mhz

stm32f10x.h

/**
 * @brief In the following line adjust the value of External High Speed oscillator (HSE)
   used in your application 
   
   Tip: To avoid modifying this file each time you need to use different HSE, you
        can define the HSE value in your toolchain compiler preprocessor.
  */
#if !defined  HSE_VALUE
 #ifdef STM32F10X_CL
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
 #else 
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
 #endif /* STM32F10X_CL */
#endif /* HSE_VALUE */

在这里插入图片描述

6. STM32F105RBT6 系统时钟配置模块图,用CubeMX 打开的图

在这里插入图片描述

7. HSE 时钟配置

system_stm32f10x.c

/**
  * @brief  Sets System clock frequency to 72MHz and configure HCLK, PCLK2 
  *          and PCLK1 prescalers. 
  * @note   This function should be used only after reset.
  * @param  None
  * @retval None
  */
static void SetSysClockTo72(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* SYSCLK, HCLK, PCLK2 and PCLK1 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 */
    FLASH->ACR |= FLASH_ACR_PRFTBE;

    /* Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    

 
    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
    
    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;

#ifdef STM32F10X_CL
    /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */

    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV2 | RCC_CFGR2_PLL2MUL10 |
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
  
    /* Enable PLL2 */
    RCC->CR |= RCC_CR_PLL2ON;
    /* Wait till PLL2 is ready */
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
    {
    }
    
   
    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ 
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | 
                            RCC_CFGR_PLLMULL9); 
#else    
    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
#endif /* STM32F10X_CL */

    /* 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)0x08)
    {
    }
  }
  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 */
  }
}

在这里插入图片描述

8. 代码与图的对应关系

不同型号的芯片,一般只有这几个参数不同,只需要设置RCC的这几个寄存器就可以配置不同的系统时钟频率,可自由组合,想要多少自己配置
在这里插入图片描述

9. 配置好之后在keil里面仿真验证一下

9.1 加两行调试代码,打一个断点,编译

     RCC_ClocksTypeDef get_rcc_clock;
    RCC_GetClocksFreq(&get_rcc_clock);

在这里插入图片描述

9.2 连接开发板,点击debug

在这里插入图片描述###

9.3 打开watch 窗口

点击view->Watch Window->Watch1
在这里插入图片描述

9.4 在watch 窗口查看变量的值,输入 get_rcc_clock

在这里插入图片描述

9.5 变量值

在这里插入图片描述

9.6 全速运行

在这里插入图片描述

9.7 再看变量值,然后自己慢慢玩吧

在这里插入图片描述

10. 寄存器介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/595354.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑重装系统 / 系统迁移

1. 台式机太卡了&#xff0c;在网上买了个固态硬盘&#xff1a;250G&#xff0c; Kingston的&#xff0c;把C盘&#xff08;系统盘&#xff09;迁移到固态硬盘上去 2. 下载软件 https://www.diskgenius.cn/download.php3. 使用DiskGenius软件&#xff0c;可以方便地将系统从一…

【MySQL】- 04 MVCC 概要

MVCC 概要 事务概念事务的特性&#xff1a;ACID事务的操作隔离性引发的并发问题事务的隔离级别 LBCC&MVCCLBCC记录锁&#xff08;Record Locks&#xff09;间隙锁&#xff08;GAP Locks&#xff09;临键锁&#xff08;Next-Key Locks&#xff09;总结当前读什么是MVCC?什么…

[QT_055]设置QT源码调试(qtc+vs/mingw+msvc)

在开发过程中&#xff0c;我们经常用到调试功能&#xff0c;这样方便查找Bug&#xff1b;Qt是一个开源的框架&#xff0c;可以看到源码。虽然但大部分情况下&#xff0c;我们开发时&#xff0c;只是使用&#xff0c;并没有调试它的源码&#xff0c;但如果想深入了解Qt的一些机制…

对于创业者而言,租赁传统办公室和共享办公室有何不同

租办公室和创业密切相关。创业公司需要一个专业、高效、协作的工作环境来促进业务的开展&#xff0c;提升团队的工作效率和形象。租办公室可以为创业公司提供必要的场所和资源&#xff0c;方便团队成员之间的交流和合作&#xff0c;同时也可以作为公司的品牌形象和实力展示。此…

【IDEA】IntelliJ IDEA的使用 和 配置相关

idea安装后首次使用 新建项目 选择项目框架 下一步&#xff1a; 选择文件夹 隐藏文件不必要显示文件 在setings设置&#xff1a; 设置隐藏页面&#xff1a; 输入后回车 快捷键的配置 1.解决输入法冲突 关闭输入法系统功能快捷键 2.把eclipse的快捷键复用 常用快捷键&#…

Java学习(Tomacat)—— web的 请求request (post和get请求)和 响应response

引出 web的 请求request &#xff08;post和get请求&#xff09;和 响应response 请求request 请求&#xff1a;一切从浏览器发往服务器的都叫请求&#xff0c;包括从浏览器地址栏和网页上输入发出的。响应&#xff1a;一切从服务器发给浏览器的都叫响应 1.带数据的请求初步…

django读取csv文件数据生成可视化系统

Django是一个高效、灵活的Python Web框架&#xff0c;它可以快速地构建Web应用程序。在本篇文章中&#xff0c;我们将介绍如何使用django读取csv文件生成数据可视化系统。 1.使用虚拟环境创建项目 pip install virtualenv pip install virtualenvwrapper2.安装django模块,可使…

Oracle19C数据库迁移DM8库

Oracle19C数据库迁移DM8库 一、前期准备... 3 二、数据库信息查询... 3 三、DTS迁移... 6 Oracle数据库&#xff1a;... 6 达梦数据库... 7 1、新建工程... 8 2、新建迁移... 8 3、填写源库信息&#xff0c;使用指定驱动并自定义URL连接... 9 4、填写目标库信息... 10 …

书单 | IPD的12本书

随着IPD&#xff08;集成产品开发&#xff09;在IBM、华为等企业取得了巨大的成功&#xff0c;IPD逐渐被人们所知晓。诸多实践证明&#xff0c;IPD既是一种先进思想&#xff0c;也是一种卓越的产品开发模式&#xff0c;随着人们对IPD认识和探索&#xff0c;未来将会被应用到更多…

同步阻塞与异步非阻塞

同步阻塞消息处理 假如有这样一个系统功能&#xff0c;客户端提交Event至服务器&#xff0c;服务器接收到客户请求之后开辟线程处理客户请求&#xff0c;经过比较复杂的业务计算后将结果返回给客户端 以上设计存在几个显著的缺陷&#xff0c;具体如下。同步Event提交&#xf…

nginx(七十九)rewrite模块指令再探之(一)变量漫谈

一 set与变量 ① 知识回顾 rewrite模块 1) 关注一些易错点、难点的案例场景2) 本文内容很杂,建议读者选取感兴趣的阅读3) 重点关注&#xff1a; nginx.conf中的脚本类指令、本节关注if和set rewrite功能 ② 带着问题学习 1) 变量的作用域2) 变量的声明周期3) nginx变量…

《操作系统》by李治军 | 实验5 - 基于内核栈切换的进程切换

目录 一、实验目的 二、实验内容 三、实验准备 &#xff08;一&#xff09;TSS 切换 &#xff08;二&#xff09;基于堆栈的进程切换流程 四、实验过程 &#xff08;一&#xff09;实现 switch_to() 1、修改 schedule() 中的 switch_to() 2、实现 switch_to() 的汇编代…

企业网站架构部署与优化之LAMP

LAMP LAMP概述1、各组件的主要作用2、各组件安装顺序 编译安装Apache http服务编译安装MySQL服务编译安装PHP解析环境安装论坛 LAMP概述 LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c;能够提供静态和动态Web站点服务…

REST API和GraphQL API的比较

REST API REST&#xff08;表述性状态传输&#xff09;API 是一种应用程序接口 (API) 的架构风格&#xff0c;它使用 HTTP 请求来访问和使用数据。该数据可用于GET、PUT、POST和DELETE数据类型&#xff0c;指的是对资源的读取、更新、创建和删除操作。 RESTful API 使用 HTTP 方…

智能马达保护器在有色冶金行业中的应用

关注acrelzxz 摘要&#xff1a;简要介绍了热继电器、电子式电动机保护器和智能电动机保护器的优缺点&#xff0c;并阐述了智能电动机保护器如何正确的选型&#xff0c;重点比较了智能电动机保护器保护模式、端子控制模式、全通信模式、半通信模式等几种常见工作模式&#xff0…

Java基础(9)——从匿名内部类 到 函数式编程

引出 从匿名内部类到函数式编程的进化 什么是匿名内部类 没有类名----匿名内部类 List的匿名内部类 FunctionalInterface 注解 Collections.sort(list, new Comparator<Emp>() {Overridepublic int compare(Emp o1, Emp o2) {return (int) (o1.getAge()-o2.getAge())…

问题解决:npm修改路径后获取vue信息出错,npm info vue 出错。

问题&#xff1a; 在cmd中修改了npm缓存文件及全局模块文件路径后&#xff0c;通过获取vue信息出错。 C:\Users\SueMagic>npm info vue npm ERR! code EPERM npm ERR! syscall mkdir npm ERR! path b:\nodejs\node_cache\_cacache npm ERR! errno -4048 npm ERR! Error: E…

基于django的物流管理系统

摘要 随着全球经济的蓬勃发展&#xff0c;WTO的成立也给全球的商业活动带来了新的挑战&#xff0c;因此&#xff0c;企业需要充分发挥自身的优势&#xff0c;运用最新的科学技术&#xff0c;在互联网、信息科学的指导下&#xff0c;完善现有的管理体系&#xff0c;实现全面的创…

chatgpt赋能python:Python为什么出现多个语句?

Python为什么出现多个语句&#xff1f; 在Python中&#xff0c;同一行代码可以包含多个语句&#xff0c;这是Python与其他编程语言不同之处之一。那么&#xff0c;为什么Python出现了多个语句呢&#xff1f; 1. 简洁性 Python是一种高级编程语言&#xff0c;可以通过更少的代…

NoSql数据库及使用Python连接MongoDB

NoSQL 数据库 NoSQL 数据库是非关系数据库&#xff0c;不使用结构化查询语言 (SQL) 进行数据操作。相反&#xff0c;他们使用其他数据模型进行访问和数据存储。SQL 数据库通常用于处理结构化数据&#xff0c;但它们可能不是处理非结构化或半结构化数据的最佳选择。 NoSQL 数据…