From fa9ea652471a5f772c4d53e230cee05f4163a07e Mon Sep 17 00:00:00 2001 From: Natsume1710 <162396185+Natsume1710@users.noreply.github.com> Date: Mon, 16 Jun 2025 17:09:04 +0800 Subject: [PATCH] Update README.md --- 02-嵌入式系统基础知识/README.md | 115 ++++++++++++++++++++++++++++++-- 1 file changed, 111 insertions(+), 4 deletions(-) diff --git a/02-嵌入式系统基础知识/README.md b/02-嵌入式系统基础知识/README.md index 570f3f1..b544883 100644 --- a/02-嵌入式系统基础知识/README.md +++ b/02-嵌入式系统基础知识/README.md @@ -135,9 +135,116 @@ SECTIONS --- -> ✅ 后续建议补充: -> - 芯片数据手册阅读方法 -> - vector table 的定制与重定向 -> - ROM 启动 vs RAM 启动差异 +### 芯片数据手册阅读方法 + +#### 为什么重要? + +芯片数据手册(Datasheet)和参考手册(Reference Manual)是开发嵌入式系统时的核心参考材料,了解外设功能、寄存器地址、时钟结构、中断号、引脚复用等关键信息。 + +#### 典型结构(以 STM32 为例): + +| 部分 | 说明 | +| --------------------------- | -------------------------------- | +| Features | 简要功能描述,例如内核型号、Flash/RAM 容量、外设数量等 | +| Block Diagram | 芯片整体结构图 | +| Pinout / Alternate Function | 引脚定义和复用功能说明 | +| Electrical Characteristics | 电源、电压、电流、温度范围等参数 | +| Memory Map | 内存地址映射(Flash、SRAM、外设地址区间) | +| Peripherals | 每个外设的寄存器结构与配置方法 | + +#### 阅读技巧: + +* **先看 Block Diagram 和内存映射图**,了解系统架构。 +* **按功能模块查阅**:比如用 UART,就查看 USART 章节。 +* **关注寄存器描述表格**:查看寄存器地址、每个位的含义、读写属性(R/W)和复位值。 +* **善用搜索关键词**:如 `RCC_APB2ENR`,快速定位外设时钟控制相关信息。 --- + +### 向量表的定制与重定向 + +#### 什么是向量表? + +向量表是处理器在启动时用来获取异常/中断服务函数入口地址的数组,通常放在 Flash 起始地址(如 `0x0800 0000`)或 RAM 中。 + +每个项为一个 **函数指针**,比如: + +```c +typedef void(*ISR_Handler)(void); +const ISR_Handler vector_table[] __attribute__((section(".isr_vector"))) = { + (ISR_Handler)&_estack, // 初始栈顶指针 + Reset_Handler, // Reset + NMI_Handler, // NMI + HardFault_Handler, // HardFault + ... +}; +``` + +#### 重定向方法(常用于 Bootloader 或自定义中断): + +**1. 修改中断处理函数指针:** + +```c +__attribute__((section(".vector_table"))) +void (*my_vector_table[])(void) = { + ... // 自定义中断处理函数 +}; +``` + +**2. 使用 `SCB->VTOR`(Vector Table Offset Register)更改向量表地址:** + +```c +#include "core_cm4.h" +SCB->VTOR = (uint32_t)my_vector_table; +``` + +> 注意:新表地址必须对齐 0x100(最低 8 位为 0) + +#### 应用场景: + +* Bootloader 跳转到 App 时的向量表切换 +* 定制中断处理逻辑 +* 启动阶段将向量表从 Flash 重定向到 RAM(以支持运行时修改) + +--- + +### ROM 启动 vs RAM 启动的差异 + +#### 启动方式的定义: + +启动方式决定系统复位后,**从哪块内存的地址开始执行程序**,通常与 Boot Mode 管脚或 Boot 配置位有关。 + +#### ROM 启动(Flash 启动): + +* CPU 从 Flash 起始地址(如 `0x0800 0000`)加载向量表与指令 +* 适用于生产烧录版本 +* 启动速度快,代码执行稳定 + +#### RAM 启动: + +* CPU 从 SRAM 地址(如 `0x2000 0000`)启动 +* 适用于调试、自定义 Bootloader 或通过 JTAG 加载代码场景 +* 启动前通常需要拷贝一段程序到 RAM(由 Boot ROM、调试器或引导代码完成) + +#### 使用差异: + +| 项目 | ROM 启动 | RAM 启动 | +| ----- | -------------- | --------------------- | +| 程序位置 | 编译链接到 Flash 区域 | 编译链接到 RAM 区域 | +| 向量表位置 | 默认在 Flash | 需手动配置向量表并设置 SCB->VTOR | +| 应用场景 | 量产版本、正常运行 | Bootloader、自举加载、调试 | + +#### 链接脚本修改示例(GCC): + +* ROM 启动: + +```ld +FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K +``` + +* RAM 启动: + +```ld +RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K +``` +