1,首先,设备关机的情况下,你按reset s时
![72533563cfec8c061074fd78a4cb079a.png](https://i-blog.csdnimg.cn/blog_migrate/e9331597101174931d07172f53dd7d2f.jpeg)
STM32 NRESET 被拉低。
![6fed15613b8385f0f5b5117f20c918ca.png](https://i-blog.csdnimg.cn/blog_migrate/0108df6bd49368fdf33b20bcdf9fe5db.jpeg)
系统system_reset 就会收到信号,然后STM32 CPU会自动调到系统的异常向量表。
![97220ac9aae2d908f7ff472bf4056435.png](https://i-blog.csdnimg.cn/blog_migrate/6872bfd19fd2ec31123bd222961263aa.jpeg)
这个是纯硬件行为,CPU的PC寄存器直接加载这个向量表+04偏移量的指令。
2,这个指令具体是啥了,默认情况下 这个向量表是在FLASH的最开始的地方,这个位置实际上可以编程更改的,比如把他放到RAM中,然后告诉NVIC 这个向量表放在RAM中也是可以,后面细说。先来看一下连接脚本。
![27f997b6aa4ae12a243accae45d01ee4.png](https://i-blog.csdnimg.cn/blog_migrate/df117fa4b144396ecbda6ecadb558151.jpeg)
图片上, *.isr_vector section 首先放在了flash 的最开始地方,接下来才是我们程序的.Text段。再来看看startup_stm32l475xx.s。
![237b6a5c35dfcd7f10e451b897ad7b81.png](https://i-blog.csdnimg.cn/blog_migrate/cb4798dbf8e856be945795254ccf80f7.jpeg)
vector
这段汇编代码还是比较简单的,.section 指明了g_pfnVector object 放到 .isr_vector 段中,也就是说这个g_pfnVector 的数据放到了flash 最开始的地方。所以按reset时,会跳到第二个.word Reset_handler,仔细看看这个reset _handler 中断处理函数。
![7130fb4c3fd3c0190f77fdd679290408.png](https://i-blog.csdnimg.cn/blog_migrate/62039360336f21a027212c923d92329f.jpeg)
3,reset_handler 分析。
63行,初始化SP,把RAM的结束地址(也就是最大RAM size-1)放到SP寄存器中,栈是向下生长的。
66,把0放到R1。
67, 跳到LoopCopyDataInit 处
75,_stata,_edata,也是在连接脚本中指定的。
![4bed4298e9b4da35f79cec0755f2618b.png](https://i-blog.csdnimg.cn/blog_migrate/c8d5b6cb2a3d34b6c7b00e1179995c29.jpeg)
这个就是编译工具链把把各个程序.data(如全局变量)全放到这.data section 的开始和结束地址之间。比如你一个a.c 文件 一个全局变量int count=1, b.c文件 char []str='stm32'.编译器会把这1,stm32 这些数据全放到.data 中。 我们把程序烧到flash中,程序在执行前,需把这变量部分在ram中先初始化。说白了,汇编69---到82 就是这个事。
84-到91 行 这个也和data 段的数据初始化差不多,也是在RAM中在用0初始它。比如a.c 文件中一个全局变量int result; 这个未初始化。这段代码就用0把它给初始化了,.bss 段的数据在flash是没有存储空间的。连接脚本只记录了一下大小,.sbss/.ebss.分别是这段bss段开始和结束的位置。85,r3 设置为0。86把0写到r2 寄存器指向的内存地址处。
94,96,98行分别调用这个三个C代码写的函数, system_int.c 初始化RCC模块中的时钟,这个阶段目前用MSI(内部高速时钟源)作为系统的时钟。__libc_init_array 这个函数直接是工具链在编译你的程序是用到的外部一些库比如c库,newlib等。最后就是我们的main函数了。
4 启动的汇编代码通常和连接脚本,还是板子的配置都相关联。比如RAM、flash大小。 汇编代码需要初始化C程序的运行环境。