我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

MCU硬件原理:电源复位时钟与寄存器操控本质

MCU硬件原理:电源复位时钟与寄存器操控本质 1. 别再背“单片机是微型计算机”——先拆开MCU的壳看清它到底在干什么很多人刚接触单片机时第一句话就是“单片机就是把CPU、RAM、ROM、I/O口集成在一块芯片上的微型计算机。”这句话没错但错在它像一张贴在玻璃上的说明书——你读得懂字却看不见玻璃后面真正运转的齿轮。我带过三十多届电子类实训学生八成人在Keil里跑通第一个LED闪烁后依然说不清为什么P1^00能让灯亮更不知道那个“0”是怎么变成3.3V电压降落在LED两端的。这不是记性问题是根本没建立对MCU物理行为的直觉。真正的MCU不是抽象的“计算机”而是一台被严格时序约束的状态机流水线。它不“思考”只按固定节奏搬运数据、比对条件、跳转地址它不“执行程序”只是把Flash里一串二进制码按地址顺序喂给指令译码器再把译码结果转化成一组硬件开关的开闭动作。比如你写P1 0xFE;编译器生成的机器码假设是75 90 FE被取指单元从Flash第0x0000地址取出送入译码器识别为“向SFR地址0x90写入立即数0xFE”随后总线控制器发出写信号数据总线把0xFE推到P1端口锁存器的输入端锁存器在下一个时钟上升沿把这组电平锁住——此时P1.0引脚才真正输出低电平电流经限流电阻流入LED负极灯亮。整个过程耗时3个机器周期对传统8051而言每个周期由12个振荡周期构成。你敲下回车那一刻芯片内部已有36次晶振脉冲在推动着电子在硅片沟道里定向移动。这解释了为什么所有入门教程都强调“晶振频率决定执行速度”也解释了为什么用11.0592MHz晶振才能得到标准波特率——不是MCU“喜欢”这个数字而是UART模块里的分频器需要整数分频比来避免累积误差。同样这也是为什么你在while(1)里加个delay_ms(1)实际延时可能偏差±15%因为编译器优化级别、函数调用开销、甚至代码在Flash中的对齐位置都会改变指令执行周期数。我曾调试一个红外解码程序死活收不到完整帧最后发现是delay_us(13)被编译器内联展开后实际执行了14.2μs导致采样点偏移半个位宽——这种误差永远无法靠“多加几个nop”来精确补偿必须回归到时钟树和定时器寄存器配置的本质。所以本文不从“什么是单片机”开始而是从你手边那块STC89C52或STM32F103的DIP-40或LQFP-48封装出发一层层剥开电源如何稳定供电、复位电路怎样确保初始态可靠、时钟信号如何驱动所有模块同步工作、指令如何在总线上流动、外设如何与CPU协同——直到你看清所谓“编程”不过是用高级语言描述一系列对硬件寄存器的读写序列而MCU本身只是一台精密的、可编程的电子开关阵列。提示别急着打开Keil或STM32CubeMX。先找一块开发板用万用表实测VCC引脚对GND电压是否稳定在5.0V51系或3.3VARM系再测复位引脚在上电瞬间是否从高电平持续拉低至少2ms。这是所有后续逻辑成立的物理前提。很多“程序不运行”的问题根源就在这一毫伏、一微秒的偏差里。2. 电源、复位、时钟——MCU的三大生命线缺一不可MCU不是插上USB线就能工作的玩具。它对供电质量、复位可靠性、时钟精度的要求远超普通数字电路。这三条线共同构成了MCU启动和持续运行的物理基础。任何一条出问题轻则程序跑飞重则芯片永久损伤。我见过太多人把开发板接上电脑后LED不亮第一反应是检查代码结果折腾两小时才发现USB口输出电压只有4.6V而51单片机要求VCC在4.5V~5.5V之间——低于下限内部稳压电路失效振荡器停振整个芯片处于亚稳态。2.1 电源不只是“有电”而是“干净且稳定”的电MCU的电源引脚VDD/VCC和地引脚VSS/GND构成电流回路。但关键不在“通电”而在“纹波控制”。以STC89C52为例其内部振荡器对电源噪声极其敏感。当VCC纹波峰峰值超过50mV时振荡频率可能漂移±5%直接导致UART通信误码、定时器计时不准。实测中若使用劣质USB线线径细、屏蔽差在同时给MCU和外接传感器供电时VCC纹波可达120mV此时即使程序烧录成功也可能在某个特定传感器读数时刻突然复位。解决方案不是换更粗的线而是本地去耦。必须在每个VCC引脚旁距离≤2mm焊接一个0.1μF陶瓷电容到GND。这个电容不是“储能”而是提供高频电流的“就近补给站”。当CPU执行一条乘法指令需多个时钟周期内部逻辑门状态翻转产生瞬时大电流PCB走线电感会阻碍电流快速响应此时0.1μF电容立即放电填补电流缺口避免VCC被拉低。我曾用示波器对比过未加去耦电容时VCC在指令执行瞬间跌落180mV加装后跌落仅7mV。这个细节教科书里常被忽略却是量产产品可靠性的分水岭。对于3.3V系统如STM32还需增加一个10μF钽电容或固态铝电解电容负责滤除低频纹波如开关电源的100kHz纹波。典型布局是VCC → 10μF → 0.1μF → MCU VCC引脚GND引脚紧邻0.1μF另一端。记住电容的ESR等效串联电阻越小越好陶瓷电容ESR约0.01Ω而同容量电解电容ESR高达1Ω——这就是为什么0.1μF必须用陶瓷。2.2 复位不是“重启键”而是“状态归零协议”复位电路的目标是确保MCU在VCC达到额定值后再维持一段足够长的低电平对高电平复位芯片则是高电平让内部所有寄存器、锁存器、状态机进入确定的初始态。常见误区是认为“按下复位键就重启”实际上如果复位信号在VCC未稳定时就释放MCU可能从Flash任意地址开始取指造成不可预测行为。以经典RC复位电路为例10kΩ电阻10μF电容串联VCC接电阻上端电容下端接地MCU复位引脚接在R-C节点。上电瞬间电容电压不能突变复位引脚被拉低随着电容充电电压指数上升当达到MCU复位阈值如STC89C52为0.7VCC时复位结束。时间常数τR×C0.1秒但实际复位时间需≥2τ≈0.2秒才能保证99%充电完成。然而若VCC上升缓慢如使用LDO稳压器RC电路可能提前释放复位信号。因此工业级设计必须采用专用复位芯片如TPS3823它内置电压检测和精确延时电路确保VCC≥4.65V并持续200ms后才释放复位。另一个致命陷阱是手动复位按钮的抖动处理。机械按键按下/释放时会产生10~100ms的电平抖动。若直接接入MCU复位引脚一次按键可能触发多次复位导致Flash擦写异常。正确做法是在按钮两端并联一个0.1μF电容利用RC滤波吸收抖动或在软件中加入“按键释放后延时20ms再确认”的消抖逻辑。我在维修一台老式温控仪时发现其频繁死机最终定位到复位按钮焊盘氧化导致接触电阻增大RC时间常数失准复位脉冲宽度不足——这再次证明复位不是功能而是可靠性基石。2.3 时钟MCU的脉搏精度决定一切没有时钟MCU就是一块死硅。时钟源分为两类外部晶振高精度常用和内部RC振荡器低成本精度差。STC89C52必须外接11.0592MHz或12MHz晶振因其UART模块的波特率发生器依赖精确分频而STM32F103可选择内部8MHz RC或外部8MHz晶振但若需USB通信则必须用外部晶振因USB要求±0.25%精度RC振荡器误差达±5%。晶振电路的关键是负载电容匹配。晶振标称频率是在特定负载电容如12pF、20pF下测得的。若电路中实际负载电容偏离标称值振荡频率将偏移。计算公式为CL (C1× C2) / (C1 C2) Cstray其中C1、C2为晶振两端的两个电容Cstray为PCB走线杂散电容通常取2~5pF。例如使用标称12pF晶振Cstray3pF则需C1C218pF因(18×18)/(1818)312。我曾调试一款基于ATmega328P的设备始终无法通过ISO11898 CAN认证最终发现是晶振负载电容用了22pF导致时钟偏移0.8%CAN位定时参数超出容限——这个偏差在示波器上看不出却足以让整个网络通信崩溃。现代MCU如STM32还引入时钟树概念一个主时钟HSE/HIS经PLL倍频后分频供给CPU、APB1、APB2等不同总线。配置不当会导致外设工作异常。例如若将ADC时钟分频系数设为0ADC模块将无时钟读数恒为0若将USART1时钟挂载在APB2分频过大波特率计算将溢出。STM32CubeMX的图形化配置看似简单但背后是上百个寄存器的协同任何一个分频系数填错都可能让某个外设“静默”。注意不要迷信“开发板能用我的板子也能用”。开发板经过严格Layout验证你的PCB若晶振走线过长1cm、靠近数字信号线、或未铺地平面将极大降低起振概率和频率稳定性。实测表明晶振走线每增加5mm长度起振失败率上升12%。3. 指令执行的本质从取指、译码到执行看懂CPU如何“干活”当你在Keil里写下P1 0xFF;编译器将其翻译成机器码如75 90 FF但这串十六进制数如何变成P1端口的8个高电平答案藏在CPU的取指-译码-执行三阶段流水线中。理解这个过程是摆脱“黑盒编程”、实现精准时序控制的前提。以经典8051架构为例其指令周期分为6个状态周期S1~S6每个状态周期含2个振荡周期即12T模式下1个机器周期12个振荡周期。3.1 取指阶段CPU如何知道下一步该读哪条指令CPU内部有一个程序计数器PC它始终指向当前要执行指令的地址。上电复位后PC被硬件强制置为0x0000因此第一条指令必然从Flash首地址开始读取。取指过程如下PC值如0x0000被送到地址总线ABUSFlash存储器根据ABUS地址将对应地址的数据如75放到数据总线DBUSCPU在S1P2时刻第一个状态周期的第二个振荡沿采样DBUS获得操作码OpcodePC自动加1指向下一字节0x0001这里的关键是地址总线和数据总线是共享的物理线路。8051采用分时复用前6个状态周期S1~S6用于取指后6个S1~S6用于执行。这意味着同一组引脚如P0口在S1~S6期间作为地址/数据总线AD0~AD7在S1~S6期间作为通用I/O口。这也是为什么P0口作地址/数据总线时必须外接上拉电阻——内部没有上拉悬空状态会导致总线电平不确定。3.2 译码阶段操作码如何变成硬件动作获得操作码75后CPU的指令译码器查表识别75代表“MOV direct, #data”指令即向直接寻址的SFR特殊功能寄存器写入立即数。译码器随即生成控制信号使能ALE地址锁存允许信号在S5P2时刻输出高电平通知外部74LS373锁存P0口的低8位地址此处为0x90即P1端口地址设置WR写信号为低电平表示执行写操作将DBUS上的立即数FF来自S6周期读取的第二字节送入数据路径这个过程完全由硬件逻辑门实现无需软件参与。你可以把它想象成一个巨大的组合逻辑电路输入是操作码和地址输出是一组控制线的电平组合。75这个数字本身没有意义它的价值在于触发了特定的硬件开关序列。3.3 执行阶段数据如何真正写入P1端口当WR信号变低且地址锁存器已锁存0x90Flash输出的FF数据便通过DBUS到达P1端口的锁存器输入端。P1端口结构是一个典型的D型触发器阵列每个引脚对应一个D触发器其D端接DBUSCP端接系统时钟在S6P2时刻Q端接引脚输出。在下一个时钟上升沿D端的数据FF的二进制11111111被锁存到Q端P1.0~P1.7全部输出高电平。这里有个易被忽视的细节端口锁存器与引脚电平并非实时同步。当你执行P1 0x00;后立即读取P1得到的仍是0xFF因为读操作读取的是锁存器Q端而非引脚实际电平。这就是所谓的“读-修改-写”问题。例如P1 ^ 0x01;CPU先读锁存器得0xFF异或后得0xFE再写回。但如果外部电路已将P1.0拉低如按键按下引脚电平为0而锁存器仍为1读取结果就是错误的。解决方案是对端口进行读操作前先向该端口写入0xFF称为“读引脚准备”确保锁存器与引脚状态一致。3.4 为什么有些指令要4个机器周期并非所有指令都遵循“取指-译码-执行”三步。MUL ABA、B寄存器相乘指令需4个机器周期因为乘法运算本身需要多个时钟周期完成。CPU内部有一个专用的乘法器硬件单元它接收A、B寄存器数据在4个机器周期内完成8×8位乘法并将结果存入A低8位和B高8位。这说明指令周期长度由硬件运算复杂度决定而非编译器随意分配。因此用_nop_()做延时必须查阅指令手册确认其周期数_nop_()在8051中为1个机器周期而不能凭感觉估算。我曾优化一个电机PID控制算法将浮点运算改为定点查表核心循环从120μs降至35μs。提速的关键不是减少代码行数而是将原本需要12个机器周期的DIV AB指令替换为只需2个机器周期的查表索引操作。这印证了一个铁律嵌入式性能优化本质是对硬件执行周期的精确掌控。提示用逻辑分析仪抓取ALE、PSEN、WR、RD等控制信号配合地址/数据总线波形你能亲眼看到指令执行的每一个时序细节。这是理解MCU最硬核的方式远胜于阅读千页手册。4. 存储器映射与访问机制Flash、RAM、SFR如何各司其职MCU的存储空间不是一块均匀的内存而是按功能严格划分的映射区域。理解这些区域的物理特性、访问方式和限制是编写高效、可靠程序的基础。混淆它们轻则程序跑飞重则擦除关键代码。以STC89C52为例其存储空间划分为片内RAM128B、特殊功能寄存器SFR128B、片外RAM64KB、程序存储器Flash8KB。这些区域在地址空间上重叠如0x00~0x7F既可指RAM也可指SFR但通过不同的控制信号RD/WR/PSEN区分访问类型。4.1 程序存储器Flash只读但可擦写Flash存储器存放程序代码和常量数据如字符串、数组。其特点是非易失性断电不丢失和写入慢、擦除更慢。STC89C52的Flash擦除以扇区Sector为单位每个扇区2KB。擦除一个扇区需10~20ms期间CPU必须等待无法执行其他指令。因此任何涉及Flash擦写的操作如IAP在线升级都必须关闭所有中断并确保供电稳定——电压波动可能导致擦除失败芯片变砖。访问Flash由PSEN程序存储器选通信号控制。当CPU取指时PSEN在S5P2时刻输出低电平选通Flash芯片。注意PSEN只在取指时有效执行MOVC A, ADPTR查表指令时也有效但执行MOVX A, DPTR访问片外RAM时无效。这意味着你无法用MOVX指令读取Flash内容——这是硬件设计的硬性隔离防止程序意外修改自身代码。4.2 数据存储器RAM与SFR的物理本质差异片内RAM0x00~0x7F和SFR0x80~0xFF虽在地址空间相邻但物理结构截然不同RAM基于SRAM单元每个字节由6个晶体管构成读写速度快1个机器周期但掉电丢失。SFR是CPU内部寄存器的映射地址如P1端口0x90、定时器TH00x8C、串口SCON0x98。对SFR的读写实质是读写CPU内部的触发器或锁存器速度与RAM相同但每个地址对应唯一硬件功能。向0x90写入数据直接改变P1端口锁存器状态向0x8C写入设置定时器高8位初值。这里有个经典陷阱SFR地址0x80~0xFF只能用直接寻址不能用间接寻址。即MOV A, R0R00x90是非法的CPU会将0x90当作RAM地址访问读到的是RAM区0x90单元的内容而非P1端口状态。必须用MOV A, P1或MOV A, 0x90。这个限制源于硬件设计间接寻址的地址总线只连接到RAM区域SFR区域由专用译码器独立寻址。4.3 片外存储器扩展地址总线如何“变身”为16位8051的P0口是分时复用的地址/数据总线。要访问64KB片外RAM需将P0口的8位地址低8位和P2口的8位地址高8位组合成16位地址。具体过程CPU将16位地址的高8位A8~A15送到P2口同时将低8位A0~A7送到P0口在ALE信号上升沿外部74LS373锁存P0口的低8位地址锁存后P0口释放用于传输8位数据D0~D7WR/RD信号控制读写方向这个过程揭示了为什么扩展片外RAM必须外接锁存器P0口无法同时保持地址和数据。而STM32等ARM Cortex-M系列MCU地址总线和数据总线是分离的如FSMC接口无需锁存器但增加了引脚数量和PCB布线难度。选择哪种架构本质是在成本、性能和设计复杂度间的权衡。4.4 Flash访问接口SPI、I2C还是并行取决于MCU设计标题中提到的“mcu内部的flash是用什么接口访问的”答案是没有统一接口取决于芯片厂商的IP集成方案。STC89C52的Flash与CPU核集成在同一硅片上通过内部总线直接访问无需外部接口。而一些高端MCU如NXP i.MX RT系列将Flash作为外部存储器通过Quad SPIQSPI接口连接支持XIPeXecute In Place即CPU直接从SPI Flash中取指执行无需先加载到RAM——这大幅节省RAM资源但QSPI时钟频率通常≤133MHz决定了最大执行速度。对于需要频繁更新的参数存储工程师常选用EEPROM或Flash模拟EEPROM。前者如AT24C02通过I2C接口访问擦写寿命100万次后者利用Flash的一个扇区用软件算法模拟EEPROM的字节级擦写实际是扇区擦除全扇区重写成本更低但管理复杂。我设计过一款智能电表将校准参数存于独立EEPROM避免因Flash擦写意外损坏计量程序——这是硬件可靠性设计的典型思路关键数据与主程序物理隔离。注意不要试图用memcpy直接拷贝Flash中的函数到RAM执行。Flash和RAM的地址空间在8051中是分离的哈佛架构memcpy操作的是数据空间无法将代码段复制到可执行空间。若需动态加载代码必须使用IAPIn Application Programming功能通过特定命令序列解锁Flash再逐字节写入。5. 外设驱动原理UART、定时器、GPIO不是“调库”而是寄存器操控外设不是魔法盒子而是由一组可编程寄存器控制的硬件模块。所谓“驱动”就是按协议向这些寄存器写入特定值配置其工作模式再通过轮询或中断方式与之交互。脱离寄存器谈外设如同不看乐谱谈演奏。以UART为例其核心寄存器仅有4个SCON串口控制、SBUF数据缓冲、PCON电源控制、TMOD定时器模式因波特率由定时器产生。5.1 UART波特率生成与帧格式的硬件实现UART通信的可靠性取决于发送方和接收方的波特率绝对一致。8051的UART波特率由定时器T1的溢出率决定。计算公式为波特率 (2SMOD× fosc) / (32 × 12 × (256 - TH1))其中SMOD是PCON寄存器的最高位0或1fosc是晶振频率。例如fosc11.0592MHzSMOD0目标波特率9600则9600 (1 × 11059200) / (32 × 12 × (256 - TH1))解得256 - TH1 256 - 253 3 → TH1 0xFD这个计算过程暴露了UART的本质它没有独立的波特率发生器而是复用定时器的计数溢出事件作为采样时钟。因此晶振频率必须是11.0592MHz的整数倍否则无法得到精确波特率。这也是为什么12MHz晶振下9600波特率误差达8%而11.0592MHz下误差为0%。帧格式1起始位8数据位1停止位由硬件逻辑门固化实现。当TXD引脚检测到下降沿起始位UART模块启动内部16倍波特率计数器在每个计数点采样RXD电平取中间点第8个计数点作为该位的有效值。这种“过采样”设计增强了抗干扰能力。我曾用示波器观察过UART波形即使RXD线上有毛刺只要毛刺宽度小于1/2位宽就不会被采样为有效数据——这是硬件层面的鲁棒性保障。5.2 定时器/计数器不只是“延时”而是事件触发引擎定时器T0/T1的本质是16位加法计数器。当工作在定时模式时它对内部机器周期脉冲计数在计数模式时对T0/T1引脚的外部脉冲计数。其核心寄存器是THx高8位、TLx低8位和TMOD模式控制。TMOD的GATE位决定计数使能条件GATE0时仅TRx运行控制位控制启停GATE1时需INTx引脚也为高电平才计数——这实现了“外部信号门控”的精密测量。一个典型应用是测量电机转速。将霍尔传感器输出接T0引脚设置为计数模式C/T1GATE1。当电机转动时霍尔信号每转产生N个脉冲T0对这些脉冲计数。同时用T1定时1秒T1溢出时读取T0计数值即可得转速RPM计数值×60/N。这里T0是“事件计数器”T1是“时间基准”二者协同构成一个完整的测量系统。若仅用软件延时精度受CPU负载影响误差可达±5%而硬件定时器误差0.1%。5.3 GPIO推挽、开漏、上拉的物理意义GPIO引脚的电气特性直接决定其驱动能力和外围电路设计。以STM32为例每个GPIO可配置为推挽输出Push-Pull内部上下两个MOSFET可主动输出高/低电平驱动能力强20mA但不能线与。开漏输出Open-Drain仅下MOSFET输出低电平或高阻态需外接上拉电阻才能输出高电平支持线与如I2C总线。上拉/下拉输入在输入模式下启用内部100kΩ电阻消除悬空状态提高抗干扰性。这些模式不是软件设置的“选项”而是对底层晶体管开关的直接控制。例如配置为开漏输出时CPU向输出寄存器写1下MOSFET关断引脚呈高阻态写0下MOSFET导通引脚接地。若外接10kΩ上拉电阻到3.3V则引脚电平为3.3V或0V。而推挽模式下写1时上MOSFET导通引脚直连VDD写0时下MOSFET导通引脚直连VSS——这才是真正的“强驱动”。我曾设计一款LED驱动电路误将GPIO配置为开漏输出外接1kΩ上拉电阻。当LED正极接VCC负极接GPIO时高电平时LED不亮因上拉电流仅0.33mA不足以点亮低电平时LED亮但电流全由GPIO吸收超出其20mA限额导致引脚发热。修正方案是改用推挽输出LED负极串220Ω电阻接GPIO正极接VCC——此时GPIO输出低电平时电流经LED、电阻流向GPIO完全在其驱动能力内。提示查看芯片数据手册的“Electrical Characteristics”章节重点关注“IOH”高电平输出电流、“IOL”低电平输出电流、“VIL/VIH”输入低/高电平阈值。这些参数决定了你的外围电路能否可靠工作。例如若MCU的VIH最小值为0.7VCC而传感器输出高电平仅3.0VVCC5V则3.0V 3.5VMCU可能无法识别为高电平——必须加电平转换电路。6. 从原理到实践一个真实项目中的架构决策链理论终需落地。我以去年交付的一款“智能灌溉控制器”为例还原一个完整项目中如何从MCU原理出发做出关键架构决策。该设备需采集土壤湿度、温度、光照强度控制水泵和风扇并通过LoRa上传数据。主控选用STM32L432KCCortex-M448MHz256KB Flash64KB RAM。6.1 为什么选STM32L4而非ESP32表面看ESP32集成Wi-Fi/蓝牙成本更低。但深入分析MCU特性功耗需求设备由太阳能板锂电池供电要求待机电流10μA。STM32L4的Stop模式电流为2.3μAESP32的Deep Sleep模式为150μA——相差65倍意味着STM32L4可续航12个月ESP32仅2周。Flash可靠性灌溉环境潮湿Flash需频繁记录传感器日志。STM32L4的Flash支持10万次擦写且内置ECC纠错ESP32的Flash无ECC长期潮湿环境下位翻转风险高。外设匹配土壤湿度传感器输出模拟电压需高精度ADC。STM32L4的ADC为12位INL积分非线性±1.5LSBESP32的ADC为12位但INL达±8LSB且受WiFi射频干扰严重。这个选择不是“品牌偏好”而是对MCU数据手册中“Power Consumption”、“Flash Endurance”、“ADC Accuracy”等参数的量化比较。工程师的决策必须扎根于物理参数。6.2 为什么UARTLoRa而非直接用WiFiLoRa模块SX1276通过SPI与MCU通信但为何不选ESP32内置WiFi因为协议栈开销WiFi协议栈TCP/IP占用约80KB Flash和32KB RAM而STM32L4剩余Flash仅120KB需存放Bootloader、App、OTA固件、日志——WiFi会挤占关键资源。实时性灌溉控制需在100ms内响应传感器变化。WiFi协议栈的中断延迟不可控可能达50ms而LoRa的SPI通信延迟稳定在20μs。网络拓扑农田部署数十个节点WiFi的星型拓扑易受中心路由器故障影响LoRa的星状网状混合拓扑单节点故障不影响全局。这里“架构”不是画一张UML图而是权衡资源占用、实时性、可靠性后的物理实现选择。每个外设接口SPI/I2C/UART的选择都对应着MCU内部总线带宽、DMA通道、中断优先级的硬性约束。6.3 如何实现“掉电保存关键参数”系统需在电池耗尽前将最后的土壤湿度值、水泵运行时长等参数存入非易失存储。方案有三片内Flash模拟EEPROM用1KB Flash扇区软件实现磨损均衡。优点零成本缺点擦写1000次后扇区失效而设备设计寿命10年
返回列表