锂电池 保护板方案 中颖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%。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1149795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多语言混合翻译难题怎么破?HY-MT1.5大模型给出答案

多语言混合翻译难题怎么破&#xff1f;HY-MT1.5大模型给出答案 在跨语言交流日益频繁的今天&#xff0c;用户对翻译质量的要求已从“能看懂”升级为“精准、自然、上下文一致”。然而&#xff0c;现实中的文本往往充满挑战&#xff1a;中英夹杂的技术文档、带格式标记的网页内…

AI万能分类器实操手册:3步调用云端API,显存不足也不怕

AI万能分类器实操手册&#xff1a;3步调用云端API&#xff0c;显存不足也不怕 引言&#xff1a;当4G显存遇上分类任务 上周我遇到一位做电商数据分析的朋友&#xff0c;他需要紧急处理10万条用户评论的情感分类。本地电脑只有4G显存的GPU&#xff0c;刚加载模型就直接崩溃——…

基于uni-app与图鸟UI的移动端重点项目管理系统

基于uni-app与图鸟UI开发的移动端重点项目管理系统&#xff0c;旨在通过数字化手段提升工程项目管理的效率与规范性。以下是对该系统的详细介绍&#xff1a;1. 项目背景与目标随着工程项目管理的日益复杂化和精细化&#xff0c;传统的项目管理方式已难以满足现代企业的需求。因…

如何选择适合工业场景的工业三防平板?

工业、物流、仓储、户外作业等复杂场景中&#xff0c;普通平板往往难以应对高低温、震动、灰尘、潮湿等严苛环境。选择一款合适的工业三防平板&#xff0c;已成为提升作业效率与设备可靠性的关键。今天&#xff0c;我们就以一款具备强悍性能与极致防护的工业平板为例&#xff0…

StructBERT中文情感分析镜像发布|CPU友好+开箱即用

StructBERT中文情感分析镜像发布&#xff5c;CPU友好开箱即用 1. 背景与需求&#xff1a;为什么需要轻量化的中文情感分析服务&#xff1f; 在自然语言处理&#xff08;NLP&#xff09;的实际应用中&#xff0c;情感分析是企业级场景中最常见的任务之一。无论是用户评论、客服…

小团队AI方案:万能分类器云端部署,成本低至1小时1块

小团队AI方案&#xff1a;万能分类器云端部署&#xff0c;成本低至1小时1块 引言&#xff1a;为什么小团队需要云端AI分类器&#xff1f; 作为3人创业团队&#xff0c;你可能经常遇到这样的场景&#xff1a;用户上传的图片需要自动分类、客服对话需要智能分流转接、产品评论需…

API函数的调用过程(下)(ring0部分)

前言&#xff1a;内核函数 return&#xff0c;并不等于系统调用结束 在上一篇文章中&#xff0c;我们已经跟踪到&#xff1a; call ebx ; ebx NtOpenProcess这条指令意味着&#xff1a;系统调用框架代码已经完成了所有“准备工作”&#xff0c; CPU 正式进入了具体内核服…

分类器持续学习:云端自动更新模型版本

分类器持续学习&#xff1a;云端自动更新模型版本 引言 想象一下&#xff0c;你经营着一家电商平台&#xff0c;每天都有数百种新品上架。传统的商品分类系统需要人工打标、重新训练模型&#xff0c;每次更新都要停机维护&#xff0c;既影响用户体验又增加运营成本。现在&…

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

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

小米应用商店ASO优化:3大核心位置助你提升关键词覆盖

在移动应用竞争日益激烈的今天&#xff0c;应用商店优化&#xff08;ASO&#xff09;成为每个开发者必须重视的环节。而在各大安卓市场中&#xff0c;小米应用商店以其庞大的用户基础和独特的后台功能&#xff0c;为开发者提供了更多关键词优化的可能性。本文将深入解析小米应用…

装车记数显示屏为物流出货环节提供精准数据支持

在现代物流供应链管理中&#xff0c;准确计数和实时监控是提高效率、降低成本的关键环节。传统的人工计数方式不仅效率低下&#xff0c;还容易出现数据错误&#xff0c;给企业带来不必要的损失。装车记数显示屏作为一种智能化解决方案&#xff0c;正在改变这一现状&#xff0c;…

视觉语音文本一体化处理|AutoGLM-Phone-9B多模态能力深度探索

视觉语音文本一体化处理&#xff5c;AutoGLM-Phone-9B多模态能力深度探索 随着移动智能设备对AI能力的需求日益增长&#xff0c;如何在资源受限的终端上实现高效、精准的多模态理解成为关键挑战。AutoGLM-Phone-9B作为一款专为移动端优化的90亿参数级大模型&#xff0c;融合视…

移动端多模态大模型部署实战|基于AutoGLM-Phone-9B高效推理

移动端多模态大模型部署实战&#xff5c;基于AutoGLM-Phone-9B高效推理 1. 引言&#xff1a;移动端多模态AI的落地挑战与突破 随着大语言模型&#xff08;LLM&#xff09;能力的持续进化&#xff0c;多模态理解与生成已成为智能终端的核心竞争力。然而&#xff0c;在资源受限…

中科数测研究院发现工业级MQTT协议组件--NanoMQ多个高危漏洞

近日&#xff0c;中科数测研究院在对工业级MQTT消息中间件NanoMQ的系统性安全测试中&#xff0c;连续发现3个可远程触发的高危漏洞&#xff0c;覆盖协议逻辑缺陷、越界读取、释放后使用&#xff08;Use-After-Free&#xff09;三大核心风险类型&#xff0c;严重威胁工业物联网&…

AI分类模型选择困难?云端AB测试轻松解决

AI分类模型选择困难&#xff1f;云端AB测试轻松解决 引言 在AI项目开发中&#xff0c;我们经常会遇到这样的困境&#xff1a;面对众多开源分类模型&#xff08;如ResNet、EfficientNet、Vision Transformer等&#xff09;&#xff0c;团队成员各执己见&#xff0c;争论哪个模…

5个热门AI分类器对比:云端GPU 3小时全试遍,省下万元显卡钱

5个热门AI分类器对比&#xff1a;云端GPU 3小时全试遍&#xff0c;省下万元显卡钱 引言 作为一名开发者&#xff0c;当你需要为项目选择一个合适的AI分类模型时&#xff0c;可能会面临这样的困境&#xff1a;GitHub上五花八门的模型让人眼花缭乱&#xff0c;本地电脑显存又不…

如何高效部署AutoGLM-Phone-9B?一文掌握本地推理全流程

如何高效部署AutoGLM-Phone-9B&#xff1f;一文掌握本地推理全流程 1. AutoGLM-Phone-9B 模型概述与核心价值 1.1 多模态轻量化设计的技术背景 随着移动智能设备对AI能力需求的持续增长&#xff0c;传统大模型因高算力消耗和内存占用难以在资源受限终端上运行。AutoGLM-Phon…

基于HY-MT1.5大模型镜像,实现多语言实时精准互译

基于HY-MT1.5大模型镜像&#xff0c;实现多语言实时精准互译 1. 引言&#xff1a;多语言互译的现实挑战与技术演进 在全球化加速的今天&#xff0c;跨语言沟通已成为企业出海、科研协作、内容传播的核心需求。然而&#xff0c;传统翻译服务在延迟高、隐私风险大、成本昂贵等方…

医疗废物智能监测:技术如何守护我们的健康与环境

医疗废物管理是医疗卫生机构中至关重要的一环&#xff0c;不仅关系到医护人员的职业安全&#xff0c;更直接影响公共卫生和环境保护。随着物联网、大数据、智能传感等技术的发展&#xff0c;医疗废物的收集、转运、暂存和处置过程正逐步实现数字化、智能化、可追溯化。今天我们…

从下载到API调用|AutoGLM-Phone-9B全链路实操指南

从下载到API调用&#xff5c;AutoGLM-Phone-9B全链路实操指南 随着移动端AI应用的爆发式增长&#xff0c;轻量化、多模态的大语言模型成为边缘计算场景下的关键基础设施。AutoGLM-Phone-9B 正是在这一背景下诞生的一款专为移动设备优化的90亿参数级大模型&#xff0c;融合文本…