• 150查看
  • 0回复

[芯片硬件] 单片机启动分析(上)单核单片机的启动

[复制链接]


该用户从未签到

发表于 25-4-2024 19:46:45 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


单片机在启动后,为什么会运行到main函数,这中间经历了什么呢?本篇以ARM内核的S32K1xx来分析单核单片机的启动过程。上电后首先执行复位函数,其实现如下所示。
单片机启动分析(上)单核单片机的启动w1.jpg

Reset_Handler实现
从上图可以看出,进入复位函数后: 1 通过CPSID I汇编指令关闭中断;2 首先初始化通用寄存器(arm寄存器的描述见<<玩转μcos-II(二)之任务切换>>);3 初始化主堆栈指针(sfe是IAR的“段操作符,表示取某个段的后一个字节的地址,所以此时正好指向栈顶);4 然后调用SystemInit执行系统初始化;5 再调用init_data_bss初始化.data和.bss数据段;6 通过CPSIE I打开中断;7 跳到用户的main函数。其中第4步SystemInit函数的实现如下图所示。
单片机启动分析(上)单核单片机的启动w2.jpg

SystemInit的函数实现
可以看出,系统初始化根据配置包括:使能内核浮点运算单元(FPU)和关闭看门狗。而init_data_bss的部分代码如下图所示。
单片机启动分析(上)单核单片机的启动w3.jpg

init_data_bss函数的部分实现
可以看出init_data_bss的主要作用为: 1 将中断向量表从flash拷贝到RAM,并让VTOR(向量表偏移寄存器)指向新的中断向量表; 2 初始化.data段(有初始化值的数据段); 3 初始化.code段; 4 初始化.bss段(未初始化和初始化值为0的段)。
       至此,完成所有初始化,跳到用户的第一个函数main。

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 1-2-2025 07:49 , Processed in 0.283937 second(s), 32 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.