城市直播房产教育博客汽车
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

CortexM启动流程详解(GCC)

12月24日 桃花醉投稿
  开发环境:
  处理器:STM32F103
  GCC:10。3。1
  对于我们常用的桌面操作系统而言,我们在开发应用时,并不关心系统的初始化,绝大多数应用程序是在操作系统运行后才开始运行的,操作系统已经提供了一个合适的运行环境,然而对于嵌入式设备而言,在设备上电后,所有的一切都需要由开发者来设置,这里处理器是没有堆栈,没有中断,更没有外围设备,这些工作是需要软件来指定的,而且不同的CPU类型、不同大小的内存和不同种类的外设,其初始化工作都是不同的。本文将以STMF103(基于CortexM3)为例进行讲解。
  在开始正式讲解之前,你需要了解ARM寄存器、汇编以及反编译相关的知识,这些可以参考笔者博文。
  深入理解ARM寄存器:https:bruceou。blog。csdn。netarticledetails117866186
  ARM汇编入门:https:bruceou。blog。csdn。netarticledetails117897496
  Keil反编译入门(一):https:bruceou。blog。csdn。netarticledetails118314875
  Keil反编译入门(二):https:bruceou。blog。csdn。netarticledetails118400368
  下面我们就来具体看一下用户从Flash启动STM32的过程,主要讲解从上电复位到main函数的过程。主要有以下步骤:
  1。初始化栈顶指针sp,进入C程序需要先设置栈地址,因为是通过函数调用进入C程序,需要用到栈空间。
  2。设置PC指针
  3。将Flash的data段拷贝到RAM中
  4。配置系统时钟
  5。调用C库函数libcinitarray初始化用户堆栈,然后进入main函数。
  在开始讲解之前,我们需要了解STM32的启动模式。1STM32的启动模式
  首先要讲一下STM32的启动模式,因为启动模式决定了向量表的位置,STM32有三种启动模式:
  1)主闪存存储器(MainFlash)启动:从STM32内置的Flash启动(0x080000000x0807FFFF),一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。
  以0x08000000对应的内存为例,则该块内存既可以通过0x00000000操作也可以通过0x08000000操作,且都是操作的同一块内存。
  2)系统存储器(SystemMemory)启动:系统储存器指的是STM32的内置ROM,选择该启动模式后,内置ROM的起始地址将被重映射到0x00000000地址,代码在此处开始运行。ROM中有一段出厂预置的代码,这段代码起到一个桥的作用,允许外部通过UARTCAN或USB等将代码写入STM32的内置Flash中。这段代码也被称为ISP(InSystemPrograming)代码,这种烧录代码的方式也被称为ISP烧录。
  一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的ISP程序中,提供了串口下载程序的固件,可以通过这个ISP程序将用户程序下载到系统的Flash中。
  以0x1FFFFFF0对应的内存为例,则该块内存既可以通过0x00000000操作也可以通过0x1FFFFFF0操作,且都是操作的同一块内存。
  3)片上SRAM启动:从内置SRAM启动(0x200000000x3FFFFFFF),既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。SRAM只能通过0x20000000进行操作,与上述两者不同。从SRAM启动时,需要在应用程序初始化代码中重新设置向量表的位置。该方法是在STM32的内置SRAM中启动,选择该启动模式后,内置SRAM的起始地址将被重映射到0x00000000地址,代码在此处开始运行。这种模式由于烧录程序过程中不需要擦写Flash,因此速度较快,适合调试,但是掉电丢失。
  用户可以通过设置BOOT0和BOOT1的引脚电平状态,来选择复位后的启动模式。如下表所示。
  TableBOOT启动模式
  启动模式只决定程序烧录的位置,加载完程序之后会有一个重映射(映射到0x00000000地址位置);真正产生复位信号的时候,CPU还是从开始位置执行。
  值得注意的是STM32上电复位以后,代码区都是从0x00000000开始的,三种启动模式只是将各自存储空间的地址映射到0x00000000中。2STM32的启动文件分析
  因为启动过程主要是由汇编完成的,因此STM32的启动的大部分内容都是在启动文件里。笔者的启动文件是startupstm32f103xe。s。当然还有一个链接文件,链接文件主要制定了入口函数,堆栈大小和数据段的整体布局。值得注意的是,对于MDK,也有相应的内存管理文件,只是MDK去做这个事情了,也就是sct分段加载。
  启动文件主要有三个部分:定义各个内存地址,ResetHandler函数,中断向量表。
  第32行:指明CPU的类型,这里的CPU核是CortexM。
  第33行:表明浮点运算的类型,CortexM没有硬件FPU单元,因此这里是软件FPU。
  第34行:指定了指令的类型为thumb。
  第41行:data段地址的变量。
  第43行:data段的起始地址。
  第45行:data段的结束地址。
  第47行:bss段的起始地址。
  第49行:bss段的结束地址。
  第6162行:定义新的代码段,并申明为weak函数。
  第63行:将ResetHandler声明为函数。
  第6769行:设置data段、bss段的地址
  第71行:复制data段到RAM中
  以上就是将Flash中的data段复制到RAM的整个过程,另外还有bss段的清零工作。
  接下来就是进入C空间前做的一些准备。
  第98行:初始化系统时钟。
  第100行:初始化lib库
  第102行:跳转main函数。
  最后就是中断向量表的内容。
  以上函数只是weak函数,并没有函数实体,如果外部有中断触发但是没有进入中断函数,会发现代码卡在了DefaultHandler函数里。因为外部没有定义同名函数,则都运行缺省DefaultHandler函数。
  上述向量表可以在《Referencemanual》中找到的,笔者这里只截取了部分。
  Table中断向量表
  startupstm32f103xe。s文件是系统的启动文件,主要包括堆和栈的初始化配置、中断向量表的配置以及将程序引导到main()函数等。
  startupstm32f103xe。s主要完成三个工作:栈和堆的初始化、定位中断向量表、调用ResetHandler。3STM32的启动流程实例分析3。1Bootloader的作用
  根据BOOT引脚确定了启动方式后,处理器进行的第二大步就是开始从0x00000000地址处开始执行代码,而该处存放的代码正是Bootloader。
  Bootloader,也可以叫启动文件,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从复位到开始执行main函数中间这段时间(称为启动过程)所必须进行的工作。最为常见的51,AVR或MSP430等微控制器当然也有对应启动文件,但开发环境往往自动完整地提供了这个启动文件,不需要开发人员再行干预启动过程,只需要从main函数开始进行应用程序的设计即可。同样,STM32微控制器,无论是MDK还是IAR开发环境,ST公司都提供了现成的直接可用的启动文件。
  启动文件中首先会定义堆栈,定义中断异常向量表,而其中只实现了复位的异常处理函数ResetHandler,该函数其主要功能除了初始化时钟,FPU等,还会执行一个重要功能,那就是内存的搬移、初始化操作。
  FigureFlash存储分布
  我们知道烧录的镜像文件中包含只读代码段。text,已初始化数据段。data和未初始化的或者初始化为0的数据段。bss。代码段由于是只读的,所以是可以一直放在Flash中,CPU通过总线去读取代码执行就行,但是。data段和。bss段由于会涉及读写为了,为了更高的读写效率是要一定搬到RAM中执行的,因此Bootloader会执行很重要的一步,就是会在RAM中初始化。data和。bss段,搬移或清空相应内存区域。
  当启动方式选择的是从内置Flash启动的时候,代码依旧是在Flash中执行,而数据则会被拷贝到内部SRAM中,该过程是由Bootloader完成的。Bootloader在完成这些流程之后,就会将代码交给main函数开始执行用户代码。
  有了前面的分析,接下来就来具体看看STM32启动流程的具体内容。3。2初始化SP、PC、向量表
  当系统复位后,处理器首先读取向量表中的前两个字(8个字节),第一个字存入MSP,第二个字为复位向量,也就是程序执行的起始地址。
  Figure初始化向量
  这里通过JFlash打开hex文件。
  FigureHex文件
  硬件这时自动从0x08000000位置处读取数据赋给栈指针SP,然后自动从0x08000004位置处读取数据赋给PC,完成了复位操作,SP0x20010000,PC0x08000D95。
  初始化SP、PC紧接着就初始化向量表,如果感觉看HEX文件抽象,我们看看反汇编文件吧。
  是不是更容易些,是不是和《Referencemanual》中的向量表对应起来了。其实看反汇编文件更好理解STM32的启动流程,只是有些抽象。3。3设置系统时钟
  细心的朋友可能发现,PC0x08000D95的地址是没有对齐的。然后在反汇编文件中却是这样的:
  这里是硬件自动对齐到0x08000D95,并执行SystemInit函数初始化系统时钟。
  接下来就会进入SystemInit函数中。
  SystemInit函数内容如下:briefSetupthemicrocontrollersystemInitializetheEmbeddedFlashInterface,thePLLandupdatetheSystemCoreClockvariable。noteThisfunctionshouldbeusedonlyafterreset。paramNoneretvalNonevoidSystemInit(void){ResettheRCCclockconfigurationtothedefaultresetstate(fordebugpurpose)SetHSIONbitRCCCR0x00000001U;ResetSW,HPRE,PPRE1,PPRE2,ADCPREandMCObitsif!defined(STM32F105xC)!defined(STM32F107xC)RCCCFGR0xF8FF0000U;elseRCCCFGR0xF0FF0000U;endifSTM32F105xCResetHSEON,CSSONandPLLONbitsRCCCR0xFEF6FFFFU;ResetHSEBYPbitRCCCR0xFFFBFFFFU;ResetPLLSRC,PLLXTPRE,PLLMULandUSBPREOTGFSPREbitsRCCCFGR0xFF80FFFFU;ifdefined(STM32F105xC)defined(STM32F107xC)ResetPLL2ONandPLL3ONbitsRCCCR0xEBFFFFFFU;DisableallinterruptsandclearpendingbitsRCCCIR0x00FF0000U;ResetCFGR2registerRCCCFGR20x00000000U;elifdefined(STM32F100xB)defined(STM32F100xE)DisableallinterruptsandclearpendingbitsRCCCIR0x009F0000U;ResetCFGR2registerRCCCFGR20x00000000U;elseDisableallinterruptsandclearpendingbitsRCCCIR0x009F0000U;endifSTM32F105xCifdefined(STM32F100xE)defined(STM32F101xE)defined(STM32F101xG)defined(STM32F103xE)defined(STM32F103xG)ifdefDATAINExtSRAMSystemInitExtMemCtl();endifDATAINExtSRAMendififdefVECTTABSRAMSCBVTORSRAMBASEVECTTABOFFSET;VectorTableRelocationinInternalSRAM。elseSCBVTORFLASHBASEVECTTABOFFSET;VectorTableRelocationinInternalFLASH。endif}
  前面部分是配置时钟的,具体参考手册吧。
  最终PLL的时钟位72MHz。
  这里还需要注意以下代码:ifdefVECTTABSRAMSCBVTORSRAMBASEVECTTABOFFSET;VectorTableRelocationinInternalSRAM。elseSCBVTORFLASHBASEVECTTABOFFSET;VectorTableRelocationinInternalFLASH。endif
  默认是没有开启VECTTABSRAM,则从FLASH中启动,VTOR寄存器存放的是中断向量表的起始地址,在IAP升级会修改这里的偏移量,后面讲解IAP升级在细讲吧。3。4初始化堆栈并进入main
  执行指令blmain,然后就跳转到main函数。
  当然在此之前会初始化libc。
  至此,启动过程到此结束。
  最后,总结下STM32从flash的启动流程。
  MCU上电后从0x08000000处读取栈顶地址并保存,然后从0x08000004读取中断向量表的起始地址,这就是复位程序的入口地址,接着跳转到复位程序入口处,初始向量表,然后设置时钟,设置堆栈,最后跳转到C空间的main函数,即进入用户程序。
搜索 投诉 评论 转载

广厦球星耍大牌!怒怼主帅引发冲突消极比赛闹情绪王博无计可施不管有没有犯规,裁判有没有判罚,球员都应该更多地将注意力放到比赛当中去。最终的目的还是把球打进,赢得比赛。这是此前广厦队在和四川队交手之后,主教练王博在赛后发表的个人总结,由此……陈霄华酒后不轨被刑拘,德云社管理弊病再被推上热搜陈霄华酒后赤裸上身,闯入女孩家中,事后竟一直强调自己喝醉酒,最后被刑拘。此事一出,德云社的弟子管理问题,再次被公众议论,是德云社自己的管理有问题,还是有些人本身就是祸根?提到这……北京重磅发文!试点60岁及以上老人贷款买房,首付最低35!专作为楼市政策风向标的北京,将针对部分老年家庭购房困难问题出台定向放松购房政策引发关注。图片源自图虫创意8月4日,北京市住建委发文称,北京今年在第二批次供地时,已选取……生死教育公益课丨想我的话,就抬头看看星星妈妈,什么是死亡?我死了会去哪里?我不想你死?人能不能不死?。。。。。。当孩子问你这些问题的时候你的感受是什么?第六期的生死教育公益课……给中老年人的建议!50岁以上多吃3样忌2样,身体越来越健康给中老年人的建议,50岁以上,对自己的饮食一定要有所注重,多吃3样忌2样,身体越来越健康,越来越壮。很多中老年人忙碌了大半辈子,退休以后就想着多补充一下营养,多保养身体,总是大……火爆!格林空中拉拽致克拉克倒地被裁判驱逐出场库里不满判罚爆粗北京时间5月2日,202122赛季NBA季后赛继续进行,西部半决赛正式打响。灰熊坐镇主场迎战勇士,双方都想争取夺得西部半决赛开门红,这也使得场上的对抗越来越激烈。比赛第2节,场……惯子如杀子现在尝到恶果了吧认识的一户人家,特别溺爱孩子,是衣来伸手饭来张口。真是要摘天上的星星都能想办法摘下来。七八岁了还出门就要抱,吃饭穿衣都要喂,上幼儿园都是想上就上。不想上就不去。老师也不敢……CortexM启动流程详解(GCC)开发环境:处理器:STM32F103GCC:10。3。1对于我们常用的桌面操作系统而言,我们在开发应用时,并不关心系统的初始化,绝大多数应用程序是在操作系统运……特雷西麦克格雷迪长枪白马飘如诗,将飘逸演绎到极致的1号传奇1997年,阿迪达斯篮球训练营中,一位来自佛罗里达州的17岁少年,在比赛中用出一记折叠大风车技惊四座。随后他被霍普金斯教练带到高中名校,在短短八个月后,他就成了第一高中生……女蛙王的新愿望新华社石家庄1月10日电(记者杨帆)早上五点半,丁继萍就在泳池边了。打开计时器,戴上老花镜,摊开训练日志本,逐个布置队员的训练内容。随着一声响亮的预备、走,队员们先后跃入……威马,危矣?元旦那天,新造车们都欢天喜地发布2022年成绩单,唯独有一家并没有倒闭的新造车在榜单中缺席威马汽车。最近的威马汽车,好消息和坏消息总是结伴出现。在冲击科创板和港交所……李少莉事件调查结果公布前,官媒罕见发声,可能要让你们失望了李少莉事件调查结果公布前,官媒罕见发声,可能要让你们失望了,具体这是什么情况?我们一起来看看吧!李少莉事件回顾。李少莉罕见露面做核酸检测,装扮朴素,轻松自然,看来没啥问题……
引力巨大的太阳,却不会把八大行星吸引过去发生撞击,原因何在?寒毒流扁鹊火了,伤害至少提高70,打团就在补血西藏第一块农田萨日索当想穿越回过去?走封闭类时曲线就行从3299元跌至2199元,骁龙8Gen1120W快充,堪称欧文杜兰特狂虐旧主骑士,西蒙斯将季后赛首秀人体常用的两个长寿穴雷柏V600S双模振动游戏手柄简评无线加入,畅玩游戏罗体罗马和那不勒斯两队球迷未来两个月被禁止赴客场观战世间难免憾事,多少意难平2223赛季NBA常规赛打了超过四分之一,这几位球员依旧保持努力营造科学健康的城市消费文化
南瓜子的功效与作用是什么作为女性时尚先锋的麦当娜,为何在60岁以后,也会有容颜焦虑?女人为何爱穿丁字裤图女性生理期最佳的饮食方案八字测你的婚姻感情如何洪腾智老师简评吴谨言车子被刮误工费是否可以索赔保护动物秦始皇的功过是非早期老年痴呆症吃什么药跑步能治疗脂肪肝吗妈妈的眼睛(经济)国际能源署可再生能源全球装机增量未来五年有望翻番

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁