首页 / 嵌入式实习
#

嵌入式实习

#
43603次浏览 500人互动
此刻你想和大家分享什么
热门 最新
STM32上电复位后如何执行到main函数
当你给STM32开发板通电或者按下复位键的那一刻,STM32内核(通常是Cortex-M系列)立即进入一个确定的状态。硬件复位逻辑强制程序计数器指向一个极其特殊的固定内存地址。对于大多数STM32,这个地址是0x00000000(或者根据BOOT引脚配置映射到其他存储区域的起始地址,例如内部Flash通常是0x08000000)这个地址存放的不是普通指令,而是整个启动流程的第一个关键要素——主堆栈指针的初始值。内核做的第一件事就是读取这个值并初始化MSP寄存器,为后续的函数调用和中断处理建立好堆栈基础。紧接着,内核会读取紧邻的下一个地址(0x00000004)的内容,这个位置存放的是复位向量的地址,也就是复位处理函数的入口点。内核将这个地址加载到程序计数器PC中,至此,硬件自动执行的步骤完成,程序跳转到了软件定义的复位处理函数开始执行。复位处理函数通常由芯片厂商在启动文件中用汇编语言编写(例如startup_stm32fxxxxx.s中的Reset_Handler)。这个函数是启动流程的核心协调者。它的首要任务是调用SystemInit()函数。这个函数由ST的HAL库或标准外设库提供,负责对芯片至关重要的系统级硬件进行初始化。其核心工作包括配置内部时钟源、设置PLL倍频器以将时钟提升到芯片运行所需的高频率、初始化外部高速时钟(如果使用的话)、配置Flash访问等待状态(因为Flash速度通常跟不上内核全速运行)、以及设置关键的系统控制寄存器如SCB->VTOR以正确指向中断向量表的位置。这一步确保了内核和主要总线拥有正确且稳定的时钟信号,是后续所有操作能够正确执行的基础保障。完成关键的时钟和基本系统配置后,启动流程进入一个容易被忽视但极其重要的阶段——由编译器运行时环境负责的数据初始化。复位处理函数接下来会跳转到一个通常名为__main的入口点(这是ARM编译器工具链的约定,其他工具链如GCC可能有类似_start的机制)。__main并非用户编写的main函数,而是编译器提供的库函数。它的核心职责是处理C语言运行环境。这包括:将存储在Flash中的初始化值(.data段)复制到对应的SRAM位置,确保全局变量和静态变量拥有正确的初始值;将未初始化的全局变量和静态变量所在的内存区域(.bss段)清零,防止出现随机值;如果使用了C++,还会执行全局对象的构造函数。这些操作是C/C++程序能够正确运行的前提条件,没有它们,全局变量将处于不确定状态。当所有的底层硬件初始化、运行时环境设置和数据准备就绪后,__main函数最终会调用用户编写的应用程序入口——main()函数,此时进入main函数执行。
点赞 评论 收藏
分享
26届嵌入式实习 简历批改
牛客32965343...:不准和我们双非卷嵌入式
点赞 评论 收藏
分享
头像
2023-04-10 13:31
华南理工大学 自动化
德州仪器2023暑期实习一面面经
pigheadcoo...:4.25更新:已经挂了(悲
投递德州仪器等公司10个岗位
点赞 评论 收藏
分享
02-22 14:09
点赞 评论 收藏
分享
求助!!!为什么投嵌入式实习 都是已读未回
点赞 评论 收藏
分享
2024-05-21 15:20
已编辑
上海大学 产品经理
研二下嵌入式暑期实习挂麻了有大佬看一下嘛
一路l向北:一看就是韦老师的关门大弟子😆
点赞 评论 收藏
分享
玩命加载中
牛客网
牛客网在线编程
牛客网题解
牛客企业服务