1. 1. BST85226 vs P1025_PURDY_G2 电量计固件对比分析
    1. 1.1. 文档概述
    2. 1.2. 第一部分:MCU底层架构差异
      1. 1.2.1. 1.1 处理器架构对比
      2. 1.2.2. 1.2 内存系统对比
      3. 1.2.3. 1.3 启动流程对比
        1. 1.2.3.1. ARM (Cortex-M0) 启动流程
        2. 1.2.3.2. RISC-V (E200) 启动流程
      4. 1.2.4. 1.4 中断系统对比
        1. 1.2.4.1. ARM NVIC (Cortex-M0)
        2. 1.2.4.2. RISC-V PLIC
      5. 1.2.5. 1.5 链接脚本对比
        1. 1.2.5.1. ARM链接脚本 (newton.sct)
        2. 1.2.5.2. RISC-V链接脚本 (link_flash.lds)
      6. 1.2.6. 1.6 关键差异总结
    3. 1.3. 第二部分:电量计逻辑差异分析
      1. 1.3.1. 2.1 SBS协议结构对比
        1. 1.3.1.1. 共同SBS命令 (两者均有)
        2. 1.3.1.2. 特有SBS命令对比
        3. 1.3.1.3. SBS命令定义差异
      2. 1.3.2. 2.2 保护机制对比
        1. 1.3.2.1. 共同保护项目
        2. 1.3.2.2. 保护标志定义对比
        3. 1.3.2.3. P1025独有SOV机制
      3. 1.3.3. 2.3 LOG系统对比
        1. 1.3.3.1. LOG存储布局
        2. 1.3.3.2. LOG_T数据结构对比
      4. 1.3.4. 2.4 SOC计算对比
        1. 1.3.4.1. 共同算法特征
        2. 1.3.4.2. SOC初始化方法
      5. 1.3.5. 2.5 TTF (Time to Full) 算法对比
        1. 1.3.5.1. 两者通用算法
        2. 1.3.5.2. ARM版本额外优化
      6. 1.3.6. 2.6 状态机对比
        1. 1.3.6.1. 两者状态机定义
      7. 1.3.7. 2.7 ISRW1 (微短路检测) 对比
    4. 1.4. 第三部分:应用层差异
      1. 1.4.1. 3.1 文件结构对比
      2. 1.4.2. 3.2 编译工具链
    5. 1.5. 第四部分:ISRW1接口说明
      1. 1.5.1. 4.1 接口定义
      2. 1.5.2. 4.2 SBS接口命令
      3. 1.5.3. 4.3 数据格式
      4. 1.5.4. 4.4 后续修改说明
    6. 1.6. 附录A:寄存器对比速查
      1. 1.6.1. ARM NEWTON寄存器映射
      2. 1.6.2. RISC-V P1025寄存器映射
    7. 1.7. 附录B:关键宏定义差异

电量计 -- ARM vs RISCV电量计固件移植对比分析

BST85226 vs P1025_PURDY_G2 电量计固件对比分析

文档概述

本文档详细对比分析两个O2Micro电量计固件工程:

  • BST85226 (ARM): 基于ARM Cortex-M0 (NEWTON芯片) 的固件工程
  • P1025_PURDY_G2 (RISC-V): 基于RISC-V (hbird-e200核心) 的固件工程

第一部分:MCU底层架构差异

1.1 处理器架构对比

对比项 BST85226 (ARM) P1025_PURDY_G2 (RISC-V)
核心架构 ARM Cortex-M0 HummingBird E200 (RISC-V)
架构版本 ARMv6-M RV32I
指令集 Thumb (16/32-bit混合) RISC-V (32-bit)
流水线 3级流水线 2级流水线
中断控制器 NVIC (嵌套向量中断控制器) PLIC (Platform-Level Interrupt Controller)
中断优先级 2位优先级 (4级) 多级可配置优先级
向量表 固定48条目 可配置向量表

1.2 内存系统对比

对比项 BST85226 (ARM) P1025_PURDY_G2 (RISC-V)
Flash地址 0x00002000 - 0x0000D400 (45KB) 0x80000300 - 0x801FFBFF (128KB)
RAM地址 0x20000000 - 0x20000C00 (3KB) 0x90000C00 (5KB)
DTCM 无独立DTCM 0x80100000 (3KB)
ITCM 无独立ITCM 代码可加载到ITCM执行
Boot ROM 0x00000000 (8KB) 集成在Flash起始地址

1.3 启动流程对比

ARM (Cortex-M0) 启动流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// startup_ARMCM0.c
__NO_RETURN void Reset_Handler(void)
{
SystemInit(); // CMSIS系统初始化
__PROGRAM_START(); // 进入C库入口
}

// 向量表结构
const VECTOR_TABLE_Type __VECTOR_TABLE[48] = {
(VECTOR_TABLE_Type)(&__INITIAL_SP), // 初始栈指针
Reset_Handler, // 复位处理
NMI_Handler, // NMI
HardFault_Handler, // 硬件故障
// ... 预留和系统异常
// 外设中断 (WDT, TIM, I2C, UART等)
};

RISC-V (E200) 启动流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# start.S
_start:
csrrci x0, mstatus, 0x8 // 全局关闭中断

la gp, __global_pointer$ // 加载全局指针
la sp, _sp // 初始化栈指针

# 从Flash加载代码到ITCM (可选优化)
la a0, _itlm_lma
la a1, _itcm
# 复制代码到指令TCM

# 加载数据段到RAM
la a0, _data_lma
la a1, _data
# 复制数据

# 初始化BSS段
la a0, __bss_start
# 清除BSS

# 初始化FPU (如果存在)
li t0, MSTATUS_FS
csrs mstatus, t0

call main // 调用main函数

1.4 中断系统对比

ARM NVIC (Cortex-M0)

1
2
3
4
5
6
7
8
9
10
// 向量表大小: 48条目 (16系统异常 + 32外设中断)
// 优先级: 2位 (4级优先级)
// 特性:
// - 自动保存/恢复寄存器
// - 硬件压栈
// - 向量中断获取

// 中断使能示例
NVIC_EnableIRQ(TIM16_1_IRQn); // 使能定时器中断
NVIC_SetPriority(TIM16_1_IRQn, 1); // 设置优先级

RISC-V PLIC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// PLIC中断控制器 (Platform-Level Interrupt Controller)
// 14个外设中断源
// 多级优先级支持

// PLIC初始化
void plic_init(void);
void plic_set_priority(int irq, uint32_t priority);
void plic_set_threshold(uint32_t threshold);
void plic_enable_interrupt(int irq);

// PLIC中断处理
void external_interrupt(void) {
int irq = plic_claim();
// 处理中断
plic_complete(irq);
}

1.5 链接脚本对比

ARM链接脚本 (newton.sct)

1
2
3
4
5
6
7
8
9
10
11
12
13
LR_IROM1 0x00000000 0x00002000 {  // 8KB Boot ROM
ER_IROM1 {...}
RW_IRAM1 0x20000000 0x00000400 { // 1KB RW data
RW_STACK {...}
RW_IRAM3 0x20000400 0x00000060 { // libspace
}
}

LR_IROM2 0x00002000 0x0000B400 { // 45KB Main Flash
ER_IROM2 {...} // 代码段
RW_IRAM2 0x20000460 0x00000BA0 { // 3KB RW data
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
MEMORY
{
flash (rxai!w) : ORIGIN = 0x80000300, LENGTH = 0x1FD00 // 128KB
ram (wxa!ri) : ORIGIN = 0x90000C00, LENGTH = 5K // 5KB
dtcm (wxa!ri) : ORIGIN = 0x80100000, LENGTH = 3K // 3KB
}

SECTIONS
{
.init { KEEP (*(SORT_NONE(.init))) } >flash

// ITCM区域 - 代码执行专用
.ilalign, .ialign { /* ITCM地址映射 */ }

// DTCM区域 - 数据访问优化
.dtcm {
*(.dtcm .dtcm.*);
./src/flash/db_print.o (.text .text.*); // 打印驱动放DTCM
./src/flash/interrupt.o (.text .text.*); // 中断处理放DTCM
} >dtcm AT>flash

.data { /* 数据段 */ } >ram AT>flash
.bss { /* BSS段 */ } >ram AT>ram
.stack { /* 栈 */ } >ram AT>ram
}

1.6 关键差异总结

特性 ARM Cortex-M0 RISC-V E200 影响
代码密度 Thumb指令优化 标准RISC ARM代码更紧凑
中断延迟 ~12周期 ~15-20周期 ARM响应更快
功耗 经过优化 可定制 取决于具体实现
工具链 Keil/GCC ARM RISC-V GCC 需分别配置
DTCM支持 RISC-V可优化数据访问
ITCM支持 RISC-V可优化代码执行

第二部分:电量计逻辑差异分析

2.1 SBS协议结构对比

共同SBS命令 (两者均有)

1
2
3
4
5
6
7
8
9
10
11
12
// 基础电池信息命令
SBS09_BATTVOLT // 电池电压 (mV)
SBS0A_BATTCURR // 电池电流 (mA, 充电正, 放电负)
SBS0B_AVGCURR // 平均电流
SBS0D_RSOC // 相对荷电状态 (%)
SBS0F_RC // 剩余容量 (mAh)
SBS10_FCC // 满充容量 (mAh)
SBS16_BATTSTATUS // 电池状态标志
SBS17_CYCLECNT // 循环次数
SBS3C_CELLMV01 // Cell1电压
SBS3D_CELLMV02 // Cell2电压
SBS80_SOH // 健康状态 (%)

特有SBS命令对比

命令 BST85226 (ARM) P1025 (RISC-V) 说明
Cell3支持 通过SBS3E_CELLMV03 通过SBS3E_CELLMV03 3S电池支持
ISRW1接口 SBS70/71/72 SBS70/71/72 微短路检测接口
LOG接口 SBS90-95 (国标/企标) SBS90-95 (国标/企标) 事件日志
国标LOG查询 SBS92/93 (GB) + SBS94/95 (Enterprise) SBSBE/SBSBF (旧) + SBSC0/SBSC1 (GB) LOG查询
校准命令 SBS8A-8E (校准) 无独立校准命令 ARM版本校准功能完整
参数访问 SBSF9 (特殊命令) SBSF9 (特殊命令) 底层参数读写
快充使能 SBS03 FastCharge位 ARM支持快充标志
生命周期 SBSB0_LIFETIME SBSB0_LIFETIME 老化记录

SBS命令定义差异

BST85226 (ARM) SBS命令枚举:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
typedef enum {
SBS03_BATTMODE, // 0
SBS09_BATTVOLT, // 1
SBS0A_BATTCURR, // 2
SBS0B_AVGCURR, // 3
SBS0D_RSOC, // 4
SBS0E_ASOC, // 5
SBS0F_RC, // 6
SBS10_FCC, // 7
SBS11_RTTE, // 8
SBS12_ATTE, // 9
SBS13_ATTF, // 10
// ... 更多命令

// ISRW1接口
SBS70_ISRW1ALERT, // 33
SBS71_ISRW1INTERVAL, // 34
SBS72_ISRW1THRESHOLD, // 35

// LOG接口 (国标/企标)
SBS90_GB_LATESTLOG, // 国标最新LOG
SBS91_ENT_LATESTLOG, // 企标最新LOG
SBS92_GB_LOG_INDEX, // 国标LOG查询索引
SBS93_GB_LOG_DATA, // 国标LOG数据
SBS94_ENT_LOG_INDEX, // 企标LOG查询索引
SBS95_ENT_LOG_DATA, // 企标LOG数据

// 校准命令
SBS8A_0CALIBRATE, // 电流零点校准
SBS8B_CHGCALIBRATE, // 充电斜率校准
SBS8C_DISCHGCALIBRATE, // 放电斜率校准
SBS8E_CALIBRATE, // 电压校准
// ...
} SBS_DATA_T;

P1025 (RISC-V) SBS命令枚举:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
typedef enum {
// 常用命令在前 (优化访问)
SBS09_BATTVOLT, // 1
SBS0A_BATTCURR, // 2
SBS0D_RSOC, // 4
SBS61_ETDK1, // 31
SBS3C_CELLMV01, // Cell1
SBS3D_CELLMV02, // Cell2
SBS3E_CELLMV03, // Cell3

// LOG接口 (不同实现)
SBSBE_GETLOGINDEX,
SBSBF_GETLOGINFO,
SBSC0_GETLOGINDEX_GB,
SBSC1_GETLOGINFO_GB,

// ISRW1接口
SBS70_ISRW1ALERT,
SBS71_ISRW1INTERVAL,
SBS72_ISRW1THRESHOLD,

// 其他命令...
SBS03_BATTMODE,
SBS0F_RC,
SBS10_FCC,
SBS11_RTTE,
SBS12_ATTE,
SBS13_ATTF,
// ...
} SBS_DATA_T;

2.2 保护机制对比

共同保护项目

保护类型 BST85226 P1025 说明
Cell1 OV 电芯1过压
Cell1 UV 电芯1欠压
Cell2 OV 电芯2过压
Cell2 UV 电芯2欠压
充电OT 充电过温
放电OT 放电过温
放电UT 放电低温
OCC 充电过流
OCD 放电过流
SC 短路保护

保护标志定义对比

BST85226 (ARM) 保护标志:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// GSTATUS保护标志定义
#define GSTATUS_PROT_HWOVCELL1 (0x00000001UL) // Cell1过压
#define GSTATUS_PROT_HWUVCELL1 (0x00000002UL) // Cell1欠压
#define GSTATUS_PROT_HWEXTOT (0x00000004UL) // 外部过温
#define GSTATUS_PROT_HWEXTUT (0x00000008UL) // 外部低温
#define GSTATUS_PROT_HWOVCELL2 (0x00000010UL) // Cell2过压
#define GSTATUS_PROT_HWUVCELL2 (0x00000020UL) // Cell2欠压
#define GSTATUS_PROT_OCC (0x00000040UL) // 充电过流
#define GSTATUS_PROT_OCD (0x00000080UL) // 放电过流
#define GSTATUS_PROT_SC (0x00000100UL) // 短路

// 状态标志
#define GSTATUS_STATE_IDLE (0x00000100UL) // 空闲态
#define GSTATUS_STATE_CHG (0x00000200UL) // 充电态
#define GSTATUS_STATE_DSG (0x00000400UL) // 放电态
#define GSTATUS_STATE_PF (0x00008000UL) // 永久故障

P1025 (RISC-V) 额外保护:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 额外保护标志
#define GSTATUS_PROT_CELL3_OV (0x00000100UL) // Cell3过压 (3S支持)
#define GSTATUS_PROT_CELL3_UV (0x00000200UL) // Cell3欠压 (3S支持)
#define GSTATUS_PROT_CHG_OT (0x00000800UL) // 充电过温 (软件保护)
#define GSTATUS_PROT_ZERO_CHG (0x00004000UL) // 零压充电禁止
#define GSTATUS_PROT_SOV (0x00008000UL) // 安全过压 (永久故障)

// 保护掩码差异
#define CHG_FET_OFF_MASK (GSTATUS_PROT_SOV | GSTATUS_PROT_HWOVCELL1 | \
GSTATUS_PROT_HWOVCELL2 | GSTATUS_PROT_OCC | \
GSTATUS_PROT_ZERO_CHG)

#define DSG_FET_OFF_MASK (GSTATUS_PROT_SOV | GSTATUS_PROT_HWUVCELL1 | \
GSTATUS_PROT_HWUVCELL2 | GSTATUS_PROT_OCD | \
GSTATUS_PROT_ZERO_CHG)

P1025独有SOV机制

1
2
3
4
5
6
7
8
9
10
11
// P1025 RISC-V版本特有SOV (Safety Over Voltage) 状态机
typedef enum {
SOV_STATE_IDLE, // 空闲
SOV_STATE_MONITORING, // 监控中
SOV_STATE_LIPRO_COUNT, // 计数中
SOV_STATE_LIPRO_ACTIVE, // 激活状态
SOV_STATE_DISABLED // 禁用
} SOV_STATE_T;

// SOV触发条件: 高SOC区域(>80%)持续过压1小时
// SOV结果: 置位PF标志, 永久关闭充电FET

2.3 LOG系统对比

LOG存储布局

项目 BST85226 (ARM) P1025 (RISC-V)
国标LOG区域 Page 34-52, 61 (20KB) Page 261+ (193KB)
企标LOG区域 Page 62 (1KB) 继承ARM布局
Page大小 1024字节 256字节

BST85226 LOG存储:

1
2
3
4
5
6
7
8
9
10
11
12
13
// Page 33: 持久化数据 (激活、校准、累计放电)
#define PAGE_PERSIST_DATA (33)
#define PERSIST_DATA_BASE_ADDR (PAGE_PERSIST_DATA * 1024) // 0x8400

// 国标LOG: Page 34-52 (19KB) + Page 61 (1KB)
#define PAGE_GB_LOG1_START (34)
#define PAGE_GB_LOG2_START (61)
#define FLASH_GB_LOG_DATA_SIZE (20 * 1024) // 20KB

// 企标LOG: Page 62 (1KB)
#define PAGE_ENTERPRISE_LOG (62)
#define FLASH_ENTERPRISE_LOG_SIZE (1 * 1024) // 1KB
#define ENTERPRISE_LOG_MAX_COUNT (100) // 最多100条

P1025 LOG存储:

1
2
3
4
5
6
// RISC-V版本使用更大Page
#define PAGE_LOG_START (257) // 企业LOG起始
#define PAGE_LOG_START_GB (261) // 国标LOG起始
#define FLASH_LOG_DATA_SIZE_1 (4 * 256) // 1KB
#define FLASH_LOG_DATA_SIZE_2 (763 * 256) // 190KB
#define FLASH_PAGE_SIZE (256) // Page大小256B

LOG_T数据结构对比

两者通用结构 (8字节):

1
2
3
4
5
6
7
8
typedef struct {
uint16_t logindex:14; // 日志索引 (14-bit)
uint16_t charge_status:2; // 0:放电, 1:充电, 2:空闲
uint16_t raw:16; // 故障原始数据 (电压/温度/电流值)
uint32_t timefw:24; // 运行时间 (分钟)
uint32_t safety_status:4; // 安全状态: 0x01=OV, 0x02=UV, 0x03=OT...
uint32_t cellnumber:4; // 触发电芯ID
} LOG_T;

P1025扩展事件类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
typedef enum {
CELL_OV = 1,
CELL_UV = 2,
CELL_OT = 3,
CELL_UT = 4,
CELL_OC = 5,
CELL_SC = 6,
CELL_ISC = 7, // 内部短路
CELL_CHG_OT = 8, // 充电过温
CELL_ZERO_VOL = 9, // 零压
CELL_SOV = 10, // 安全过压
TYPE_MAX
} Exception_Type;

2.4 SOC计算对比

共同算法特征

两者都使用O2Micro的lib_fg (Fuel Gauge Library):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 核心数据结构
typedef struct {
signed short save_max_temp; // 最大温度 (0.1度)
signed short save_min_temp; // 最小温度

unsigned short save_max_current; // 最大电流 (mA)
unsigned short save_min_current; // 最小电流

signed int cc; // 库仑计累计值
unsigned short start_soc; // 起始SOC (max 10000 = 100%)
signed short start_dodsoc; // 实际放电深度
unsigned short stop_soc; // 停止SOC

unsigned short est_fcc; // 估计FCC值
} CYCLE_DATA;

// FCC数据记录
typedef struct {
unsigned short init_fcc; // 初始FCC
unsigned short est_fcc; // 估计FCC
unsigned short update_count; // 更新次数
} FCC_DATA;

SOC初始化方法

ARM版本 (BST85226):

1
2
3
4
5
6
7
// sbsif.c
void sbsif_init(uint32_t slv_addr) {
// 1. 从Flash加载校准数据
// 2. 初始化库仑计
// 3. 执行OCV初始化
// 4. 设置初始FCC
}

RISC-V版本 (P1025):

1
2
3
4
5
6
7
8
// 更简洁的初始化
void sbsif_init(uint32_t slv_addr) {
// 直接初始化SBS接口
// 依赖库内部初始化
}

// 支持OCV初始化命令
sbsif_set_data(SBS45_SETHISTORIAGE, age_value); // 设置历史老化

2.5 TTF (Time to Full) 算法对比

两者通用算法

1
2
3
4
5
6
7
// 时间计算基础公式
// TTF (分钟) = (FCC - RC) * 60 / AvgCurrent
// TTE (分钟) = RC * 60 / |AvgCurrent|

// 放电终止时间 (RTTE)
// 平均时间到空 (ATTE)
// 平均时间到满 (ATTF)

ARM版本额外优化

1
2
3
4
5
6
// BST85226 支持更多TTF相关SBS命令
SBS11_RTTE // Run Time to Empty
SBS12_ATTE // Average Time to Empty
SBS13_ATTF // Average Time to Full
SBS60_ITDK // Instantaneous Time
SBS61_ETDK1 // Extended Temperature Time

2.6 状态机对比

两者状态机定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// IMODE (电流模式)
typedef enum {
STM_IMODE_INDSG = -1, // 放电中
STM_IMODE_IDLE = 0, // 空闲
STM_IMODE_INCHG = 1 // 充电中
} STM_IMODE_T;

// 状态机状态
typedef enum {
STM_STATE_INIT = 0x0,

STM_STATE_IDLE = 0x10, // 空闲态
STM_STATE_IDLE_START = 0x10,
STM_STATE_IDLE_RUN = 0x11,
STM_STATE_IDLE_END = 0x1E,

STM_STATE_DSG = 0x20, // 放电态
STM_STATE_DSG_START = 0x20,
STM_STATE_DSG_RUN = 0x21,
STM_STATE_DSG_LOW = 0x22, // 低电量
STM_STATE_DSG_END = 0x2E,

STM_STATE_CHG = 0x30, // 充电态
STM_STATE_CHG_START = 0x30,
STM_STATE_CHG_LOW = 0x31,
STM_STATE_CHG_RUN = 0x32,
STM_STATE_CHG_HIGH = 0x33,
STM_STATE_CHG_CV = 0x34, // 恒压阶段
STM_STATE_CHG_FULL = 0x35, // 充满
STM_STATE_CHG_END = 0x3E,

STM_STATE_SUSPD = 0x40, // 挂起态
} STM_STATE_T;

// 电源模式
typedef enum {
STM_PWRMD_FULL = 0, // 全功率
STM_PWRMD_SLEEP = 0x10, // 睡眠
STM_PWRMD_DEEPSLEEP = 0x20, // 深睡眠
} STM_PWRMD_T;

2.7 ISRW1 (微短路检测) 对比

两者ISRW1接口完全兼容:

SBS命令 功能 访问
SBS70 ISRW1告警结果 只读
SBS71 检测间隔设置 读写
SBS72 告警阈值设置 读写

ISRW1 Alert格式:

1
2
3
4
5
6
// SBS70返回数据
typedef struct {
uint8_t cell_index; // 触发电芯索引 (0-2)
uint8_t leak_current; // 漏电电流 (mA)
uint16_t reserved;
} ISRW1_ALERT_T;

第三部分:应用层差异

3.1 文件结构对比

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
BST85226 (ARM)                    P1025_PURDY_G2 (RISC-V)
├── chip/ ├── src/
│ ├── NEWTON.h │ ├── chip/
│ ├── chip_adc.h/c │ │ ├── purdy_g2.h # 寄存器定义
│ ├── chip_i2c.h/c │ │ ├── chip_adc.h/c
│ ├── chip_eflash.h/c │ │ ├── chip_i2c.h/c
│ └── ... │ │ └── ...
│ ├── bsp/
│ ├── flash/ │ │ └── hbird-e200/
│ │ ├── sbs.h/c │ │ ├── env/ # 启动/链接脚本
│ │ ├── prot.h/c │ │ ├── drivers/ # PLIC驱动
│ │ ├── log.h/c │ │ └── include/ # 头文件
│ │ ├── stm.h/c │ ├── flash/
│ │ ├── dacq.h/c │ │ ├── sbs.h/c
│ │ ├── gdm.h/c │ │ ├── prot.h/c
│ │ └── ... │ │ └── ...
│ ├── user/ │ ├── user/
│ │ ├── main.c │ │ ├── main.c
│ │ ├── sbsd.h │ │ ├── sbsd.h
│ │ ├── isrw1_*.h/c │ │ └── isrw1_*.h/c
│ │ └── ... │ ├── lib/
│ ├── lib/ │ │ └── lib_fg.h/c
│ │ └── lib_fg.h/c │ ├── table/
│ ├── table/ │ │ └── *.h/c
│ │ └── *.h/c │ └── Makefile
│ ├── RTE/ │
│ │ └── Device/ARMCM0/ │
│ └── newton.uvprojx │

3.2 编译工具链

项目 BST85226 (ARM) P1025 (RISC-V)
IDE Keil uVision Makefile + GCC
编译器 ARMCC/GCC ARM RISC-V GCC
调试器 ULINK/J-Link OpenOCD + J-Link
Makefile .uvprojx项目文件 独立Makefile

第四部分:ISRW1接口说明

4.1 接口定义

ISRW1 (Internal Short Resistance Window Detection) 用于检测电池内部微短路故障。

4.2 SBS接口命令

命令码 名称 方向 数据长度 说明
0x70 ISRW1Alert R 4字节 告警结果
0x71 ISRW1Interval R/W 4字节 检测间隔(秒)
0x72 ISRW1Threshold R/W 4字节 告警阈值(mA)

4.3 数据格式

SBS70 (ISRW1Alert) - 只读:

1
2
3
4
5
typedef struct {
uint8_t CellIndex; // [7:4] 预留, [3:0] 电芯索引 (0-2)
uint8_t LeakCurrent; // 漏电电流 (mA), 0表示无故障
uint16_t Reserved; // 保留
} ISRW1_ALERT_T;

SBS71 (ISRW1Interval) - 读写:

1
2
3
4
// 写入: 设置检测间隔 (秒)
// 读取: 获取当前设置值
// 范围: 60 - 3600 秒
// 默认: 1800 秒 (30分钟)

SBS72 (ISRW1Threshold) - 读写:

1
2
3
4
// 写入: 设置告警阈值 (mA)
// 读取: 获取当前阈值
// 范围: 10 - 500 mA
// 默认: 100 mA

4.4 后续修改说明

如需修改ISRW1相关接口,请关注以下文件:

BST85226 (ARM):

  • user/isrw1_detect.h/c - 检测算法核心
  • user/isrw1_filter.h/c - 滤波算法
  • user/isrw1_integration.h/c - SBS接口集成
  • user/isrw1_tables.h/c - OCV和内阻查找表

P1025 (RISC-V):

  • src/user/isrw1_*.h/c - 对应文件

附录A:寄存器对比速查

ARM NEWTON寄存器映射

外设 基地址 大小
FLASHCTRL 0x30000 256B
I2C 0x40000400 48B
TIMER16 0x40000800 24B
VADC 0x40000C00 128B
CADC 0x40001000 64B
DFE 0x40001400 128B
UART 0x40001800 32B

RISC-V P1025寄存器映射

外设 基地址 大小
DFE (AFE) 0x40000000 128B
FLASH 0x80000000 128KB
CLINT 0xD0000000 -
PLIC 0xE0000000 -

附录B:关键宏定义差异

宏定义 BST85226 P1025 说明
THREE_CELL_CASE 0 0 3S电池支持
CALIBRAION_EN 1 - 校准功能
PAGE_SIZE 1024 256 Flash页大小
ISRW1_INTERVAL 1800 1800 检测间隔(秒)
ISRW1_THRESHOLD 100 100 告警阈值(mA)

文档生成日期: 2026-04-02
版本: v1.0