一、发动文件的效果是:
1.初始化仓库指针SP;
2.初始化程序计数器指针PC;
3.设置堆、栈的巨细;
4.设置反常向量表的进口地址;
5.装备外部SRAM作为数据存储器(这个由用户装备,一般的开发板可没
有外部SRAM);
6.设置C库的分支进口__main(终究用来调用main函数);
7.在3.5版的发动文件还调用了在system_stm32f10x.c文件中的
SystemInit()函数装备体系时钟,在旧版本的工程中要用户进入
main函数自己调用SystemInit()函数。
至此能够总结一下STM32的发动文件和发动进程。首要对栈和堆的巨细进行界说,并在代码区的开端处树立中止向量表,其第一个表项是栈顶地址,第二个表项是复位中止服务进口地址。然后在复位中止服务程序中跳转??C++/C++规范实时库的__main函数,完结用户仓库等的初始化后,跳转.c文件中的main函数开端履行C程序。假定STM32被设置为从内部FLASH发动(这也是最常见的一种状况),中止向量表开端位置为0x8000000,则栈顶地址存放于0x8000000处,而复位中止服务进口地址存放于0x8000004处。当STM32遇到复位信号后,则从0x80000004处取出复位中止服务进口地址,继而履行复位中止服务程序,然后跳转__main函数,最终进入main函数,来到C的国际。
二、bootloader文件的效果。
1、能够参阅《嵌入式体系bootloader技能内情》
链接:http://blog.csdn.net/phunxm/arTIcle/details/6897541
bootloader 分为boot 和loader,更多的时分是针对于linux体系,windows体系里的bios也是这个功用。便是boot 的功用是初始化仓库、中止向量表等参数,loader便是跳转到main函数里,加载用户程序。从这个层面来了解的话,其实STM32的发动文件就适当所以一个bootloader程序。
2、在做STM32在线晋级的时分,常常能够听到要自己写一个bootloader程序。这个就很简单形成误解,比方,晋级的时分要写bootloader程序,那不晋级的时分,bootloader莫非就不需求了吗?假如需求是在哪一个文件中,完结这个功用的呢?
其实,在IAP的时分,咱们写的仅仅适当于一个跳转并下载的功用的程序,这个程序完结的便是IAP的功用,或许说是软的IAP功用。这个不是bootloader。在iap程序里,咱们是用C言语完结的,也仅仅一个main函数,里边可能会依据需求有定时器、串口、led驱动等功用。可是真实开端履行这个main函数,仍是由发动文件完结,也便是bootloader完结。
三、51单片机为什么没听说bootloader
四、STM32的发动方法
STM32的发动挑选,经过设置BOOT1、BOOT0的引脚的凹凸电平即可挑选。
其间主闪存发动是将程序下载到内置的Flash进行发动(该flash可运转程序),该程序能够掉电保存,下次开机可主动发动;
体系存储器发动是将程序写入到一快特定的区域,一般由厂家直接写入,不能被随意更改或擦除。Boot0设置为1,Boot1设置为0,代码将从ROM区发动,这上电发动都会运转Bootloader,在此进程中能够完结IAP程序更新,这一般是经过USART 进行更新,此刻假如USART或许是SPI端口没有接收到数据信号,那么MCU将会一向程序等候下去,不会主动跳到FLash主代码区。所以一般这作为个别产品想完结代码更新的作业。这需求你那儿是否要考虑今后产品晋级,如若晋级,能够在Boot0引脚接入一个拔码开关完结对Boot0电平的操控,然后能够完结 IAP更新功用。
内置SRAM发动,因为SRAM掉电丢掉,不能保存程序,一般只用于程序的调试。
五、STM32发动进程
STM32的内部闪存(FLASH)地址开端于0x08000000,一般状况下,程序文件就从此地
址开端写入。此外STM32是依据Cortex-M3内核的微操控器,其内部经过一张“中止向量表”来呼应中止,程序发动后,将首要从“中止向量表”取出复位中止向量履行复位中止程序完结发动,而这张“中止向量表”的开端地址是0x08000004(0x8003000的程序中,中止向量表的地址是0x8003000),当中止降临,STM32的内部硬件机制亦会主动将PC指针定位到“中止向量表”处,并依据中止源取出对应的中止向量履行中止服务程序。
在图53.1.1中,STM32在复位后,先从0X08000004地址取出复位中止向量的地址,并跳转到复位中止服务程序,如图标号①所示;在复位中止服务程序履行完之后,会跳转到咱们的main函数,如图标号②所示;而咱们的main函数一般都是一个死循环,在main函数履行进程中,假如收到中止请求(产生重中止),此刻STM32强制将PC指针指回中止向量表处,如图标号③所示;然后,依据中止源进入相应的中止服务程序,如图标号④所示;在履行完中止服务程序今后,程序再次回来main函数履行,如图标号⑤所示。