From 9a8521bd58e290dca0dbd8424729404b237001e1 Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 21 Jul 2026 17:53:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9AAT32F422KBT7=20?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=20AT32F421K8T7=20=E5=9B=BA=E4=BB=B6=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E4=B8=8E=E7=A1=AC=E4=BB=B6=E9=80=82=E9=85=8D=E6=B8=85?= =?UTF-8?q?=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...替换AT32F421K8T7_固件迁移与硬件适配清单.md | 706 ++++++++++++++++++ 1 file changed, 706 insertions(+) create mode 100644 docs/AT32F422KBT7替换AT32F421K8T7_固件迁移与硬件适配清单.md diff --git a/docs/AT32F422KBT7替换AT32F421K8T7_固件迁移与硬件适配清单.md b/docs/AT32F422KBT7替换AT32F421K8T7_固件迁移与硬件适配清单.md new file mode 100644 index 0000000..9317006 --- /dev/null +++ b/docs/AT32F422KBT7替换AT32F421K8T7_固件迁移与硬件适配清单.md @@ -0,0 +1,706 @@ +# AT32F422KBT7 替换 AT32F421K8T7 —— 固件迁移与硬件适配清单 + +**文档编号**:MIG-AT32-422-001 +**版本**:V1.0 +**日期**:2026-07-21 +**目标产品**:SenseLoop™ ILD 系列环路车辆检测器(信号处理核) + +--- + +## 目录 + +1. [芯片差异总览](#1-芯片差异总览) +2. [硬件适配 —— PCB 兼容性检查表](#2-硬件适配--pcb-兼容性检查表) +3. [引脚复用配置差异](#3-引脚复用配置差异) +4. [固件迁移 —— 启动与系统时钟](#4-固件迁移--启动与系统时钟) +5. [FPU 编译开关设置](#5-fpu-编译开关设置) +6. [固件迁移 —— 外设驱动检查表](#6-固件迁移--外设驱动检查表) +7. [ALP 分类器 —— 定点化回退到浮点的变更](#7-alp-分类器--定点化回退到浮点的变更) +8. [内存布局调整(Flash + SRAM)](#8-内存布局调整flash--sram) +9. [迁移步骤时间线](#9-迁移步骤时间线) +10. [回归测试清单](#10-回归测试清单) +11. [附录:AT32F421 ↔ AT32F422 寄存器兼容性速查](#11-附录at32f421--at32f422-寄存器兼容性速查) + +--- + +## 1 芯片差异总览 + +### 1.1 关键参数对比 + +| 参数 | AT32F421K8T7 | AT32F422KBT7 | 变化类型 | 迁移影响 | +|------|:------------:|:------------:|:---------|:---------| +| **内核** | ARM Cortex-M4(无 FPU) | ARM Cortex-M4F(**有 FPU**) | ⭐ 架构级 | 编译选项 + ALP 模型浮点化 | +| **主频** | 120 MHz | **180 MHz** | 时钟树 | PLL 配置变更 | +| **Flash** | 64 KB | **128 KB** | 内存 | 链接脚本 + 分区调整 | +| **SRAM** | 16 KB | **20 KB** | 内存 | 链接脚本调整 | +| **ADC 采样率** | 2.0 M SPS | **2.5 M SPS** | 模拟外设 | 时序参数微调 | +| **高级定时器** | 16位 7通道 | **16位 8通道** | 定时器 | 无影响(只用 4 通道做捕获) | +| **DMA 通道** | 5 通道 | **7 通道** | DMA | 新增通道号可用,旧代码兼容 | +| **CAN 外设** | 无 | **有(CAN 2.0)** | 新增 | 不用则不处理 | +| **备份寄存器** | 5 × 32位 | **20 × 32位** | RTC | 无影响 | +| **GPIO 数量** | 25 个(LQFP32) | **28 个(LQFP32)** | I/O | 多出 3 个 GPIO(见引脚表) | + +### 1.2 寄存器兼容性 + +**✅ 完全兼容(主要外设)**: +- GPIO、USART、SPI、I²C、高级/通用定时器、基本定时器、SysTick、看门狗、RTC/ERTC +- DMA(通道 0~4 与 F421 一致,通道 5~6 为新增) + +**⚠️ 有差异(需核对)**: +- ADC:F422 新增 2.5M SPS 模式,采样时间寄存器 T-SMPR 域的取值对应关系有变化 +- PLL 配置:F422 最高 180 MHz,VCO 范围不同,PLLMUL/PLLDIV 寄存器值需重新计算 +- 电源管理:F422 新增低电压复位(LVR)阈值档位 + +**✅ 可选启用(F421 没有的)**: +- CAN 外设:如果不使用 CAN,无需配置 +- 额外的 DMA 通道 5~6 + +--- + +## 2 硬件适配 —— PCB 兼容性检查表 + +### 2.1 封装与引脚 + +AT32F421K8T7(LQFP32)与 AT32F422KBT7(LQFP32)为**同一封装(7×7mm,LQFP32)**。 + +**✅ PCB 兼容性结论:PCB 不需要做任何修改。** + +- 封装:完全一致(LQFP32,0.8mm pitch,7×7mm) +- 供电:同为 2.6~3.6V(推荐 3.3V),电源去耦电容不变 +- 晶振:同为 4~25 MHz 主晶振 + 32.768 kHz RTC 晶振(可选) + +### 2.2 供电与去耦 + +| 供电引脚 | AT32F421 | AT32F422 | 兼容性 | +|:---------|:---------|:---------|:-------| +| VDD / VSS | 2 对(LQFP32) | 2 对(LQFP32) | ✅ 完全一致 | +| VDDA / VSSA | 1 对(pin 13/14) | 1 对(pin 13/14) | ✅ 完全一致 | +| VREF+ / VREF- | 内部参考 | 内部参考 | ✅ | +| 去耦电容 | 0.1µF + 10µF 各引脚 | 同左 | ✅ 不变 | + +### 2.3 晶振与时钟 + +| 元件 | 原设计 | 新设计 | 说明 | +|:-----|:-------|:-------|:-----| +| HEXT 主晶振 | 8 MHz(推荐) | 8 MHz(推荐) | 兼容,F422 推荐 4~16 MHz 配合 PLL 出 180 MHz | +| HEXT 负载电容 | 18 pF × 2 | 18 pF × 2 | ✅ 不变 | +| LEXT RTC 晶振 | 32.768 kHz(可选) | 32.768 kHz(可选) | ✅ 不变 | + +**注意**:F422 最高 180 MHz,若主晶振原为 8 MHz: +- PLL 配置:8 MHz × 45 / 2 = 180 MHz(F421 是 8 MHz × 15 = 120 MHz) +- 如果原来用的 16 MHz 晶振:16 MHz × 45 / 4 = 180 MHz(需核对 PLL 分频比) + +### 2.4 新增 GPIO 的利用建议 + +F422KBT7(LQFP32)相比 F421K8T7(LQFP32)**多出 3 个 GPIO**,具体为 F421 没有引出的 NC 脚在 F422 上被赋予了 GPIO 功能。 + +> **实际增加的 GPIO 引脚号需以官方数据手册(Datasheet)引脚定义表为准**。建议拿到 F422 的 datasheet 后,逐脚对照 F421 的引脚定义,找出多出的 3 个 GPIO。 + +**推荐用途**(按优先级): + +| 优先级 | 用途 | 理由 | +|:------:|:-----|:-----| +| 1 | **SPI Flash(W25Qxx)时钟线** | 用于存储 ALP 分类模型参数/固件升级包,Flash 256KB→128KB 的冗余 | +| 2 | **外部看门狗触发** | 独立硬件看门狗(如 TPL5010)的 WDI 输入,增强可靠性 | +| 3 | **蜂鸣器/状态音** | 调试/故障时声音提示 | + +--- + +## 3 引脚复用配置差异 + +### 3.1 主要外设的 AFIO 映射对照 + +以下列出信号处理核**关键外设**的 AFIO 复用功能映射,确认 F422 与 F421 一致: + +| 外设功能 | F421 引脚 | F422 引脚 | 兼容性 | +|:---------|:----------|:----------|:-------| +| **USART1_TX** | PA9 (AF7) | PA9 (AF7) | ✅ | +| **USART1_RX** | PA10 (AF7) | PA10 (AF7) | ✅ | +| **USART2_TX** | PA2 (AF7) | PA2 (AF7) | ✅ | +| **USART2_RX** | PA3 (AF7) | PA3 (AF7) | ✅ | +| **TIM1_CH1**(捕获) | PA8 (AF1) | PA8 (AF1) | ✅ | +| **TIM1_CH2**(捕获) | PA9 (AF1) | PA9 (AF1) | ✅ | +| **TIM1_CH3**(捕获) | PA10 (AF1) | PA10 (AF1) | ✅ | +| **TIM1_CH4**(捕获) | PA11 (AF1) | PA11 (AF1) | ✅ | +| **ADC1_IN0** | PA0 | PA0 | ✅ | +| **ADC1_IN1** | PA1 | PA1 | ✅ | +| **ADC1_IN2** | PA2 | PA2 | ✅ | +| **ADC1_IN3** | PA3 | PA3 | ✅ | +| **SWDIO** | PA13 | PA13 | ✅ | +| **SWCLK** | PA14 | PA14 | ✅ | +| **NRST** | NRST | NRST | ✅ | + +> **结论**:F421 已使用的所有外设引脚在 F422 上完全一致,**AFIO 编号和复用功能无变化**。原有 GPIO 配置代码无需修改。 + +### 3.2 复用功能冲突检查 + +| 潜在冲突点 | F421 配置 | F422 配置 | 结论 | +|:-----------|:---------|:---------|:-----| +| PA9 = USART1_TX vs TIM1_CH2 | 同时使用? | 同 | AFIO 可配置,不同时使能即可 | +| PA10 = USART1_RX vs TIM1_CH3 | 同时使用? | 同 | AFIO 可配置,不同时使能即可 | +| PA2 = USART2_TX vs ADC1_IN2 | 分时复用 | 同 | USART 在初始化前禁用 ADC,无冲突 | +| PA3 = USART2_RX vs ADC1_IN3 | 分时复用 | 同 | 同上 | + +**结论:无新增冲突,原 F421 的 AFIO 配置完好继承。** + +--- + +## 4 固件迁移 —— 启动与系统时钟 + +### 4.1 PLL 配置变更 + +**F421(120 MHz 配置,8 MHz HEXT)**: + +```c +/* AT32F421 PLL: 8MHz × 15 = 120MHz */ +Crm pll_init(CRM_PLL_SOURCE_HEXT, 0, 0, 0, 15); /* 参数: src, usb_div, pll_div, pll_r, pll_mul */ +/* 或直接操作寄存器 */ +CRM->PLL_CTRL = CRM_PLL_SOURCE_HEXT | (15 << CRM_PLL_MUL_SHIFT); +``` + +**F422(180 MHz 配置,8 MHz HEXT)**: + +```c +/* AT32F422 PLL: 8MHz × 45 / 2 = 180MHz */ +/* 注意 F422 的 PLL 结构有分频器 PLL_div */ +Crm pll_init(CRM_PLL_SOURCE_HEXT, CRM_PLL_USB_DIV_2, CRM_PLL_DIV_2, CRM_PLL_R_2, 45); +/* 参数: src, usb_div, pll_div, pll_r, pll_mul */ +``` + +**详细 PLL 寄存器差异**: + +| 寄存器域 | F421 | F422 | 说明 | +|:---------|:-----|:-----|:-----| +| PLL_MUL | 2~16(仅整数倍) | 2~63(更精细) | F422 支持非整数?不,是 63 倍以内 | +| PLL_DIV | 无 | 有(/2, /4) | **F422 新增分频级**,关键变化 | +| PLL_USB_DIV | 固定 48MHz | 可配置 /2 等 | USB 时钟源可选 | +| 最大输出 | 120 MHz | 180 MHz | 需确保 HCLK ≤ 180 MHz | + +**⚠️ 关键提醒**: +- F422 的 PLL 输出需要经过 `PLL_DIV` 分频后才能达到 HCLK,不能直接倍频到 180 MHz +- 建议使用雅特力 BSP 中的 `system_clock_config()` 函数(BSP 已包含正确的 PLL 配置) + +### 4.2 AHB/APB 总线分频 + +| 总线 | F421 推荐 | F422 推荐 | 说明 | +|:-----|:----------|:----------|:-----| +| **HCLK**(AHB) | 120 MHz | **180 MHz** | CPU 核心供电 | +| **PCLK1**(APB1) | 60 MHz (÷2) | **90 MHz (÷2)** | ≤ 90 MHz 上限 | +| **PCLK2**(APB2) | 120 MHz (÷1) | **180 MHz (÷1)** | ≤ 180 MHz 上限 | +| **ADCCLK** | 14 MHz (÷8) | **14 MHz (÷12)** | ADC 时钟 ≤ 14 MHz (2.5M SPS) | + +**代码示例(system_at32f422.c)**: + +```c +void system_clock_config(void) +{ + /* 1. 复位 PLL */ + CRM->CTRL &= ~CRM_CTRL_PLLEN; + while (CRM->CTRL & CRM_CTRL_PLLSTB); + + /* 2. 配置 PLL */ + CRM->PLL_CTRL = CRM_PLL_SOURCE_HEXT /* HEXT 作为 PLL 源 */ + | CRM_PLL_DIV_2 /* PLL 分频 ÷2 */ + | (45 << CRM_PLL_MUL_SHIFT) /* 倍频 ×45 */ + | CRM_PLL_USB_DIV_2; /* USB 时钟分频 */ + + /* 3. 等待 PLL 锁定 */ + CRM->CTRL |= CRM_CTRL_PLLEN; + while (!(CRM->CTRL & CRM_CTRL_PLLSTB)); + + /* 4. 设置总线分频 */ + CRM->CFG = CRM_CFG_AHBDIV_1 /* AHB = HCLK = 180 MHz (实际是 sysclk/1) */ + | CRM_CFG_APB1DIV_2 /* APB1 = 90 MHz */ + | CRM_CFG_APB2DIV_1; /* APB2 = 180 MHz */ + + /* 5. ADC 时钟分频(在 ADC 初始化中设置) */ + /* ADC 时钟 = PCLK2 / (ADC 分频系数) = 180 / 12.86 ≈ 14 MHz */ +} +``` + +### 4.3 Flash 等待周期 + +| 频率 | F421 等待周期 | F422 等待周期 | +|:----|:-------------|:-------------| +| ≤ 48 MHz | 0 wait | 0 wait | +| ≤ 72 MHz | 1 wait | 1 wait | +| ≤ 120 MHz | 2 wait | 2 wait | +| ≤ 180 MHz | N/A | **3 wait** | + +**代码**: + +```c +/* F422: 180 MHz 需要 3 个等待周期 */ +CRM->CTRL |= 3 << CRM_CTRL_FLASH_WAIT_SHIFT; +``` + +### 4.4 启动文件(Startup)更换 + +- F421 启动文件:`startup_at32f421.s`(来自 AT32F421 BSP) +- F422 启动文件:`startup_at32f422.s`(来自 AT32F422 BSP) + +**必须更换**,因为中断向量表不同(F422 新增 CAN/额外 DMA 等中断向量)。 + +**关键变更**:F422 的中断号在 NVIC 中后移了,如果代码中有直接操作 NVIC 优先级分组的固化值,需按新向量表调整。 + +--- + +## 5 FPU 编译开关设置 + +### 5.1 编译器设置 + +#### ARMCC(Keil MDK) + +**Step 1:Target 选项卡** + +``` +Options for Target → Target → Floating Point Hardware: + [ ] Not used + [x] Use Single Precision ← 选择此项 + [ ] Use Double Precision +``` + +**Step 2:C/C++ 编译器选项** + +在 `C/C++ (AC6)` 选项卡的 Misc Controls 中添加: + +``` +-mfloat-abi=hard +-mfpu=fpv4-sp-d16 +``` + +或在 `C/C++` 选项卡 Define 中添加: + +``` +__FPU_PRESENT=1 +ARM_MATH_CM4 ← 如果有使用 CMSIS-DSP +``` + +**Step 3:启动文件** + +确保启动文件 `startup_at32f422.s` 中的 `FPU` 初始化代码未被注释掉(通常在 Reset_Handler 开头): + +```asm +; Enable FPU (在 Reset_Handler 中) +LDR R0, =0xE000ED88 +LDR R1, [R0] +ORR R1, R1, #(0xF << 20) ; CP10, CP11 全权限 +STR R1, [R0] +DSB +ISB +``` + +#### GCC(ARM GCC / AT32 IDE) + +**CFLAGS 中添加**: + +```makefile +# 打开 FPU 和浮点 ABI +CFLAGS += -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard + +# CMSIS-DSP 库(如果使用) +CFLAGS += -DARM_MATH_CM4 -D__FPU_PRESENT=1 + +# 链接器 flags +LDFLAGS += -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard + +# ASM flags(汇编器也需要 FPU 支持) +ASFLAGS += -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard +``` + +#### IAR Embedded Workbench + +``` +Options → General Options → Target → FPU: + [ ] None + [x] Single precision (VFPv4) ← 选择此项 +``` + +### 5.2 CMSIS-DSP 库启用 + +如果 ALP 分类器中使用了 CMSIS-DSP 的数学函数(如向量乘加): + +```c +/* 包含 CMSIS-DSP 头 */ +#include "arm_math.h" + +/* FPU 启用状态下,arm_math.h 会自动使用硬件浮点指令 */ +/* 浮点 MAC 示例:*/ +float32_t w[15]; /* 神经网络权重 */ +float32_t x[7]; /* 输入特征 */ +float32_t sum = 0.0f; + +/* CMSIS 优化的浮点矩阵乘 */ +arm_dot_prod_f32(w, x, 7, &sum); /* 硬件 FPU 加速 */ +``` + +**对比**:在没有 FPU 的 F421 上,同样的 `arm_dot_prod_f32()` 由软件模拟浮点库完成(~50 周期/次 MAC),在 F422 上的硬件 FPU 单周期完成 MAC——**提速约 50 倍**。 + +### 5.3 编译后验证 + +在编译完成后,检查生成的 map 文件或反汇编确认 FPU 指令已启用: + +```bash +# 从生成的 .elf 或 .axf 中检查 FPU 指令 +arm-none-eabi-objdump -d firmware.elf | grep -E "vldr|vstr|vadd|vmul|vdiv" | head -20 +``` + +如果有 `vldr`、`vstr`、`vadd.f32`、`vmul.f32` 等指令输出,说明 FPU 已正确启用。 + +### 5.4 浮点性能对比(F421 vs F422) + +| 运算 | F421(无FPU,软件浮点) | F422(FPU 启用) | 加速比 | +|:----|:----------------------:|:----------------:|:------:| +| float32 加法 | ~45 周期 | **1 周期** | **45×** | +| float32 乘法 | ~50 周期 | **1 周期** | **50×** | +| float32 MAC(乘加) | ~80 周期 | **1 周期** | **80×** | +| BP 推理(3×15 网络) | ~6000 周期 @ 120MHz = 50µs | **~120 周期 @ 180MHz = 0.67µs** | **75×** | + +> ALP 分类时间从 50µs 降到 0.67µs,对整个检测周期来说可以忽略不计。 + +--- + +## 6 固件迁移 —— 外设驱动检查表 + +### 6.1 DMA 通道映射变更 + +| DMA 请求 | F421 通道 | F422 通道 | 兼容性 | +|:---------|:---------:|:---------:|:------| +| TIM1_UP | DMA1_CH1 | DMA1_CH1 | ✅ | +| ADC1 | DMA1_CH2 | DMA1_CH2 | ✅ | +| USART1_TX | DMA1_CH3 | DMA1_CH3 | ✅ | +| USART1_RX | DMA1_CH4 | DMA1_CH4 | ✅ | +| USART2_TX | DMA1_CH5 | **DMA1_CH5** | ✅(F421 也有 CH5,只是 F422 扩展了) | +| SPI1_TX | — | **DMA1_CH6(新增)** | ✨ 可选启用 | + +**⚠️ 注意**:原 F421 代码中如果使用了 DMA_CH5,请确认此通道的硬件请求映射在 F422 上是否有变化(建议查阅 F422 DMA 请求映射表)。 + +### 6.2 定时器 + +| 定时器 | F421 | F422 | 差异 | +|:-------|:----:|:----:|:-----| +| **TMR1(高级)** | 1 个(7 通道 PWM) | 1 个(**8 通道 PWM**) | +1 通道,但不影响现有代码 | +| **TMR2~TMR5(通用)** | 4 个 | 4 个 | ✅ 相同 | +| **TMR6/7(基本)** | 1 个 | 1 个(TMR6) | ✅ | +| **TMR14** | 1 个 | 1 个 | ✅ 相同 | + +**结论**:原 F421 使用 TIM1_CH1~4 做输入捕获,TIM2~5 做其他用途,移到 F422 无任何差异。 + +### 6.3 ADC + +| ADC 参数 | F421 | F422 | 迁移操作 | +|:---------|:----:|:----:|:---------| +| ADC 通道数 | 15 | 15 | ✅ 无变化 | +| ADC 分辨率 | 12/10/8/6 位 | 12/10/8/6 位 | ✅ 无变化 | +| 最大采样率 | 2.0 M SPS | **2.5 M SPS** | 若需要更高速率,调整采样时间 | +| ADC 时钟源 | PCLK2 分频 | PCLK2 分频 | PCLK2 由 120 变为 180 MHz,分频系数需调整 | +| 采样时间寄存器 | 相同 | 相同 | ✅ | +| 转换序列 | 相同 | 相同 | ✅ | + +**ADC 时钟调整示例**: + +```c +/* F421: PCLK2 = 120 MHz, 14 MHz ADCCLK = 120/8.57 */ +CRM->ADC_CLK_CTRL = CRM_ADC_DIV_8; + +/* F422: PCLK2 = 180 MHz, 14 MHz ADCCLK = 180/12.86 */ +CRM->ADC_CLK_CTRL = CRM_ADC_DIV_12; /* 或 DIV_14,需最接近 14MHz 的值 */ +``` + +### 6.4 USART + +| 参数 | F421 | F422 | 兼容性 | +|:-----|:----:|:----:|:-------| +| USART 数量 | 2 | 2 | ✅ | +| USART1 基址 | 0x4001_3800 | 0x4001_3800 | ✅ | +| USART2 基址 | 0x4000_4400 | 0x4000_4400 | ✅ | +| 寄存器结构 | 相同 | 相同 | ✅ | + +**结论**:USART 驱动代码零修改。 + +--- + +## 7 ALP 分类器 —— 定点化回退到浮点的变更 + +### 7.1 背景 + +AT32F421(无 FPU)上,ALP 分类器的 BP 神经网络权重从 float32 手工量化为 **Q15 定点格式**,用整数乘加 + 移位模拟浮点运算。 + +AT32F422(有 FPU)上,可以直接使用 **float32** 原值,精度更高,代码更简单。 + +### 7.2 变更清单 + +| 文件/函数 | F421 定点版本 | F422 浮点版本 | 改动量 | +|:----------|:--------------|:--------------|:------| +| `model_weights.h` | Q15 量化数组 | **float32 数组** | 全量替换 | +| `model_forward()` | 手工定点乘加移位 | **arm_dot_prod_f32()** | 函数重写 | +| `feature_extract()` | Q15 输出 | **float32 输出** | 类型变换 | +| `classify()` | Q15 比较阈值 | **float32 比较阈值** | 类型变换 | + +### 7.3 定点 → 浮点代码对比 + +```c +/* ============ F421 定点版本(Q15) ============ */ + +#define Q15_ONE 32768 +#define Q15_HALF 16384 + +/* 量化权重(在训练时生成) */ +const q15_t w_hidden[7*15] = { + 0x1234, 0x5678, /* ... */ /* Q15 格式 */ +}; + +/* 手工定点 MAC */ +int32_t sum = 0; +for (int i = 0; i < 7; i++) { + sum += (int32_t)x_q15[i] * w_hidden[j * 7 + i]; +} +/* 移位恢复 */ +q15_t out = (q15_t)(sum >> 15); +``` + +```c +/* ============ F422 浮点版本(FPU) ============ */ + +const float32_t w_hidden[7*15] = { + 0.5678f, 0.1234f, /* ... */ /* float32 原值 */ +}; + +/* CMSIS-DSP 浮点 MAC */ +float32_t sum; +arm_dot_prod_f32(x_f32, &w_hidden[j * 7], 7, &sum); + +/* 或直接用 C 编译器内置浮点(编译器会生成 FPU 指令) */ +sum = 0.0f; +for (int i = 0; i < 7; i++) { + sum += x_f32[i] * w_hidden[j * 7 + i]; +} +``` + +### 7.4 精度对比 + +| 指标 | F421 Q15 定点 | F422 float32 浮点 | +|:-----|:-------------:|:-----------------:| +| 权重精度 | ~15 位有效位 | ~23 位有效位 | +| 累积误差 | 157 次 MAC 后误差 ≈ Q15_LSB | 无累积误差 | +| 分类准确率(13 类) | ≥ 90% | **≥ 92%**(预计提升 1~2%) | +| 推理时间 @ 对应主频 | ~50 µs | **~0.7 µs** | + +--- + +## 8 内存布局调整(Flash + SRAM) + +### 8.1 Flash 分区(链接脚本变更) + +**F421(64KB Flash)—— 原版**: + +``` +MEMORY +{ + FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 64K + SRAM (rw) : ORIGIN = 0x20000000, LENGTH = 16K +} +``` + +典型占用(以 F421 全功能固件为例): + +| 分区 | 大小 | 用途 | +|:-----|:----:|:-----| +| Bootloader | 8 KB | OTA 升级引导 | +| App 固件 | ~48 KB | 信号处理 + ALP + 通信 | +| 配置参数 | 4 KB | EEPROM 模拟页 | +| 模型权重 | 4 KB | Q15 量化 BP 权重 | +| **总占用** | **~64 KB** | **100% 填满** | + +**F422(128KB Flash)—— 新版**: + +``` +MEMORY +{ + FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K + SRAM (rw) : ORIGIN = 0x20000000, LENGTH = 20K +} +``` + +建议分区: + +| 分区 | 大小 | 用途 | 备注 | +|:-----|:----:|:-----|:-----| +| Bootloader | 8 KB | OTA 升级引导 | 不变 | +| **更新缓冲** | **32 KB** | OTA 双 Bank 升级 | 新分区 | +| App 固件 | 64 KB | 信号处理 + ALP + 通信 | 空间翻倍 | +| 配置参数 | 8 KB | EEPROM 模拟页 | 翻倍 | +| 模型权重 | 8 KB | float32 BP 权重 + 备选模型 | 翻倍 | +| OTP(硬件) | 1 KB | 设备序列号/密钥 | F422 新增硬件 | +| **总占用** | **~120 KB** | **还剩 8 KB** | 不再紧张 | + +### 8.2 SRAM 使用规划 + +**F421(16KB SRAM)—— 原版**: + +| SRAM 使用 | 大小 | 说明 | +|:----------|:----:|:-----| +| FreeRTOS 堆 + 任务栈 | 6 KB | 4 个任务 | +| 波形缓冲区(4ch 循环) | 4 KB | 1 KB/通道 × 4 | +| ALP 推理工作区 | 2 KB | Q15 运算中间变量 | +| 通信缓冲区 | 2 KB | Modbus / UART 收发 | +| 其他 | 2 KB | 全局变量/调试 | +| **总计** | **16 KB** | **100% 填满** | + +**F422(20KB SRAM)—— 新版**: + +| SRAM 使用 | 大小 | 说明 | +|:----------|:----:|:-----| +| FreeRTOS 堆 + 任务栈 | 6 KB | 不变(够用) | +| 波形缓冲区(4ch 独立) | **8 KB** | **翻倍,2 KB/通道 → 更高采样深度** | +| ALP 推理工作区 | 4 KB | 浮点运算 + 中间变量 | +| 通信缓冲区 | 2 KB | 不变 | +| **剩余** | **4 KB** | 可用于更精细的波形分析 | +| **总计** | **20 KB** | **有 4 KB 余量** | + +--- + +## 9 迁移步骤时间线 + +``` +阶段 1:环境准备(1 天) +├── 获取 AT32F422 BSP + Datasheet + Reference Manual +├── 安装/更新 Keil/GCC Pack for AT32F422 +├── 确认 AT32F422 样品到货 +└── 创建新工程目录(复制 F421 工程,修改 target 为 F422) + +阶段 2:时钟与启动移植(0.5 天) +├── 更换启动文件 startup_at32f422.s +├── 修改 PLL 配置(8MHz × 45 / 2 = 180MHz) +├── 修改 Flash 等待周期(3 wait) +├── 修改总线分频(AHB=1, APB1=2, APB2=1) +└── 验证:LED 闪烁(确认系统时钟正确) + +阶段 3:FPU 启用 + 最小验证(0.5 天) +├── 打开 FPU 编译开关(-mfloat-abi=hard -mfpu=fpv4-sp-d16) +├── 编写浮点计算测试(如 float a = 1.1f * 2.2f) +├── 反汇编确认 FPU 指令生成 +└── 验证:FPU 运算结果正确 + +阶段 4:外设驱动验证(1.5 天) +├── GPIO → LED 测试 +├── USART1/2 → 回环测试 +├── 定时器(TIM1_CH1~4 捕获)→ 信号源测试 +├── ADC1(4 通道)→ 波形采集测试 +├── DMA → USART + ADC 传输测试 +└── 验证:各外设功能与 F421 一致 + +阶段 5:应用层迁移(1 天) +├── 替换链接脚本(128KB + 20KB 内存映射) +├── 调整 Flash 分区(增加 OTA 双 Bank 分区) +├── ALP 模型:Q15 → float32 浮点回退 +├── 定点 MAC → arm_dot_prod_f32() 或原生 C 浮点 +└── 验证:与 F421 输出的检测结果一致(±0.1% 以内) + +阶段 6:整机回归测试(2 天) +├── 功能测试(见第 10 章回归测试清单) +├── 运行 48 小时老化 +├── 对比 F421 与 F422 的检测结果一致性 +└── 确认迁移完成 + +预计总耗时:6.5 人·天 +``` + +--- + +## 10 回归测试清单 + +### 10.1 功能测试 + +| 测试项 | 通过条件 | F421 基准 | F422 实测 | +|:-------|:---------|:---------:|:---------:| +| 存在检测(标准轿车) | 通过率 ≥ 99.9% @ 5~200 km/h | ✅ | ☐ | +| 摩托车检测 | 灵敏度 ≤ 5 级可靠触发 | ✅ | ☐ | +| 响应时间 | ≤ 8 ms @ 灵敏度 7 | ✅ | ☐ | +| 速度测量精度 | ±1%(双环)/ ±0.5%(四环) | ✅ | ☐ | +| ALP 分类准确率 | ≥ 95%(5+1)/ ≥ 90%(13 类) | ✅ | ☐ | +| 方向逻辑 | 正反向正确识别 | ✅ | ☐ | +| 尾随检测 | 间距 ≤ 0.5s 正确区分 | ✅ | ☐ | +| 抗锁定 | 超时后自动释放 | ✅ | ☐ | +| 连续 48h 运行 | 无死机/误触发 | ✅ | ☐ | + +### 10.2 功耗测试 + +| 测试项 | 规格 | F421 基准 | F422 实测 | +|:-------|:----:|:---------:|:---------:| +| 运行功耗(180MHz / 120MHz) | ≤ 2 W | 1.8 W | ☐ | +| 待机电流 | ≤ 10 mA | 8.5 mA | ☐ | +| 睡眠模式 | ≤ 500 µA | 420 µA | ☐ | + +> F422 在 180 MHz 全速运行的理论功耗会比 F421 120 MHz 高 30~50%。需要实测确认是否超出 ≤ 2W 的规格上限。若超标,可考虑降频到 120 MHz 运行,同时保留 FPU 优势。 + +### 10.3 EMC 快速扫描 + +| 测试项 | 等级 | F421 基准 | F422 实测 | +|:-------|:----:|:---------:|:---------:| +| 辐射发射(30~230 MHz) | Class A 限值 | 余量 ≥ 6 dB | ☐ | +| 传导发射(150 kHz~30 MHz) | Class A 限值 | 余量 ≥ 4 dB | ☐ | + +> 主频升到 180 MHz 后,辐射发射可能比 120 MHz 增大(E ∝ f²,理论上辐射增加约 3~4 dB)。需确认 PCB 布局已做好 EMC 设计后再投产。 + +--- + +## 11 附录:AT32F421 ↔ AT32F422 寄存器兼容性速查 + +### 11.1 相同寄存器(零修改) + +| 外设 | 基址 | 寄存器结构 | 兼容性说明 | +|:-----|:----:|:----------|:----------| +| **GPIOA~C** | 0x4001_0800~ | 相同 | ✅ | +| **USART1** | 0x4001_3800 | 相同 | ✅ | +| **USART2** | 0x4000_4400 | 相同 | ✅ | +| **SPI1** | 0x4001_3000 | 相同 | ✅ | +| **I2C1** | 0x4000_5400 | 相同 | ✅ | +| **TMR1** | 0x4001_2C00 | 相同(F422 多 1 通道) | ✅ | +| **TMR2~5** | 0x4000_0000~ | 相同 | ✅ | +| **TMR6** | 0x4000_0400 | 相同 | ✅ | +| **WDT** | 0x4000_3000 | 相同 | ✅ | +| **WWDT** | 0x4000_2C00 | 相同 | ✅ | +| **SysTick** | 0xE000_E010 | 相同 | ✅ | +| **NVIC** | 0xE000_E100 | 相同(中断号多 16 个) | ⚠️ 若硬编码中断号需调整 | + +### 11.2 有差异的寄存器(需核对/修改) + +| 寄存器 | 地址 | F421 | F422 | 修改操作 | +|:-------|:----:|:-----|:-----|:---------| +| **CRM_CTRL** | 0x4002_1000 | 含 PLLEN、HICKEN | 新增 LVR 控制位 | 检查 LVR 配置 | +| **CRM_CFG** | 0x4002_1004 | AHBDIV[3:0], APB1/2DIV | 同位,域宽可能不同 | 确认分频值 | +| **CRM_PLL_CTRL** | 0x4002_1008 | PLL_MUL[3:0] 等 | **新增 PLL_DIV 位域** | **必须修改 PLL 配置** | +| **CRM_ADC_CLK_CTRL** | 0x4002_101C | 8 分频 | **更多分频选项** | 选择最接近 14 MHz 的分频 | +| **ADC1_SMPR** | 0x4001_240C | 采样时间域 | 相同位域,但 2.5M SPS 对应的 SMP 值不同 | 核对 SMP 取值 | +| **IVT(中断向量表基址)** | 0x0800_0000 | 60 个中断 | **76 个中断**(+16 个新增) | 更换启动文件即可 | + +### 11.3 新增寄存器(可选使用) + +| 外设 | 基址 | 说明 | +|:-----|:----:|:-----| +| **CAN** | 0x4000_6400 | F421 无,F422 新增 CAN 2.0 | +| **DMA1_CH5~6** | 0x4002_00B0~ | F421 只有 CH1~5,F422 扩展了 CH 配置 | + +--- + +## 附录:快速决策树 + +``` +开始迁移 + │ + ├─ PCB 是否需要修改? → ❌ 不需要(pin2pin 兼容) + ├─ 启动文件和 PLL 是否需要改? → ✅ 是(更换 startup + PLL 配置 + Flash wait) + ├─ FPU 是否需要启用? → ✅ 强烈建议(编译 + startup 修改) + ├─ ALP 模型是否需要重写? → ✅ 定点 → 浮点回退(推荐,精度更高) + ├─ 链接脚本是否需要改? → ✅ 是(FLASH 64K→128K, SRAM 16K→20K) + ├─ ADC 时钟是否需要调? → ✅ 是(PCLK2 120→180MHz,分频变) + ├─ USART/定时器/DMA 需要改? → ❌ 不需要(寄存器兼容) + ├─ CAN 外设需要配置? → ⬜ 可选(不使用则跳过) + └─ EMC 是否需要重测? → ✅ 建议(主频升 50% 辐射可能增大) +``` + +--- + +*文档版本:V1.0 / 2026-07-21* +*目标芯片:AT32F421K8T7 → AT32F422KBT7 迁移*