mcu上电(复位)时,从固定的地址启动,一般是地址0x00000000,如arm7;个别特殊的如stm32默认启动地址为0x8000000(flash区启动)。启动过程主要完成两部分工作,一个是硬件执行环境,如中断向量表、寄存器、看门狗等,另一个是软件环境,如c库环境、zi(未初始化的内存变量)等。
一、硬件环境工作
1.初始时钟
初始化内核时钟,主时钟,各个外设的时钟。
2.关闭看门狗
看门狗是用来监控应用程序的异常跑飞而复位cpu,在初始化阶段,由于没有“喂狗”这一动作,有可能导致cpu不断复位,因此,首先会关闭看门狗,初始化完,再开启。
3.建立中断向量表
中断向量表,中断源的识别标志,可用来形成相应的中断服务程序的入口地址,或者中断服务程序入口地址的偏移量和段基值。cpu利用中断向量表转入中断服务程序处理相关事务。
4.初始化堆栈寄存器
堆栈的作用一个就是保存现场(上下文),如函数调用或者中断发送时,将当前执行地址压栈,调用完成再返回此处执行程序。另一个作用就是保存参数,如临时变量。因此,在启动阶段需初始化堆栈寄存器、堆栈的大小、起始地址等。
5.内存初始化
选择内部或者外部ram。
二、软件环境工作
1.把ro,rw从它们的加载域复制到它们的运行域中去。
2.初始化(清零)zi域。
3.初始化堆栈指针
4.初始化c库环境
包括c库所需的内存空间、程序执行所需资源、c库初始化。
三、cortexm3启动
cortexm3有3种启动方式
1、boot1=1boot0=1,中断向量表定位于sram区,即起始地址为0x2000000,同时复位后pc指针位于0x2000000处。
2、boot1=xboot0=0,中断向量表定位于flash区,即起始地址为0x8000000,同时复位后pc指针位于0x8000000处。
3、boot1=0boot0=1,中断向量表定位于内置bootloader区,此时可通过串口下载程序的二进制文件到flash区。
而cortex-m3内核规定,起始地址必须存放堆顶指针,而第二个地址则必须存放复位中断入口向量地址,这样在cortex-m3内核复位后,会自动从起始地址的下一个32位空间取出复位中断入口向量,跳转执行复位中断服务程序。对比arm7/arm9内核,cortex-m3内核则是固定了中断向量表的位置而起始地址是可变化的。即是对于flash启动来说(正常工作也是flash启动),0x8000000地址存放的是栈顶地址__initial_sp,0x8000004地址存放的是复位中断向量reset_handler入口地址(stm32使用32位总线,存储空间为4字节对齐);在编写多段程序时,偏移地址空间需注意,如编写一个bootloader,从bootloader到应用程序段的相互跳转。
关于MATLAB/Simulink技术研讨会—智能自主系统开发分析和介绍
长城最新发布的这款WEY-Pi4-VV7x霸气十足,跨界范不输宝马X6,预售价18万起
华为Mate30系列设计背后的故事
如何实现可穿戴设计的蓝牙连接
荣耀9评测:千机一变,友商们又可以出新颜色啦!胡歌同款奶奶灰,你值得拥有!
一文知道MCU上电复位启动过程
自粘结铁芯对电机能效提升到底有多大影响?
贸泽电子携手Microchip推出全新电子书 探索新一代物联网各类出色应用
扬声器和智能放大器:什么使放大器变得智能?
基于FPGA异步串行通信接口模块设计与实现
对比CYT1000AE,为什么更多人愿意使用这款高压线性恒流icSM2082EGS?
protel上些常用的快捷键
变频控制系统单片机外围电路设计探讨
浅析储能电池多元化技术升级趋势
Xilinx可编程逻辑器件设计与开发(基础篇)连载34:Spartan
教你实现用Python自动玩王者荣耀
苹果新任设计掌门人的上位之路
基于FPGA芯片和RISC在图像驱动中的应用
紧随Apple Pay 三星支付24日将公开测试
【Makefile】C文件包含的头文件修改,但不重新编译?