STM32启动文件

一、复位顺序

《Cortex M3与M4权威指南》章节4.8 P113

STM32启动文件_第1张图片

译文:

复位之后,在处理器开始执行程序之前,Cortex-M处理器从内存中读取前2个字(即4个字节)。内存空间的开头包含了向量表,向量表中的前2个字是主堆栈指针(MSP)的初始值,以及复位向量,它是复位处理程序的起始地址。处理器读取这两个字后,然后用这些值设置MSP和程序计数器(PC)。

二、启动文件,startup_stm32f40x_41xx.s

1.定义

启动文件由汇编编写,是系统上电复位后第一执行的程序。

2.特征

1)初始化堆栈指针,主要是为 C 语言提供良好的运行环境

2)进行复位处理,执行该 Reset_Handler 函数

3)初始化向量表,异常入口地址列表

4)配置系统的时钟,调用 SystemInit

5)调用 C 库函数__main 进入 main.c 中的 main 函数执行

三、异常向量表

(一)8051

AT89S51 共有 5 个中断源:2 个外部中断、2 个定时器中断、1 个串口中断。

中断源                入口地址         中断号

外部中断 0         0003H                 0

定时器 0             000BH                1

外部中断 1         0013H                 2

定时器 1             001BH                3

串口中断            0023H                 4

STM32启动文件_第2张图片

(二)STM32

1.背景

In most typical applications, this is all you need to do. When the interrupt triggers, the corresponding Interrupt Service Routine (ISR) will execute (you might need to clear the interrupt request from the peripheral within the handler). The name of the ISR can be found inside the vector table inside the startup code, which is also provided by the microcontroller vendor. The name of the ISR needs to match the name used in the vector table so that the linker can place the starting address of the ISR into the vector table correctly.

重点细节:中断服务函数的指定运行,由编译链接阶段已经决定好。

2.分析向量表中0x00000058地址装载的函数地址

1)经过MDK编译完成后,会输出一个Listings/*.map文件,里面存储了以下主要信息:

  • Section Cross References:模块、段(入口)交叉引用;
  • Removing Unused input sections from the image:移除未使用的模块;
  • Image Symbol Table:映射符号表;
  • Memory Map of the image:内存(映射)分布;
  • Image component sizes:存储组成大小。

我们需要重点关注的是“Image Symbol Table”,里面描述了各种符号的映射地址,其中包含了各个函数的地址,通过该文件,可以找到EXTI0_IRQHandler函数地址为0x08000383,如下图。

STM32启动文件_第3张图片

2)使用MDK仿真下载工具访问向量表中0x00000058地址上装载的内容。

STM32启动文件_第4张图片

         通过上图观察到,向量表中0x00000058地址上装载的内容恰恰是EXTI0_IRQHandler函数地址0x08000383。也就是说,在代码的链接阶段,链接器将匹配正确的中断服务函数起始地址放到对应的向量表入口地址中。

3.有效的中断跳转

STM32启动文件_第5张图片

 4.无效的中断跳转

STM32启动文件_第6张图片

WEAK关键字:

表示弱声明,若外部文件没有声明EXTI0_IRQHandler函数,则在编译链接的阶段,链接本汇编起始startup_stm32f40_41xxx.s文件即启动代码中的EXTI0_IRQHandler函数。反之,链接外部文件中的EXTI0_IRQHandler函数。

B .:

等同于一个while(1)循环,作用是捕获有问题的中断。例如中断服务函数名字有误或根本没有编写。当产生中断请求后,则跳转到启动代码中的中断服务函数执行程序,但启动代码中的中断服务函数是空函数,程序又得向下执行,最后被“B .”捕捉到。

你可能感兴趣的:(stm32,嵌入式硬件,单片机)