(学习日记)2023.04.29

news2024/12/25 2:12:25

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


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


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

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_CL
  RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
  RCC->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_ExtSRAM
    SystemInit_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_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
  SCB->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_CL
  RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
  RCC->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_ExtSRAM
    SystemInit_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_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
  SCB->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.coloradmin.cn/o/697481.html

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

相关文章

从小白到大神之路之学习运维第44天---第三阶段----mysql数据库的主从复制和读写分离

第三阶段基础 时 间:2023年6月28日 参加人:全班人员 内 容: mysql主从复制和读写分离 目录 一、mysql基础 (一)优点: (二)类型: (三)支…

前缀例题(一维二维)

​作者:小妮无语 专栏:暑假基础集训营 🚶‍♀️✌️道阻且长,不要放弃✌️🏃‍♀️ 目录 一维前缀和 二维前缀和 例题1:最大子矩阵 例题2: 激光炸弹 一维前缀和 本题唯一要注意的是数据范…

爬虫工具-替换js文件ReRes插件/Gores插件

目录 一、ReRes插件二、Gores插件 一、ReRes插件 用途:爬虫逆向过程中一些文件需要替换时 ① 原始网站js文件有无限debugger,复制原始网站js文件,删掉无限debugger相关代码保存为新的js文件;用ReRes插件进行替换② 原始网站js文件…

Xcode 14打包flutter 的项目构建失败

升级xcode 后flutter项目构建失败 起因: 升级Xcode 到新的14.3.1版本 错误: showing recent issues command phasescriptexecution failed with a nonzero exit code 这个错误很多情况下都会出现,所以参考价值较低。 解决: …

基于Java+SpringBoot+Mybaties-plus+Vue+ElementUI 企业员工招聘系统的设计与实现

一.项目介绍 招聘系统将为招聘者和求职者构建一个功能齐全、方便快捷的招聘平台,减少双方投入招聘活动的成本,为招聘求职双方带来便利, 系统将实现如下目标: 1.针对系统内的不同角色,系统能够赋予其不同的操作权限。 …

有了HTTP,为什么还要RPC?

很长时间以来都没有怎么好好搞清楚 RPC(即 Remote Procedure Call,远程过程调用)和 HTTP 调用的区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~Naive! 本文简单地介绍一下两种形式的 C/S…

粒子群算法PSO优化VMD,适应度函数为最小样本熵或最小包络熵(可自行选择,代码已集成好,很方便修改)包含MATLAB源代码

近期评论区有小伙伴私信需要粒子群优化算法PSO法化VMD的,所以打算再写一篇。 与上一篇灰狼算法优化VMD相似,这篇文章也是以最小样本熵或最小包络熵为适应度函数的,好的,废话不多说,大家不懂得可以看这篇文章。灰狼优化…

《TCP IP网络编程》

2023.6.28 正式开始学习网络编程。 每一章每一节的笔记都会记录在博客中以便复习。 第1章 1.1理解网络编程和套接字 网络编程又叫套接字编程。所谓网络编程,就是编写程序使两台连网的计算机相互交换数据。 为什么叫套接字编程? 我们平常将插头插入插座上…

QT中把QWidget提升为自定义控件后样式表无效的原因

按照QT帮助手册的描述,当我们继承QWidget写了自己的类以后,必须要覆盖重写painterEvent函数。否则自定义类的样式表就不能生效。 这一点要切记。当你想继承QWidget时,不如直接继承上图的CustomWidget或者QFrame。 换句话说,永远不…

NXP i.MX 8M Mini的视频开发案例分享 (下)

本文主要介绍i.MX 8M Mini的视频开发案例,包含基于GStreamer的视频采集、编解码、算法处理、显示以及存储案例,GigE工业相机测试说明,H.265视频硬件解码功能演示说明等。 注:本案例评估版采用的是创龙科技TLIMX8-EVM,…

真的好用吗?鲜有人提的 RabbitMQ-RPC模式

RabbitMQ系列文章 手把手教你,本地RabbitMQ服务搭建(windows) 消息队列选型——为什么选择RabbitMQ RabbitMQ灵活运用,怎么理解五种消息模型 RabbitMQ 能保证消息可靠性吗 推或拉? RabbitMQ 消费模式该如何选择 死信是…

2023年3季度广州/深圳DAMA-CDGA/CDGP数据治理认证招生

DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业…

【C语言%的多种用法】

C语言%的多种用法 C语言中%号那些事儿1、%之取余运算符的使用2、%之作格式符使用2.1、C语言格式符 3、%之搭配 * 的使用4、%之搭配 # 的使用5、客套话 C语言中%号那些事儿 前言: 众所周知:%百分号,在九年义务教育中,表示分数的分…

图片识别文字怎么做?这几种方法轻松解决

在现代社会,图片已经成为人们日常生活和工作中不可或缺的一部分。但是,由于图片中往往包含了大量的文字信息,如果要手动输入这些文字,不仅费时费力,而且容易出错。因此,将图片中的文字进行识别已经成为我们…

应用打包部署k8s (包括dockerfile打包及仓库上传)

文章目录 一、docker run 运行测试1.数据库测试2.接口测试3.前端界面测试 二、编写dockerfile1.前端2.后端 三、推送镜像(后面k8s就从这里获取镜像了)四.编写 docker-compose.yml五.K8s部署1.yaml文件编写及部署houduan-deployment.yamlhouduan-service.…

【STM32】F103 时钟树

STM32F103是一款基于ARM Cortex-M3内核的32位微控制器,它具有丰富的外设资源和灵活的时钟配置。本文将从以下几个方面介绍STM32F103的时钟树: 时钟树的概念和作用时钟树的组成和分类时钟树的配置方法和步骤时钟树的应用实例 一、时钟树的概念和作用二、时…

如何通过Nacos获取当前服务注册的IP信息

一台机器可能存在多个网卡也就同时存在多个IP地址,如果我想知道我这个服务在向Nacos注册的时候使用的哪一个IP该怎么获取呢? 非常简单,你可以通过这种方式获取 import com.alibaba.cloud.nacos.NacosDiscoveryProperties; import org.springframework.boot.CommandLineRunne…

Angular 调试 —— 一个真实的多重循环导致的Bug

导致性能问题的原因可能很复杂&#xff0c;也可能很简单&#xff0c;今天让我们来看一个现实的例子。一个多重循环导致列表卡死。 startDemo() {this.processing true// 创建复杂数据结构const data [];for (let i 0; i < 5000; i) {const innerArray [];for (let j …

【数据压缩】LZ77算法原理及实现

1. 引言 LZ77算法是采用字典做数据压缩的算法,由以色列的两位大神Jacob Ziv与Abraham Lempel在1977年发表的论文《A Universal Algorithm for Sequential Data Compression》中提出。 基于统计的数据压缩编码,比如Huffman编码,需要得到先验知识——信源的字符频率,然后进…

EasyExcel导出csv文件,用Office Excel打开乱码

1.前言 导出的列里有中文&#xff0c;导出后用Excel打开乱码 2.原因 搜索相关资料&#xff0c;csv和excel的编码不一致&#xff0c;需要在导出csv的时候设置编码GBK 3.验证