(学习日记)2023.04.29

写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。


标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。


点击此处进入学习日记的总目录

2023.04.29

  • 一、32:时钟树
  • 二、32: 时钟配置
        • 时钟控制寄存器(RCC_CR)
        • 时钟配置寄存器(RCC_CFGR)
        • 时钟中断寄存器 (RCC_CIR)
        • APB2 外设复位寄存器 (RCC_APB2RSTR)
        • APB1 外设复位寄存器 (RCC_APB1RSTR)
        • AHB外设时钟使能寄存器 (RCC_AHBENR)
        • APB2 外设时钟使能寄存器(RCC_APB2ENR)
        • APB1 外设时钟使能寄存器(RCC_APB1ENR)
        • 备份域控制寄存器 (RCC_BDCR)
        • 控制/状态寄存器 (RCC_CSR)

一、32:时钟树

  1. 要了解时钟系统,就需要查看数据手册中的时钟树。以下是时钟树的基本逻辑:
    在这里插入图片描述
  2. 下面是 STM32F103VET6的时钟树与其详细解释

需要注意的是,每一个型号的处理器的时钟树都有所不同

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

在这里插入图片描述

在这里插入图片描述
3. 时钟控制寄存器
我们控制时钟树的办法,就是通过控制时钟树中的分频器开关与门,来获得不同的时钟频率。
在这里插入图片描述
控制寄存器的方法是给RCC寄存器赋值,在程序中一般会将各种寄存器设置集中到一个结构体中。
在这里插入图片描述

举例说明1:
RCC->CR |= (uint32_t)0x00000001;
查看RCC_CR寄存器
在这里插入图片描述
在这里插入图片描述
观察到代码操作为将第0位赋值为1
在这里插入图片描述
所以该代码的作用为 设置为内部高速时钟使能,即启动处理器内部8MHz振荡器

举例说明2:
RCC->CR &= (uint32_t)0xFEF6FFFF;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
PLL关闭,HSE关闭,外部3-25MHz外部晶体振荡器被旁路,时钟监测器关闭。

  1. 锁相环
    在这里插入图片描述
  2. 系统时钟
    在这里插入图片描述

参考资料:
耗时三天,STM32精讲,原理图一遍必懂!!!

二、32: 时钟配置

  1. 先查看系统结构,观察所需模块对应哪一条时钟线
    在这里插入图片描述
  2. RCC寄存器描述

时钟控制寄存器(RCC_CR)

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

时钟配置寄存器(RCC_CFGR)

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

时钟中断寄存器 (RCC_CIR)

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

APB2 外设复位寄存器 (RCC_APB2RSTR)

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

APB1 外设复位寄存器 (RCC_APB1RSTR)

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

AHB外设时钟使能寄存器 (RCC_AHBENR)

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

APB2 外设时钟使能寄存器(RCC_APB2ENR)

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

APB1 外设时钟使能寄存器(RCC_APB1ENR)

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

备份域控制寄存器 (RCC_BDCR)

在这里插入图片描述

控制/状态寄存器 (RCC_CSR)

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

  1. 实际项目例子
    这是一个项目的时钟初始化代码:
void SystemInit (void)
{/* Reset the RCC clock configuration to the default reset state(for debug purpose) *//* Set HSION bit */RCC->CR |= (uint32_t)0x00000001;/* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#ifndef STM32F10X_CLRCC->CFGR &= (uint32_t)0xF8FF0000;
#elseRCC->CFGR &= (uint32_t)0xF0FF0000;
#endif /* STM32F10X_CL */   /* Reset HSEON, CSSON and PLLON bits */RCC->CR &= (uint32_t)0xFEF6FFFF;/* Reset HSEBYP bit */RCC->CR &= (uint32_t)0xFFFBFFFF;/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */RCC->CFGR &= (uint32_t)0xFF80FFFF;#ifdef STM32F10X_CL/* Reset PLL2ON and PLL3ON bits */RCC->CR &= (uint32_t)0xEBFFFFFF;/* Disable all interrupts and clear pending bits  */RCC->CIR = 0x00FF0000;/* Reset CFGR2 register */RCC->CFGR2 = 0x00000000;
#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)/* Disable all interrupts and clear pending bits  */RCC->CIR = 0x009F0000;/* Reset CFGR2 register */RCC->CFGR2 = 0x00000000;      
#else/* Disable all interrupts and clear pending bits  */RCC->CIR = 0x009F0000;
#endif /* STM32F10X_CL */#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)#ifdef DATA_IN_ExtSRAMSystemInit_ExtMemCtl(); #endif /* DATA_IN_ExtSRAM */
#endif /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers *//* Configure the Flash Latency cycles and enable prefetch buffer */SetSysClock();#ifdef VECT_TAB_SRAMSCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#elseSCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif 
}

下面是对每一句代码的详细解释:

void SystemInit (void)
{/* Reset the RCC clock configuration to the default reset state(for debug purpose) *//* Set HSION bit */RCC->CR |= (uint32_t)0x00000001;

该语句将RCC寄存器的CR(控制)寄存器的最低位(HSION位)设置为1,以启用内部高速时钟(HSI)。

  /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#ifndef STM32F10X_CLRCC->CFGR &= (uint32_t)0xF8FF0000;
#elseRCC->CFGR &= (uint32_t)0xF0FF0000;
#endif /* STM32F10X_CL */   

根据条件编译的指令,这段代码将RCC寄存器的CFGR(配置)寄存器的特定位设置为默认值。具体来说,它重置了SW(系统时钟选择)、HPREAHB预分频因子)、PPRE1APB1预分频因子)、PPRE2APB2预分频因子)、ADCPREADC预分频因子)和MCO(主时钟输出)的位。具体要设置的位与条件编译的指令相关。

  /* Reset HSEON, CSSON and PLLON bits */RCC->CR &= (uint32_t)0xFEF6FFFF;

该语句通过将RCC寄存器的CR寄存器的HSEON位(外部高速时钟使能)、CSSON位(时钟安全系统使能)和PLLON位(锁相环使能)设置为0来重置这些位。

  /* Reset HSEBYP bit */RCC->CR &= (uint32_t)0xFFFBFFFF;

该语句通过将RCC寄存器的CR寄存器的HSEBYP位(外部高速时钟旁路)设置为0来重置该位。

  /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */RCC->CFGR &= (uint32_t)0xFF80FFFF;

该语句通过将RCC寄存器的CFGR寄存器的PLLSRC位(PLL时钟源选择)、PLLXTPRE位(外部高速时钟预分频因子)、PLLMUL位(锁相环倍频因子)和USBPRE/OTGFSPRE位(USB OTG FS/SDIO时钟预分频因子)设置为默认值,来重置这些位。

#ifdef STM32F10X_CL/* Reset PLL2ON and PLL3ON bits */RCC->CR &= (uint32_t)0xEBFFFFFF;/* Disable all interrupts and clear pending bits  */RCC->CIR = 0x00FF0000;/* Reset CFGR2 register */RCC->CFGR2 = 0x00000000;
#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)/* Disable all interrupts and clear pending bits  */RCC->CIR = 0x009F0000;/* Reset CFGR2 register */RCC->CFGR2 = 0x00000000;      
#else/* Disable all interrupts and clear pending bits  */RCC->CIR = 0x009F0000;
#endif /* STM32F10X_CL */

这一部分是根据条件编译的指令,在不同的芯片型号中进行处理。对于某些特定的型号,例如STM32F10X_CL,该代码将RCC寄存器的CR寄存器的PLL2ON位和PLL3ON位设置为0。对于其他型号,该代码将RCC寄存器的CIR(中断使能)寄存器设置为0x00FF0000,并将RCC寄存器的CFGR2(配置2)寄存器设置为0x00000000

#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)#ifdef DATA_IN_ExtSRAMSystemInit_ExtMemCtl(); #endif /* DATA_IN_ExtSRAM */
#endif 

这部分代码根据条件编译的指令,在某些特定的芯片型号中进行处理。如果定义了宏STM32F10X_HDSTM32F10X_XLSTM32F10X_HD_VL,并且定义了宏DATA_IN_ExtSRAM,将调用SystemInit_ExtMemCtl()函数。这段代码用于初始化外部SRAM控制器。

  /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers *//* Configure the Flash Latency cycles and enable prefetch buffer */SetSysClock();

这行代码调用SetSysClock()函数,用于配置系统时钟频率、HCLKPCLK2PCLK1的预分频器,并设置Flash的延迟周期和预取缓冲器。

#ifdef VECT_TAB_SRAMSCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#elseSCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif 

这段代码根据条件编译的指令,将向量表(存储中断向量的表格)的偏移地址设置到系统内部的SRAM或闪存中。根据定义的宏VECT_TAB_SRAM,选择将向量表重定位到内部SRAMSRAM_BASE)加上偏移地址(VECT_TAB_OFFSET),或者重定位到内部闪存(FLASH_BASE)加上偏移地址(VECT_TAB_OFFSET)。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.7 完善自定位ShellCode后门

在之前的文章中,我们实现了一个正向的匿名管道ShellCode后门,为了保证文章的简洁易懂并没有增加针对调用函数的动态定位功能,此类方法在更换系统后则由于地址变化导致我们的后门无法正常使用,接下来将实现通过PEB获取GetProcAddre…

github上传超过100M的大文件

当上传的工程中有超过100M的文件时,直接上传github会产生如下报错: remote: error: File retinaface-R50/R50-0000.params is 112.54 MB; this exceeds GitHubs file size limit of 100.00 MB! [remote rejected] master -> master (pre-receive ho…

2023年07月数据库流行度最新排名

点击查看最新数据库流行度最新排名(每月更新) 2023年07月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多,这个数据库就被认为越受欢迎。这是一个领先指标。原始数…

软件设计模式与体系结构-设计模式-结构型软件设计模式-桥接模式

四、桥接模式 桥接模式(Bridge Pattern)是一种软件设计模式,它用于将抽象部分与其具体实现部分解耦,使它们可以独立地变化。桥接模式的核心思想是将一个系统分为多个维度,并通过桥接连接这些维度,从而实现…

登录远程Linux桌面

远程桌面连接主要使用两种协议,一种是Windows上RDP协议,第二种是VNC协议,从使用效果来看,vnc更优秀。 一、VNC 使用x11vnc 1.安装x11vnc sudo apt install x11vnc 2.启动x11vnc x11vnc -passwd orangepi -display :0 -forever…

linux 时间同步 chrony

Chrony介绍 chrony 是基于NPT协议的实现时间同步服务,它既可以当做服务端,也可以充当客户端。chrony是ntp的代替品,能更精确的时间和更快的速度同步时钟,chrony 占用系统资源少,只有被唤起时才占用少部分CPU&#xff0…

云原生|kubernetes|centos7下离线化部署kubesphere-3.3.2---基于kubernetes-1.22.16(从网络插件开始记录)

前言: kubesphere的离线化部署指的是通过自己搭建的harbor私有仓库拉取镜像,完全不依赖于外部网络的方式部署。 我的kubernetes集群是一个单master节点,双工作节点,总计三个节点的版本为1.22.16的集群。 该集群只是初始化完成了…

详解DNS协议!

前言 想要不同的计算机之间进行通信,是需要知道对方的IP的,可是为什么我们平时很少用到ip,而是用到域名这种东西呢? 其实主要是为了方便阅读,让我们记住一串的ip还不如记域名来的方便。 当我们访问域名的时候&#xf…

C 学习笔记1-基础语法合集

C 基础语法 文章目录 C 基础语法注意 C 其他知识点编译过程编译器数据模型区别32/64位机器中,各数据类型所占位数assert() 断言(宏)用法总结与注意事项 C 函数printf()putchar()sizeof() C 位域位域声明位域的定义和位域变量的说明位域的使用…

微信小程序实现抖音视频效果

当我们进行开发的时候可能会遇到需要实现抖音视频效果的需求,并且网上该效果的开源代码少,找到的开源代码代码量大,很难进行二次开发 对此我将自己的代码进行简化,仅留下可动性高的代码模块 以上是实现效果与此处demo的模板 wx…

window debug ios webview

业务需求 在window上想要debug在ios的应用中的webview页面,毕竟页面是在安卓端和ios端都有webview的。安卓的页面使用edge的edge://inspect/#devices,手机开启调试模式就可以了。对于ios就没有办法,页面中已经使用了vconsole可以看到部分的信…

PLC与工业机器人

PLC和工业机器人是在工业自动化领域中常用的技术。它们在不同的应用场景中具有不同的优势和用途。 PLC是一种用于控制和监控生产过程的计算机控制系统。它具有可编程性和灵活性,能够适应不同的控制需求。PLC通常用于控制生产线、工厂设备以及自动化工艺&#xff0c…