多语言网站,天津网站设计开发,wordpress小型商城,邵东平台网站建设STM32 中级
前言
仍然是学习自野火F407网课。
启动文件详解
作用#xff1a;
初始化堆栈指针 SP_initial_sp初始化 PC 指针 Reset_Handler初始化中断向量表配置系统时钟调用 C 库函数 _main 初始化用户堆栈#xff0c;从而最终调用 main 函数去到 C 的世界
栈#xff…STM32 中级
前言
仍然是学习自野火F407网课。
启动文件详解
作用
初始化堆栈指针 SP_initial_sp初始化 PC 指针 Reset_Handler初始化中断向量表配置系统时钟调用 C 库函数 _main 初始化用户堆栈从而最终调用 main 函数去到 C 的世界
栈局部变量函数定义函数形参等。
Stack_Size EQU 0x00000400 ; 设置栈大小EQU 相当于宏定义AREA STACK, NOINIT, READWRITE, ALIGN3 ; AREA 用于定义新代码段数据段。这里定义了一个段叫 STACK不初始化可读可写按3字节对齐
Stack_Mem SPACE Stack_Size ; 分配内存空间
__initial_sp ; 初始化堆栈指向栈底高地址栈的大小不能超过内部 SRAM 的大小。如果编写的程序比较大定义的局部变量很多那么就需要修改栈的大小。如果某一天你写的程序出现了莫名奇怪的错误并进入了硬 fault 的时候这时你就要考虑下是不是栈不够大溢出了。 堆动态分配的需要的空间就比栈小一些。
Heap_Size EQU 0x00000200AREA HEAP, NOINIT, READWRITE, ALIGN3
__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; 后跟向量表程序一开始从 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 里对系统时钟进行了配置这节课主要是分析其具体原理。
我们需要选择系统时钟的时钟源并且把系统时钟作为一些外设的时钟使用。
野火教程图片示例如下 时钟源选择
我自己的流程图如下系统时钟的时钟源选择 #mermaid-svg-4Y8Z5MUJQI6MIrPg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .error-icon{fill:#552222;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .marker.cross{stroke:#333333;}#mermaid-svg-4Y8Z5MUJQI6MIrPg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .cluster-label text{fill:#333;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .cluster-label span{color:#333;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .label text,#mermaid-svg-4Y8Z5MUJQI6MIrPg span{fill:#333;color:#333;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .node rect,#mermaid-svg-4Y8Z5MUJQI6MIrPg .node circle,#mermaid-svg-4Y8Z5MUJQI6MIrPg .node ellipse,#mermaid-svg-4Y8Z5MUJQI6MIrPg .node polygon,#mermaid-svg-4Y8Z5MUJQI6MIrPg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .node .label{text-align:center;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .node.clickable{cursor:pointer;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .arrowheadPath{fill:#333333;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .cluster text{fill:#333;}#mermaid-svg-4Y8Z5MUJQI6MIrPg .cluster span{color:#333;}#mermaid-svg-4Y8Z5MUJQI6MIrPg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-4Y8Z5MUJQI6MIrPg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SysCLK系统时钟 锁相环 时钟信号 HSI高速内部时钟 HSE高速外部时钟 HSE外部高速时钟信号。
HSI高速内部时钟。一般常用的还是 HSE精度更高HSI 一般用于 HSE 故障时临时启动直至 HSE 启动成功。
PLL锁相环对时钟信号倍频。图中 HSE 分频后/MN/P 得到 PLLCLK。为什么不直接把晶振做的频率很高而是用锁相环倍频因为高频晶振更容易被外界干扰影响。*
首先对于锁相环部分时钟我们从晶振输入需要使能 HSE分频锁相环倍频得到 PLLCLK 锁相环时钟。
然后SysCLK 系统时钟的时钟源我们可以选择 HSI HSE SysCLK这里我们选择 SysCLK。 RCC_CR 高16位配置 HSE低位配置 HSI。
RCC_CR 最后一位 ON 用于启用时钟RCC_CFGR 中的 SW01 用于选择 HSI HSE PLL。 锁相环
锁相环相比直接用 HSI HSE 作为时钟源优势在于可以倍频。
PLLSRC 选择锁相环的时钟源是 HSE 还是 HSI。 PLLM 分频因子PLLN 倍频因子PLLP 又是一个分频。P 是系统时钟用Q 是一些外设比如 USB OTG 用R 在 407 中没有使用。
我们开发板配置是 SYSCLK 25MHz / M:25 * N:336 / P:2168MHz 也可以改变分频因子值168 是最大值。
外设时钟配置
AHB 预分频器分频之后得到 AHB 总线时钟。AHB 为外设定时器内核提供时钟。
APB 预分频器在 AHB 预分频后进一步预分频。APB 为 APB 上的外设提供时钟。
RCC_CFGR 中 HPREPPRE12 代表 AHB1APB12 的分频选择。
RTC为芯片内部的 RTC 提供时钟时钟源可以是 HSE LSE LSI。
看门狗LSI 提供。
MCO时钟可以作为输出。比如外接一个摄像头可以用 MCU 内的时钟。 I2S音频信号。可由外部时钟或 PLL 提供。
以太网 PHY开发板上没有 PHY 物理接口收发器芯片因此由外部源作时钟。