当前位置: 首页 > news >正文

野火霸天虎 STM32F407 学习笔记(六)系统时钟详解

STM32 中级

前言

仍然是学习自野火F407网课。

启动文件详解

作用:

  1. 初始化堆栈指针 SP=_initial_sp
  2. 初始化 PC 指针 =Reset_Handler
  3. 初始化中断向量表
  4. 配置系统时钟
  5. 调用 C 库函数 _main 初始化用户堆栈,从而最终调用 main 函数去到 C 的世界

栈:局部变量,函数定义,函数形参等。

Stack_Size      EQU     0x00000400	; 设置栈大小,EQU 相当于宏定义AREA    STACK, NOINIT, READWRITE, ALIGN=3	; AREA 用于定义新代码段,数据段。这里定义了一个段叫 STACK,不初始化,可读可写,按3字节对齐
Stack_Mem       SPACE   Stack_Size	; 分配内存空间
__initial_sp	; 初始化堆栈,指向栈底(高地址)

栈的大小不能超过内部 SRAM 的大小。如果编写的程序比较大,定义的局部变量很多,那么就需要修改栈的大小。如果某一天,你写的程序出现了莫名奇怪的错误,并进入了硬 fault 的时候,这时你就要考虑下是不是栈不够大,溢出了。

堆:动态分配的,需要的空间就比栈小一些。

Heap_Size       EQU     0x00000200AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limitPRESERVE8	; 堆栈按8字节对齐THUMB		; 标明后面指令为 THUMB 指令

向量表:32位的整形数组,包含许多异常 ESR 的入口地址。

; Vector Table Mapped to Address 0 at ResetAREA    RESET, DATA, READONLYEXPORT  __VectorsEXPORT  __Vectors_EndEXPORT  __Vectors_Size; 后跟向量表

1699545880919

程序一开始从 Reset 开始。

; Reset handler
Reset_Handler    PROCEXPORT  Reset_Handler             [WEAK]	; WEAK 是弱定义,意思是如果外部文件也定义了 Reset_Handler 则优先使用外部文件的。所以我们自己定义中断函数的时候就会覆盖。不过其实这里面大多数 Handler 只是空函数IMPORT  SystemInitIMPORT  __mainLDR     R0, =SystemInit	; 初始化系统时钟BLX     R0LDR     R0, =__main		; 这个并不是我们自己写的 main 函数,而是c库中的函数,需要勾选 use microLib 引入。初始化一些局部变量,且跳转到我们的 main 函数BX      R0ENDP

系统时钟详解

前面介绍过在 SystemInit 里对系统时钟进行了配置,这节课主要是分析其具体原理。

我们需要选择系统时钟的时钟源,并且把系统时钟作为一些外设的时钟使用。

野火教程图片示例如下:

1699683387373

时钟源选择

我自己的流程图如下,系统时钟的时钟源选择:

SysCLK系统时钟
锁相环
时钟信号
HSI高速内部时钟
HSE高速外部时钟

HSE:外部高速时钟信号。

HSI:高速内部时钟。一般常用的还是 HSE,精度更高,HSI 一般用于 HSE 故障时临时启动直至 HSE 启动成功。

PLL:锁相环,对时钟信号倍频。图中 HSE 分频后/MN/P 得到 PLLCLK。为什么不直接把晶振做的频率很高,而是用锁相环倍频?因为高频晶振更容易被外界干扰影响。*

首先对于锁相环部分时钟,我们从晶振输入(需要使能 HSE),分频,锁相环倍频,得到 PLLCLK 锁相环时钟。

然后SysCLK 系统时钟的时钟源,我们可以选择 HSI HSE SysCLK,这里我们选择 SysCLK。

1699684042463

RCC_CR 高16位配置 HSE,低位配置 HSI。

RCC_CR 最后一位 ON 用于启用时钟,RCC_CFGR 中的 SW01 用于选择 HSI HSE PLL。

1699706132078

锁相环

锁相环相比直接用 HSI HSE 作为时钟源,优势在于可以倍频。

PLLSRC 选择锁相环的时钟源是 HSE 还是 HSI。

1699706859478

PLLM 分频因子,PLLN 倍频因子,PLLP 又是一个分频。P 是系统时钟用,Q 是一些外设比如 USB OTG 用,R 在 407 中没有使用。

我们开发板配置是 SYSCLK = 25MHz / M:25 * N:336 / P:2=168MHz ,也可以改变分频因子值,168 是最大值。

外设时钟配置

AHB 预分频器:分频之后得到 AHB 总线时钟。AHB 为外设,定时器,内核提供时钟。

APB 预分频器:在 AHB 预分频后进一步预分频。APB 为 APB 上的外设提供时钟。

RCC_CFGR 中 HPRE,PPRE12 代表 AHB1,APB12 的分频选择。

RTC:为芯片内部的 RTC 提供时钟,时钟源可以是 HSE LSE LSI。

看门狗:LSI 提供。

MCO:时钟可以作为输出。比如外接一个摄像头,可以用 MCU 内的时钟。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

I2S:音频信号。可由外部时钟或 PLL 提供。

以太网 PHY:开发板上没有 PHY 物理接口收发器芯片,因此由外部源作时钟。

http://www.lryc.cn/news/247398.html

相关文章:

  • uni-app+vue3 封装全局函数(详细完整的方法)
  • 游戏开发原画的设计方法
  • 力扣labuladong一刷day19天花式遍历
  • 自动化部署 扩容openGauss —— Ansible for openGauss
  • C#多线程创建及线程的同步
  • MOM系统功能清单
  • ARM Cortex-M核的内核态,用户态
  • flex布局实战之自动填充剩余
  • 【LeetCode】203. 移除链表元素
  • IDEA2023版本创建Sping项目只能勾选17和21,却无法使用Java8?(已解决)
  • Vue生命周期详解
  • 政务大数据与资源平台建设解决方案:PPT全文75页,附下载
  • 环境监测传感器守护我们的地球
  • PHP 循环控制 学习资料
  • Unity 关于生命周期函数的一些认识
  • 大数据学习(26)-spark核心总结
  • EC 404 information economics
  • 基于单片机的烟雾检测报警装置(论文+源码)
  • C语言面试之旅:掌握基础,探索深度(面试实战之c语言关键词中篇)
  • 项目监控:项目跟踪和控制的工具和步骤
  • GOAT:多模态、终身学习、平台无关的机器人通用导航系统
  • [webpack] webpack 插件大全
  • UE4/UE5 雾
  • Linux处理文件常见命令
  • sed应用
  • Linux配置SFTP用户的详细过程
  • 前端---JavaScript篇
  • 使用vue-admin-template时,需要注意的问题,包括一定要去除mock.js注释
  • 力扣hot100 最大子数组和 动态规划 分治 无后效性 子问题划分
  • C语言--每日选择题--Day28