基础知识 · 2024年 9月 11日·45 次浏览 0

ARM单片机的启动流程

ARM 单片机的启动流程与通用的 ARM 处理器启动流程类似,但由于单片机的特点(集成更多的外设、更简单的存储结构、通常不运行复杂的操作系统),其启动流程更简单。以下是 ARM 单片机(如 Cortex-M 系列)的典型启动流程:

单片机 ARM 启动流程概述

  1. 上电复位(Power-On Reset)
  2. 硬件初始化(复位向量)
  3. 启动代码执行
  4. 系统时钟和外设初始化
  5. 主程序进入运行状态

1. 上电复位(Power-On Reset)

当 ARM 单片机上电或复位时,系统首先执行上电复位。

  • 复位向量:ARM Cortex-M 系列单片机的复位向量是一个固定的内存地址(通常是程序存储器的开始地址,如 0x00000000),该地址存储着复位后要执行的第一条指令的地址。
  • 启动内存地址:复位时,ARM 单片机从一个固定的地址(通常是 Flash 或 ROM)开始执行启动代码。

特别注意:

  • 在 Cortex-M 架构中,复位向量的前 4 个字节存储的是堆栈指针的初始值,接下来的 4 个字节存储的是复位后要执行的第一条指令地址(即复位处理程序的入口地址)。

2. 硬件初始化(复位向量)

复位时,处理器会执行一些硬件初始化操作。此时主要有两个重要的寄存器:

  • 主堆栈指针(MSP):加载堆栈指针的初始值(复位向量表中的前 4 个字节),以便支持函数调用和中断。
  • 程序计数器(PC):加载复位处理程序的入口地址,即从复位向量表中的指定位置开始执行启动代码。

处理器进入启动模式(通常是特权模式),此时中断被禁用,处理器开始执行最初的初始化代码。


3. 启动代码执行

在复位处理程序中,启动代码负责进行关键的系统初始化,这些代码通常是汇编语言或非常底层的 C 代码。

启动代码的典型任务:

  • 堆栈指针初始化:配置堆栈指针,确保程序可以正确处理函数调用和中断。
  • BSS 段清零:BSS 段是未初始化的全局变量所在的内存区域,启动代码会将这段内存清零。
  • 数据段复制:数据段是已初始化的全局变量区域,启动代码会将这些变量从 Flash 中复制到 RAM 中。
  • 中断向量表初始化:为中断服务程序(ISR)初始化中断向量表,确保系统可以正确处理中断事件。对于 Cortex-M 系列单片机,向量表通常位于程序的起始位置,默认情况下直接映射到 Flash 中的固定位置。

4. 系统时钟和外设初始化

处理器初始化完成后,启动代码会对系统时钟和外设进行初始化。这个过程可能包括以下几步:

  • 系统时钟配置:启动代码会配置时钟源(如内部振荡器或外部晶振),并设置时钟分频器,确保系统在适当的频率下运行。
  • 外设初始化:启动代码还可能初始化一些关键外设,如 GPIO、串口(UART)、ADC、定时器等。这些外设的初始化通常由硬件抽象层(HAL)库或者特定的驱动代码完成。

5. 跳转到主程序

启动代码完成所有的初始化后,会跳转到主程序的入口点,即用户定义的 main() 函数。

此时,系统已经准备好运行用户的应用程序:

  • 进入主循环:在 main() 函数中,通常会设置一个无限循环,用于执行主要任务和响应事件。
  • 中断处理:中断系统已经初始化好,如果发生中断,系统会根据中断向量表跳转到相应的中断服务程序(ISR)来处理。

6. 中断处理与系统运行

在主程序运行过程中,系统会定期响应外部事件(如按钮按下、数据接收等)或内部事件(如定时器溢出)。这些事件通常由中断机制处理:

  • 中断处理器启动:当中断发生时,处理器会根据中断向量表跳转到相应的中断处理程序,执行完中断处理后,返回主程序继续执行。
  • 实时系统响应:在许多单片机应用中,实时性很重要。ARM Cortex-M 系列提供了快速的中断响应和低延迟的上下文切换机制,确保嵌入式应用能够快速响应事件。

ARM 单片机启动流程总结

  1. 上电复位:系统上电后,处理器复位,跳转到复位向量执行启动代码。
  2. 硬件初始化:初始化堆栈指针,设置程序计数器,禁用中断。
  3. 启动代码执行:启动代码完成基本的系统初始化,如内存初始化、堆栈指针设置、数据段和 BSS 段处理等。
  4. 系统时钟和外设初始化:设置系统时钟源,初始化关键外设,为主程序提供支持。
  5. 跳转到主程序:启动代码完成后,跳转到主程序(main()函数),开始执行用户代码。
  6. 中断处理与系统运行:系统在主程序中运行,处理器根据中断请求响应外部或内部事件。

ARM 单片机的启动流程相对简单,通常不涉及复杂的操作系统引导,但其基础的硬件初始化和引导机制是确保嵌入式程序正常运行的关键。