首页 > 其他分享 >以STM32为例的MCU启动过程

以STM32为例的MCU启动过程

时间:2024-11-23 16:25:40浏览次数:9  
标签:r4 为例 SRAM Flash r3 STM32 地址 MCU data

以STM32为例的MCU启动过程

在面试的时候,好多位面试官问过这个问题,即从上电后,到第一行main函数语句的执行,软件部分都在做什么。这次看了微控制器是如何启动的? |STM32 为例演示微控制器的启动这个视频后,觉得很好,顺便整理下。

0x00000004 Reset Handler

处理器复位时,从中断向量表0x00000004位置读取Reset Handler的入口。
初始化SP,并且获取Reset Handler的入口地址,判断当前的Boot配置。如果0x1F开头则代表是SRAM引导或Bootloader引导;如果是0x08开头则代表是从Flash引导。如果从Flash里面引导,则执行ApplicationStart
image

alt text

C Runtime Init

简单来说,就是将Flash里.data段拷贝到SRAM中,.bss段的内容在RAM内初始化。

  1. 初始化地址寄存器
ldr r0, =sdata      ; 将 .data 段的起始地址(SRAM 中)加载到 R0 中
ldr r1, =edata      ; 将 .data 段的结束地址加载到 R1 中
ldr r2, =sidata     ; 将 .data 段在 Flash 中的起始地址加载到 R2 中
movs r3, #0         ; 初始化偏移量 R3 为 0

R0:SRAM 中 .data 段的起始地址。
R1:SRAM 中 .data 段的结束地址。
R2:Flash 中 .data 段初始值的起始地址。
R3:用于指示当前处理的数据块的偏移。

  1. 数据拷贝主循环
b LoopCopyDataInit  ; 跳转到循环条件检查
在进入拷贝主循环前,先跳转到循环条件检查部分。
  1. 数据拷贝过程
CopyDataInit:
ldr r4, [r2, r3]    ; 从 Flash 的 sidata 段中加载一个 4 字节值到 R4
str r4, [r0, r3]    ; 将 R4 的值存入 SRAM 的 .data 段
adds r3, r3, #4     ; 偏移量增加 4 字节(指向下一个数据单元)

从 Flash 中 .data 段的初始值区域读取一个数据单元(4 字节)。
将该数据单元写入到 SRAM 中对应的 .data 段。
偏移量加 4,准备处理下一个数据单元。

  1. 循环条件检查
LoopCopyDataInit:
adds r4, r0, r3     ; 将当前拷贝目标地址 (R0 + R3) 存入 R4
cmp r4, r1          ; 比较目标地址是否到达 .data 段的结束地址
bcc CopyDataInit    ; 如果目标地址小于结束地址,则继续拷贝

adds r4, r0, r3:当前的拷贝目标地址 = 起始地址 + 偏移量。
cmp r4, r1:判断当前目标地址是否已经超出 .data 段的结束地址。
bcc CopyDataInit(Branch if Carry Clear):如果目标地址尚未到达结束地址,继续拷贝。

SystemInit

跳转到该函数,做时钟等外设或其他配置的初始化。

void SystemInit(void)
{
  /* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif

#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
  SystemInit_ExtMemCtl(); 
#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */

  /* Configure the Vector Table location -------------------------------------*/
#if defined(USER_VECT_TAB_ADDRESS)
  SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#endif /* USER_VECT_TAB_ADDRESS */
}

libc_init_array

调用构造函数,主要与C++相关。

main

跳转到main函数的第一行,开始执行用户代码。

Flash和RAM之间的相关内容

标签:r4,为例,SRAM,Flash,r3,STM32,地址,MCU,data
From: https://www.cnblogs.com/68786C/p/18564684

相关文章

  • 分析电平转换电路导致MCU通讯速率受限的原因
    一、问题背景与电平转换电路的重要性在现代嵌入式系统中,微控制单元(MCU)与其他模块之间的通信速率是关键的性能指标之一。在多种接口通信中,尤其是当不同电平标准的设备进行连接时,电平转换电路成为确保信号正确传输的核心部分。然而,当电平转换电路不匹配时,可能会导致通讯速率......
  • 测试stm32串口发送数据在不同条件下的效率
    一、测试不同波特率测试代码:while(1){ LED1_ON(); bsp_uart_Printf("这是一个测试程序%d\r\n",num); LED1_OFF(); bsp_uart_Printf("这是一个测试程序%d\r\n",num); num++;}voidbsp_uart_Printf(char*format,...){ va_listarg; v......
  • CLion中使用add_subdirectory()模块化管理Stm32项目
    背景文章目录背景配置参考源码在Clion中使用STM32的时候,通常把自己开发的内容写在User目录中,然而需要将User目录下的源文件和头文件都添加到生成的CMakeLits.txt中。对于不同风格的库,直接在生成的CMakeLists.txt中添加资源会显得有些乱,可以使用cmake的**子目录(s......
  • STM32CubeMX下载芯片固件库失败
    1.错误截图使用STM32CubeMX下载STM32H7R固件失败如下所示:Forunavailablefiles,youcandownloadthemmanuallywiththe"FromLocalbutton"实际图片如下所示出现这个问题的时候,STM32CubeMX的软件重新卸载和安装过,但是均无效。网络也更换过,也无效,所以只有通过错误的......
  • 【芯智雲城】一文看懂Puya普冉半导体PY32系列MCU如何选型
    普冉PY32系列MCU普冉PY32系列32位微控制器基于Arm®Cortex®-M处理器,包括M0+和M4系列产品。集高性能、实时操作、数字信号处理、低功耗性能、高性价比等特性于一身,同时还保持了系统简单、易于开发的特点,适用于消费类、工业类等多领域应用开发。普冉股份通用MCU产品采用M0及......
  • STM32第15章 RCC-使用HSE/HSI配置时钟
    时间:2024.10.21-10.23参考资料:《零死角玩转STM32》“RCC-使用HSE/HIS配置时钟”章节TIPS:从前面的历程中我们知道,程序在启动的时候会执行汇编文件,汇编文件里会调用System_Init(固件库编程的函数),它里面会把时钟初始化成72M,因此前面我们在用固件库写程序的时候,有关时钟这一部......
  • HL7协议简介及其在STM32上的解析实现
            近期完成一个医疗相关的项目,其中包括了体征监测设备,该设备使用的通信协议便是HL7V2.4协议,在医疗信息化领域,HL7(HealthLevelSeven)协议扮演着至关重要的角色。它是一种国际标准,用于定义医疗机构间以及医疗设备与信息系统之间的数据交换格式和通信协议。HL7标......
  • 红外对射传感器计次(江科大stm32学习笔记)
    本篇文章主要完成红外对射传感器计次的案例,为江科大stm32学习后的笔记记录。硬件方面如图所示为本次使用的红外对射传感器,根据相关说明书可知:模块槽中无遮挡时,接收管导通,模块DO输出低电平,遮挡时,DO输出高电平;且有输出状态指示灯,输出高电平灯灭,输出低电平灯亮。如图所示,①......
  • 【芯智雲城】基于博流MCU的智能门锁解决方案
    一、方案描述芯联的智能门锁解决方案,采用博流MCU和超低功耗BLE,秒开的半导体指纹识别模块,与目前市面上的13.56MHzA/B卡,可以实现钥匙、密码、IC卡、指纹、微信小程序等多种开锁方式,将解决智能门锁产品的诸多痛点和问题,为用户提供无缝、金融级安全的产品体验。二、方案展示......
  • 解决一下、在学习江协科技stm32f103开发板操作寄存器无法点亮小灯,但是可以正常熄灭遇
    目录 本人问题:目前搜集网上有关信息有两种解决方案: 本人问题:问题:学习江协科技用操作寄存器的方式进行点亮小灯,代码正确,但是点亮小灯无法点亮,需要重新拔下来下载器再插入电脑USB口才可以点亮。但是熄灭小灯可以正常实现。本人代码:点亮:#include"stm32f10x.h"......