编译工具链(ToolChains)
- 芯片上电以后会触发复位异常
Cortex-M3异常/中断
| 编号 | 类型 | 优先级 | 简介 |
|---|---|---|---|
| 0 | N/A | N/A | 没有异常在运行 |
| 1 | 复位 | -3(最高) | 复位 |
| 2 | NMI | -2 | 不可屏蔽中断(来自外部NMI输入脚) |
| 3 | 硬(hard) fault | -1 | 所有被除能的fault,都将”上访”成硬件fault,除能的原因包括当前被禁用,或者被PRIMASK或BASPRI掩蔽。 |
| 4 | MemManage fault | 可编程 | 存储器管理fault,MPU访问犯规一级访问非法位置均可引发此fault |
| 5 | 总线fault | 可编程 | 从总线系统收到了错误响应,原因可以是预取流产(Abort)或数据流产,或者企图访问协处理器 |
| 6 | 用法(usage) Fault | 可编程 | 由于程序错误导致的异常,通常是使用了一条无效指令,或者是非法的状态转换,例如尝试切换到ARM状态 |
| 7-10 | 保留 | N/A | N/A |
| 11 | SVCall | 可编程 | 执行系统服务调用指令(SVC)引发的异常 |
| 12 | 调试监视器 | 可编程 | 调试监视器(断点,数据观察点,或者是外部调试请求) |
| 13 | 保留 | N/A | N/A |
| 14 | PendSV | 可编程 | 为系统设备而设置的”可悬挂请求”(pendable request) |
| 15 | SysTick | 可编程 | 系统滴答定时器 |
| 16 | IRQ #0 | 可编程 | 外中断 #0 |
| 17 | IRQ #1 | 可编程 | 外中断 #1 |
| …. | … | …. | … |
| 255 | IRQ #239 | 可编程 | 外中断 #239 |
上电后会触发复位异常
中断向量表
| 0 | 0x00 | MSP的初始值 |
|---|---|---|
| 1 | 0x04 | 复位 |
| 2 | 0x08 | NMI |
| 3 | 0x0C | 硬 fault |
| 4 | 0x10 | MemManage fault |
| 5 | 0x14 | 总线 fault |
| 6 | 0x18 | 用法 fault |
| 7-10 | 0x1c-0x28 | 保留 |
| 11 | 0x2c | SVC |
| 12 | 0x30 | 调试监视器 |
| 13 | 0x34 | 保留 |
| 14 | 0x38 | PendSV |
| 15 | 0x3c | SysTick |
| 16 | 0x40 | IRQ #0 |
| 17 | 0x44 | IRQ #1 |
| 18-255 | 0x48-0x3FF | IRQ #2-#239 |
- 并且会跳转到中断向量表特定便宜位置。获取里面的内容执行。
修改复位异常内的内容,就可以让处理器区执行我们指定的操作
触发异常 -> 中断向量表 -> 用户程序
启动文件: .s文件,为什么不使用.c文件?
因为stm32在刚开始运行的时候根本不具备C的运行环境,就使用
.s(汇编来)来启动
******************************************************************************* @file startup_stm32f407xx.s* @author MCD Application Team* @brief STM32F407xx Devices vector table for GCC based toolchains.* This module performs:* - Set the initial SP* - Set the initial PC == Reset_Handler,* - Set the vector table entries with the exceptions ISR address* - Branches to main in the C library (which eventually* calls main()).* After Reset the Cortex-M4 processor is in Thread mode,* priority is Privileged, and the Stack is set to Main.******************************************************************************
- Set the initial SP: 设置堆栈的指针
- Set the initial PC == Reset_Handler: 设置PC指针的值(当前运行的指令再+8的一个位置)
- Set the vector table entries with the exceptions ISR address : 设置中断向量表的位置
- Branches to main in the C library(which eventually calls main()).
- : 通过main函数跳转到C库里(最终会调用主函数main())
由ST官方提供的启动文件做了三个工作
- 1、初始化堆栈指针
- 2、设置PC指针的值,PC指针的地址-8就是当前指定运行的位置
- 3.设置中断向量表
- 4、调用C库函数main(初始化堆栈的操作,最终跳转到我们自己的main()函数)
.s文件说明
DCD: 会为指定的目标分配一块以字为单位的空间
