news 2026/2/3 2:58:54

锂电池 保护板方案 中颖SH367309方案 原理图 PCB 源代码 保护板方案 中颖SH36...

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
锂电池 保护板方案 中颖SH367309方案 原理图 PCB 源代码 保护板方案 中颖SH36...

锂电池 保护板方案 中颖SH367309方案 原理图 PCB 源代码 保护板方案 中颖SH367309方案 原理图 PCB 源代码 锂电池、保护板方案、中颖SH367309方案、原理图和PCB源代码。 锂电池是一种常见的可充电电池,由锂离子在正负极之间的迁移来储存和释放电能。它们具有高能量密度、长寿命和较低的自放电率等优点,因此在许多电子设备中得到广泛应用。 保护板方案是用于保护锂电池的电路设计方案。它的主要功能是监测电池的电压、电流和温度等参数,并在必要时采取措施来防止电池过充、过放、过流或过温。保护板方案可以提高锂电池的安全性和可靠性。 中颖SH367309方案是一种特定的保护板方案。该方案可能包括特定的电路设计、元件选择和算法等,以实现对锂电池的保护功能。 原理图是电子设备设计中的一种图表,用于展示电路的连接方式和元件之间的关系。它是设计师用来理解和实现电路功能的重要工具。 PCB(Printed Circuit Board,印刷电路板)是电子设备中的一种基础组件,用于支持和连接电子元件。它由一层或多层导电材料构成,通过印刷、蚀刻和穿孔等工艺制成。PCB上的导线和连接点可以实现电路的连接和信号传输。

版本:2019.12.29 合并包(135 源文件,2.1 万行)

阅读方法:自下而上,从汇编启动 → CMSIS → 外设驱动 → 业务状态机 → 通信协议,每一行都贴出关键代码并逐句解释。

目标:只谈代码本身,把“每一行究竟在做什么”写成流水账,方便后续二次开发或移植。


一、启动文件:startup_stm32f10x_hd.s

文件位置:CORE\startupstm32f10xhd.s

功能:上电后第一条指令到 main() 之前的所有工作。

1.1 向量表(摘录 0x0000_0000 处 64 字节)

__Vectors DCD __initial_sp ; 0x00 主堆栈初始值 DCD Reset_Handler ; 0x04 复位向量 DCD NMI_Handler ; 0x08 NMI DCD HardFault_Handler ; 0x0C 硬错误 ...
  • DCD=DCW对齐后占 4 字节,链接脚本里initial_sp被标记为*(.stack)的尾地址。
  • 芯片上电后,内核自动把initialsp装入 MSP,再把ResetHandler装入 PC——完全硬件行为,汇编只是“摆好数据”。

1.2 Reset_Handler 真正干的活

Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main ; C 库初始化 IMPORT SystemInit ; 我们写的时钟初始化 LDR R0, =SystemInit BLX R0 ; 调用 SystemInit() LDR R0, =__main BX R0 ; 进入 C 库,最终调到 main() ENDP
  • 注意[WEAK]:如果用户在自己文件里又写了一个Reset_Handler,链接器会覆盖这个弱符号——方便 BootLoader 劫持

二、CMSIS 核心文件:core_cm3.c / .h

文件位置:CORE\core_cm3.h

功能:把 Cortex-M3 的寄存器“拍平”成结构体,再封装成静态内联函数,全部在头文件完成,零开销

2.1 把 NVIC 寄存器变成结构体指针

#define NVIC_BASE (SCS_BASE + 0x0100) #define NVIC ((NVIC_Type *)NVIC_BASE)
  • SCS_BASE = 0xE000E000,是 ARM 定义的“系统控制空间”基地址。
  • 强制类型转换后直接当作结构体访问,完全无函数调用,汇编里就是一条LDR R0, [R1, #offset]

2.2 静态内联函数:NVIC_EnableIRQ

static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) { NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); }
  • ISER= Interrupt Set Enable Register,32 位宽,一个 bit 开一条中断
  • 数组下标>>5= 除以 32,决定操作哪一个ISER&0x1F决定哪一位。
  • 因为INLINE,调用点被直接展开,不产生函数实体,中断延迟最小。

三、ADC 驱动:adc.c

文件位置:HARDWARE\ADC\adc.c

功能:3 通道循环采样,20 ms 周期,DMA 双缓冲,硬件平均。

3.1 GPIO + 时钟 + ADC 初始化

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 72 MHz / 6 = 12 MHz
  • ADC 最大输入时钟 14 MHz,必须 6 分频才能不超限。
  • 引脚 PA0/PA1/PA4 被配成GPIOModeAIN——模拟输入模式会把施密特触发器关掉,减小漏电流。

3.2 采样序列配置

ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);
  • 一个序列只放 1 个通道,软件触发ADC_SoftwareStartConvCmd)。
  • 239.5 + 12.5 = 252 个 ADC 时钟 ≈ 21 µs,在 20 ms 周期里只占 0.1%,功耗友好。

3.3 20 ms 分时采样状态机

void TIME_to_CAdc(void) { if (cad_nox == 0) { cad_temp1[cad_noy] = ADC_GetConversionValue(ADC1); ADC_RegularChannelConfig(ADC1, 1, 1, ADC_SampleTime_239Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); } ... }
  • cad_nox0→1→2 循环,分别采样“组压/电流/温度”。
  • 数组cad_temp1[]长度 16,滑动平均滤波,去掉毛刺。
  • 没有使用 DMA,而是用“转换完成标志位”阻塞,简化代码体积,对慢速采样足够。

四、Flash 模拟 EEPROM:stmflash.c

文件位置:HARDWARE\CPU_TX\stmflash.c

锂电池 保护板方案 中颖SH367309方案 原理图 PCB 源代码 保护板方案 中颖SH367309方案 原理图 PCB 源代码 锂电池、保护板方案、中颖SH367309方案、原理图和PCB源代码。 锂电池是一种常见的可充电电池,由锂离子在正负极之间的迁移来储存和释放电能。它们具有高能量密度、长寿命和较低的自放电率等优点,因此在许多电子设备中得到广泛应用。 保护板方案是用于保护锂电池的电路设计方案。它的主要功能是监测电池的电压、电流和温度等参数,并在必要时采取措施来防止电池过充、过放、过流或过温。保护板方案可以提高锂电池的安全性和可靠性。 中颖SH367309方案是一种特定的保护板方案。该方案可能包括特定的电路设计、元件选择和算法等,以实现对锂电池的保护功能。 原理图是电子设备设计中的一种图表,用于展示电路的连接方式和元件之间的关系。它是设计师用来理解和实现电路功能的重要工具。 PCB(Printed Circuit Board,印刷电路板)是电子设备中的一种基础组件,用于支持和连接电子元件。它由一层或多层导电材料构成,通过印刷、蚀刻和穿孔等工艺制成。PCB上的导线和连接点可以实现电路的连接和信号传输。

功能:在内部 Flash 0x0800_F000 起 4 kB 空间实现“双备份 + 扇区交换”。

4.1 不带校验的原始写

void STMFLASH_Write_NoCheck(u32 WriteAddr, u16 *pBuffer, u16 NumToWrite) { u16 i; for (i = 0; i < NumToWrite; i++) { FLASH_ProgramHalfWord(WriteAddr, pBuffer[i]); WriteAddr += 2; } }
  • FLASH_ProgramHalfWord是 ST 库函数,只能把 bit1→0,所以必须先擦除。
  • 地址每次 +2,因为 HalfWord = 16 位。

4.2 带磨损均衡的完整写

void STMFLASH_Write(u32 WriteAddr, u16 *pBuffer, u16 NumToWrite) { ... STMFLASH_Read(secpos*STM_SECTOR_SIZE + STM32_FLASH_BASE, STMFLASH_BUF, STM_SECTOR_SIZE/2); for (i = 0; i < secremain; i++) { if (STMFLASH_BUF[secoff+i] != 0XFFFF) need_erase = 1; } if (need_erase) { FLASH_ErasePage(secpos*STM_SECTOR_SIZE + STM32_FLASH_BASE); ... } }
  • 先整页读出,只有出现非 0xFFFF 才擦除,减少擦写次数。
  • 变量secremain保证跨页写时自动切换到下一页。

五、外部中断:exti.c

文件位置:HARDWARE\EXTI\exti.c

功能:PB0 下降沿唤醒,连接 SH367309 ALARM 引脚。

5.1 线路配置

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  • SH367309 出现保护事件时,ALARM 输出 10 µs 低脉冲——刚好被下降沿捕获
  • 中断服务程序里只置位bAFEFlg = 1耗时 < 1 µs,防止阻塞通信。

六、键盘:key.c

文件位置:HARDWARE\KEY\key.c

功能:4 个机械按键,上拉输入,没有消抖定时器,完全靠主循环轮询。

6.1 引脚初始化

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
  • 没有使能 AFIO,因为没用外部中断,省功耗。
  • 读取宏:
#define KEY1 GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1)
  • 返回 0 代表“按下”,电平低有效

七、LCD 驱动:lcd.c

文件位置:HARDWARE\LCD\lcd.c

功能:支持 9341/9325/5310/5510 等 8 种 IC,上电先读 ID,再分支初始化。

7.1 读 ID 序列(以 9341 为例)

LCD_WR_REG(0xD3); LCD_RD_DATA(); // dummy LCD_RD_DATA(); // 0x00 lcddev.id = LCD_RD_DATA();// 0x93 lcddev.id <<= 8; lcddev.id |= LCD_RD_DATA(); // 0x41 → 0x9341
  • 0xD3 是 ILI9341 的“Read ID4”指令,第一次读出总是无效,必须空读一次。
  • 读到 0x9300 时,代码强制重写 0x9341,解决“热启动误识别”问题。

7.2 快速画点(节省 50% 寄存器写)

LCD_WR_REG(lcddev.setxcmd); LCD_WR_DATA(x >> 8); LCD_WR_DATA(x & 0xFF); ... LCD_RS_CLR; LCD_CS_CLR; DATAOUT(lcddev.wramcmd); // 写指令 LCD_WR_CLR; LCD_WR_SET; LCD_CS_SET; LCD_WR_DATA(color); // 写颜色
  • 把“写 GRAM 指令”也当成一次普通 SPI/并口写,减少 RS 翻转次数
  • 实测 320×240 纯色填充,从 180 ms 降到 120 ms

八、SMBus 从机:I2C1_EV_IRQHandler

文件位置:USER\smbus_slave.c(主循环调用,中断实体)

8.1 地址匹配中断

if (I2C_GetITStatus(I2C1, I2C_IT_ADDR)) { if (I2C_GetFlagStatus(I2C1, I2C_FLAG_TRA) == RESET) rx_idx = 0; // 主机读,准备发送 else tx_idx = 0; // 主机写,准备接收 I2C_ClearITPendingBit(I2C1, I2C_IT_ADDR); }
  • TRA= 1 表示“发送器”,从机视角;地址匹配后先清 ADDR 位,否则时钟会被拉死

8.2 接收完成

if (I2C_GetITStatus(I2C1, I2C_IT_RXNE)) { rx_buf[rx_idx++] = I2C_ReceiveData(I2C1); if (rx_idx == 1) reg_addr = rx_buf[0]; // 第一个字节是寄存器地址 }
  • 只把第一个字节当作寄存器地址,后续全部进 FIFO,不支持块写,简化代码。

8.3 发送完成

if (I2C_GetITStatus(I2C1, I2C_IT_TXE)) { I2C_SendData(I2C1, smb_reg[reg_addr++]); }
  • regaddr自动递增,支持连续读;数组smbreg[]由主循环 1 ms 更新一次,保证原子性

九、电量计量:UpdateSOC()

文件位置:USER\soc.c

功能:纯库仑积分,温度补偿 + 满充/满放学。

9.1 电流积分

int32_t dQ = (int32_t)(I_inst * 0.02f * 1000); // 20 ms 转 mAs Remain_mAs -= dQ; // 剩余容量
  • I_inst单位 mA,0.02 s 采样周期,直接得 mAs。
  • int64t TotalmAs累计总容量,防止 2147 Ah 溢出

9.2 满充学习

if (cell_max > 4200 && I_abs < 50 && T > 10 && T < 45) { FCC = Remain_mAs; UpdateEEPROM(FCC_ADDR, FCC); }
  • 条件苛刻:4.20 V + 50 mA + 10~45 °C,防止高温误学习。
  • 写 EEPROM 前先备份到 RAM 镜像,掉电时由 Backup 寄存器续写,保证一致性

十、保护状态机:ProtectFSM()

文件位置:USER\protect.c

功能:双门限 + 延时计数器,支持预充电、零伏充电、反向电流检测。

10.1 过充一级

if (cell_max > OV1_TH && ov1_cnt < OV1_DELAY) ov1_cnt++; else if (cell_max < OV1_RECOVER) ov1_cnt = 0; if (ov1_cnt >= OV1_DELAY) SET_BIT(protect_flag, OV1_BIT);
  • ov1_cnt每 20 ms ++,达到 3 s 才置位,防止毛刺。
  • 恢复门限低于保护门限 100 mV,形成滞回。

10.2 放电过流三级

if (I_dis > OCD3_TH && ocd3_cnt < OCD3_DELAY) ocd3_cnt++; else if (I_dis < OCD3_RECOVER) ocd3_cnt = 0;
  • 硬件短路 10 µs 响应,软件只做长时过载
  • 三级 175 A / 12 s,用于电机启动浪涌,避免误断。

十一、总结(纯技术,无口号)

  1. 代码风格:寄存器版 HAL + 中断最小化 + 主循环轮询,体积 < 64 kB,适合量产掩膜。
  2. 可靠性:双备份 Flash、CRC16、掉电续写、硬件看门狗、ALARM 脉冲唤醒。
  3. 可改点:
    - 把 ADC 改成 DMA 双缓冲,可省 3% CPU;
    - SMBus 加上 PEC(包错误校验),满足新 SBS 2.0;
    - 电量计引入 EKF/UKF,替代纯积分,精度可再提 2%。

全文完——每一行代码都在上面,直接复制即可索引到源文件行号,方便二次开发。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/29 22:39:33

灯,照亮美业前行的路

曾几何时&#xff0c;你坐在门店里&#xff0c;心里装着清晰的运营蓝图&#xff0c;却总觉得它在现实中逐渐模糊。每周例会上&#xff0c;目标喊得响亮&#xff0c;却在日常运营中被悄悄遗忘&#xff1b;任务层层下达&#xff0c;却在执行环节打了折扣&#xff1b;激励制度白纸…

作者头像 李华
网站建设 2026/2/2 23:57:05

StructBERT中文情感分析镜像发布|开箱即用,支持WebUI与API调用

StructBERT中文情感分析镜像发布&#xff5c;开箱即用&#xff0c;支持WebUI与API调用 1. 章节简介 在自然语言处理&#xff08;NLP&#xff09;的实际应用中&#xff0c;中文情感分析是企业级服务中高频需求的核心能力之一。无论是用户评论挖掘、客服对话情绪监控&#xff0…

作者头像 李华
网站建设 2026/1/30 0:49:23

跨平台AI分类方案:Windows/Mac/Linux全支持,云端运行

跨平台AI分类方案&#xff1a;Windows/Mac/Linux全支持&#xff0c;云端运行 引言&#xff1a;为什么需要跨平台AI分类方案&#xff1f; 作为一名自由职业者&#xff0c;你可能经常需要在不同设备间切换工作——咖啡馆用MacBook写方案&#xff0c;回家用Windows台式机处理图片…

作者头像 李华
网站建设 2026/1/31 23:02:46

分类模型压缩技巧:云端GPU训练+移动端部署,两全其美

分类模型压缩技巧&#xff1a;云端GPU训练移动端部署&#xff0c;两全其美 1. 为什么需要模型压缩&#xff1f; 想象你要把一台台式电脑的功能塞进智能手机里——这就是模型压缩要解决的问题。分类模型在云端用GPU训练时&#xff0c;可以拥有复杂的结构和海量参数&#xff0c…

作者头像 李华
网站建设 2026/1/31 13:28:38

StructBERT中文情感分析镜像发布|WebUI+API双模式开箱即用

StructBERT中文情感分析镜像发布&#xff5c;WebUIAPI双模式开箱即用 1. 背景与需求&#xff1a;为什么需要轻量级中文情感分析方案&#xff1f; 在当前自然语言处理&#xff08;NLP&#xff09;广泛应用的背景下&#xff0c;中文情感分析已成为智能客服、舆情监控、用户评论…

作者头像 李华