编译工具链(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(汇编来)来启动

  1. ******************************************************************************
  2. * @file startup_stm32f407xx.s
  3. * @author MCD Application Team
  4. * @brief STM32F407xx Devices vector table for GCC based toolchains.
  5. * This module performs:
  6. * - Set the initial SP
  7. * - Set the initial PC == Reset_Handler,
  8. * - Set the vector table entries with the exceptions ISR address
  9. * - Branches to main in the C library (which eventually
  10. * calls main()).
  11. * After Reset the Cortex-M4 processor is in Thread mode,
  12. * priority is Privileged, and the Stack is set to Main.
  13. ******************************************************************************
  • 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 : 会为指定的目标分配一块以字为单位的空间