26 KiB
AT32F422KBT7 替换 AT32F421K8T7 —— 固件迁移与硬件适配清单
文档编号:MIG-AT32-422-001
版本:V1.0
日期:2026-07-21
目标产品:SenseLoop™ ILD 系列环路车辆检测器(信号处理核)
目录
- 芯片差异总览
- 硬件适配 —— PCB 兼容性检查表
- 引脚复用配置差异
- 固件迁移 —— 启动与系统时钟
- FPU 编译开关设置
- 固件迁移 —— 外设驱动检查表
- ALP 分类器 —— 定点化回退到浮点的变更
- 内存布局调整(Flash + SRAM)
- 迁移步骤时间线
- 回归测试清单
- 附录: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 一致,通道 56 为新增)
⚠️ 有差异(需核对):
- 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):
/* 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):
/* 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):
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 |
代码:
/* 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 开头):
; 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 中添加:
# 打开 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 的数学函数(如向量乘加):
/* 包含 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 指令已启用:
# 从生成的 .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_CH14 做输入捕获,TIM25 做其他用途,移到 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 时钟调整示例:
/* 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 定点 → 浮点代码对比
/* ============ 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);
/* ============ 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 迁移