小弟才开始用stm32不久,现在遇到几个疑惑,关于stm32的启动问题: 1.在用MDK写一些小程序的时候,都会有一个启动文件,这个文件是不是用来配置芯片的中断、内存、还有外设的一些信息的呢?如果是,还有没有一些其他功能,如果不是,那它是做什么的呢。 2.看stm32的启动过程,说需要先取MSP和PC指针,那么是不是PC指针先要指向启动文件存放在存储器中的首地址呢,这个地址是怎么定位的呢? 3.今天又看到一个bootloader,说是可以用来引导操作系统,这个东西功能是不是和启动文件类似呢,它又是怎么烧写到芯片的存储器中的呢? 求大神帮我解惑,让我这个小菜鸟能起飞。 |
1.启动文件是用来声明堆、栈的大小即位置,中断向量函数的声明或定义等内容的。
其中最重要是要指出MSP的值,就是栈顶指针。
再就是PC的值即复位向量的声明和定义,复位向量就是做时钟、RAM、flash等的一些配置、最基本代码的配置,初始化C库并再跳转至用户main函数。具体就是初始化RAM、初始化RAM(包括对全局的、静态的变量等进行初始化,复制一些常量到内存),初始化C库(比如c的初始化、栈等),然后就跳入用户main函数了。
具体可以参考MDK-ARM提供的文档:armlib.chm(见附件)其中的“The C and C++ Library Functions”你可以找到一些更多细节。
2.PC指向的是复位向量(其实就是复位函数,用汇编写的)一般名字是Reset_Handler,Reset_Handler在编译时就确定了地址,然后按照顺序保存在存储器中,上电后,从存储器的逻辑0地址(具体要看地址映射)读取MSP,逻辑1地址读取PC。PC值就是Reset_Handler的地址值,程序跳往Reset_Handler,Reset_Handler做的就是上述第1步中的后面的事情,最后会跳往用户main函数。
3.bootloader和启动文件不是一个概念(区别于平常看到的bootloader--linux等用的较多,而每个厂商对此的解释也不同,需要仔细看手册),具体可以参考《The Definitive Guide to Arm Cortex-M3 and Cortex-M4 Processors》。简单说就是bootloader是厂商(ST)固化在系统存储区域的一段程序,可能包括串口、USB等一个或全部的驱动,用来使用ISP烧录程序用的,用户不会对该区域进行写;最简单的bootloader其实就是包含了板子的串口驱动及对flash进行擦除和写入的算法,到进行ISP的时候,通过PC软件选择好下载算法后进行烧录的,程序文件通过串口进行传输。启动文件是正常上电后,开始用户程序前做配置的一段代码,编程人员可以任意修改,甚至可以胡乱修改,只不过是系统可能起不来罢了,但只要通过ISP下载了正确的程序后,系统仍然可以正常运行。bootloader一般是任意时候都是可以使用的,其系统存储区不会遭到破坏。启动文件可以任意按照不同的意图进行修改。
armlib.chm
2015-7-24 16:32 上传
点击文件名下载附件
下载积分: ST金币 -1396.12 KB, 下载次数: 1, 下载积分: ST金币 -1
这本书很好啊。。。
这本书是好书啊。