Update README.md

This commit is contained in:
Natsume1710
2025-06-16 17:09:04 +08:00
committed by GitHub
parent 796c363b2f
commit fa9ea65247
+111 -4
View File
@@ -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
```