做单片机这行的时间长了会发现一个挺有意思的规律新手调串口十次里有八次卡在同一个地方——串口助手上一片乱码。代码翻来覆去看不出毛病问一句“你板子上焊的晶振是多少”答案往往就对上了手里明明是12MHz的晶振代码里却按11.0592MHz算的初值。晶振频率与波特率这两个东西本质上是“源头”和“目标”的关系。晶振每秒钟振动多少次决定了芯片内部时序的基准刻度而波特率要求每一位数据在线上占据一个精确的时间宽度。两颗齿轮要咬合齿数必须对得上对不上就打滑。这篇文章想聊的就是这两颗齿轮怎么算、怎么选、怎么在现场把它调准。内容偏实操覆盖从经典8051内核到32位MCU的不同处理方式也会讲清楚那些教科书上一笔带过、但在工位上能让人熬一晚上的细节。刚入门的可以照着抄参数做过几年的可以对照着看看自己在误差分析上有没有漏项。1. 为什么晶振频率会死死卡住波特率1.1 从“数拍子”说起波特率的物理来源异步串口之所以叫“异步”是因为收发双方之间没有一根时钟线。发送方把数据一位一位推上线接收方完全靠自己内部的定时器去“猜”每一位的时间宽度然后在每一位的中间位置采样。双方唯一的约定就是那个事先说好的波特率数值比如9600对应的意思是每一位占用 1/9600 秒约等于 104.17 微秒。问题就在这儿接收方拿什么去计时这104.17微秒它没有秒表只有晶振。晶振产生一个固定频率的方波经过芯片内部的分频器、定时器最后变成“每隔多少个晶振周期触发一次”的信号。所以整条链条是晶振频率 → 系统时钟 → 定时器计数脉冲 → 定时器溢出周期 → 波特率。链条上任何一环除不尽最后落到线上的位宽就会偏。偏一点点没关系接收方在位的中间采样有一定的容错空间偏得多了采样点就滑到位的边缘甚至滑到下一位去了读出来的数据自然面目全非。打个生活化的比方你要用一把刻度尺去量一块标称10厘米的布。尺子本身刻度不准量出来的10厘米实际可能是10.8厘米。你觉得自己量得很认真但布裁出来就是长的。晶振频率就是这把尺子的刻度精度波特率就是你想要量出来的那个数。1.2 11.0592MHz 这个怪数字是怎么来的第一次看到11.0592MHz这个频率的人几乎都会问一句为什么不是12MHz这种整数答案很朴素——因为12除不尽。我们来算一笔账。经典8051内核的一个机器周期是12个晶振周期也就是说内部定时器的计数频率是 fosc/12。用11.0592MHz代入得到 11059200/12 921600 Hz。这个921600是个非常“顺”的数它等于 9600 × 96也等于 4800 × 192等于 2400 × 384等于 1200 × 768。换句话说常用的这一串波特率全都是921600的整除数。再往下走一步。串口模式1下波特率的公式是baud (2^SMOD / 32) × (fosc / (12 × (256 - TH1)))把SMOD取0、波特率取9600代进去需要 256 - TH1 11059200 / (12 × 32 × 9600) 3。3是整数TH1 253 0xFD。理论误差为零。这不是巧合11.0592MHz这个频率就是被人为“设计”出来的专门服务于串口通信。反过来看12MHz12000000 / (12 × 32 × 9600) 3.2552。定时器只能装整数你只能取3实际波特率变成 12000000 / (12 × 32 × 3) 10416.67相对9600的误差是 8.5%。这个数字非常危险下面会讲为什么。1.3 误差是怎么一步步累积成乱码的单个位的采样点偏一点接收方还能靠“在中间采样”这个机制扛住。但串口一帧数据是10位1起始位 8数据位 1停止位接收方是从起始位的下降沿开始重新对齐的然后在后续每一位的中间去采样。如果位宽偏大或偏小采样点就会一位一位地往外滑。容错边界大致是这样的采样点在位中间允许左右各偏半位也就是±50%的位宽。除以10位平均到每一位上的允许误差大约是5%。但这只是理论极限实际工程里还要扣掉晶振本身的频率公差、温度漂移、线路上的边沿畸变、以及收发双方误差的叠加。行业里比较稳妥的做法是把总误差控制在2%以内超过3%就要开始担心5%以上基本是碰运气。8.5%的误差意味着什么意味着传到第5、第6位的时候采样点已经滑出了安全区接收方读出来的就是错的数据。所以用12MHz晶振跑9600现象通常是能收到东西但全是乱码偶尔能蹦出一两个正确字符。这种“半死不活”的状态最迷惑人因为如果完全收不到你反而会去查接线收到乱码很多人第一反应是“波特率设错了”然后反复在串口助手里换波特率换一圈还是乱。提示判断是不是波特率误差导致的问题有个简单办法——把波特率降到1200再试。12MHz跑1200的误差只有 0.16%1000000/(32×26) 1201.92几乎可以忽略。如果1200能正常通信、9600乱码那基本可以锁定是频率与波特率不匹配。2. 波特率计算的全套推导与初值对照2.1 模式1下的公式拆解与反算过程经典8051内核的串口有四种工作模式日常用得最多的是模式18位数据、可变波特率。它的波特率由定时器1的溢出率决定定时器1通常配置成模式2也就是8位自动重装模式。选这个模式的原因很实在自动重装不需要在中断里手动重写初值避免了中断响应延迟带来的抖动溢出周期严格等于 (256 - TH1) 个计数脉冲。完整的推导链条是这样的。定时器1的计数脉冲频率是 fosc/12每 (256 - TH1) 个脉冲溢出一次所以溢出率是 fosc / (12 × (256 - TH1))串口模块再把溢出率除以32SMOD0或者除以16SMOD1得到最终波特率。合并起来参数含义常见取值fosc晶振频率11.0592MHz / 12MHz12经典内核的机器周期分频系数固定256 - TH1定时器重装计数值1 ~ 255SMOD波特率加倍位PCON寄存器最高位0 或 132 或 16串口模块的固定分频由SMOD决定反算的时候先假定SMOD0算出 (256 - TH1) fosc / (12 × 32 × baud)。如果结果不是整数且误差较大就试试SMOD1这时候分母里的32变成16算出来的值会减半。如果减半后正好是整数那误差就是零。57600就是一个典型例子SMOD0时需要 11059200/(12×32×57600) 0.5装不进去SMOD1时需要 11059200/(12×16×57600) 1TH1 255 0xFF完美。2.2 一张可以直接抄的初值对照表把常用波特率在两种晶振下的表现整理成表格调代码的时候直接查比每次重新按计算器靠谱得多。11.0592MHz 晶振SMOD按需设置波特率SMOD256-TH1TH1初值实际波特率误差12000240xE81200024000120xF4240004800060xFA480009600030xFD9600019200130xFD19200057600110xFF57600011520010.5不可行——12MHz 晶振同为12分频内核波特率SMOD256-TH1取整TH1初值实际波特率误差6000520xCC600.960.16%12000260xE61201.920.16%24000130xF32403.850.16%4800060xFA5208.338.51%9600030xFD10416.678.51%19200130xFD20833.338.51%表格里能看出一个很明确的界线12MHz晶振在2400及以下的波特率上是可用的误差0.16%一旦上到4800就崩。这也解释了一个常见现象——有些老设备用12MHz晶振跑1200通信几十年没出过问题有人把它改成9600立刻就废了。注意115200在11.0592MHz下不是“误差大”而是“根本算不出来”因为需要定时器每次只计0.5个脉冲。想上115200要么换晶振比如22.1184MHz同样能被整除要么换用支持1T模式每个时钟周期计一次数的增强型内核要么直接上32位MCU。2.3 别忽略晶振自身的精度这一项很多人算完分频误差是0就放心了结果批量生产的时候发现有个别板子通信不稳。问题往往出在晶振本身的精度上。普通无源晶振的标称精度常见的有±20ppm、±30ppm换算成百分比是±0.002%、±0.003%单看这一项微不足道。但要注意两个放大因素一是温度普通晶振在-20℃到70℃的全温区内容易漂到±30ppm甚至更多二是负载电容匹配如果电路上的两个负载电容选错比如该配20pF的用了12pF实际振荡频率会偏离标称值偏离量轻松超过100ppm也就是0.01%。还有一个更隐蔽的坑有些板子为了省成本用陶瓷 resonator陶瓷谐振器替代晶振精度只有±0.5%左右。这个量级单独看还能接受但它会和分频误差叠加。如果分频本身已经有1.5%的误差两者相加直接冲破3%的红线。所以我的习惯是算完分频误差之后再看一眼还有多少余量余量小于1%的方案就不要用在量产产品上。3. 晶振选型背后的取舍逻辑3.1 11.0592 与 12MHz 到底怎么选这两个频率的选择本质上是在“串口好算”和“定时好算”之间做权衡。11.0592MHz的优势全在串口前面已经算得很清楚了。它的劣势在于定时器。因为机器周期是 12/11.0592 微秒 ≈ 1.085 微秒不是整数做毫秒级延时或者定时中断的时候初值算出来必然是小数只能取近似时间越长累积误差越大。比如做1秒定时用11.0592算出来的初值和用12MHz算出来的完全是两套数字移植代码的时候容易出错。12MHz反过来机器周期正好是1微秒做延时和定时非常舒服写for(i0;i1000;i)大概就是1毫秒当然还要看编译优化和循环体指令数。所以很多教学板和实验例程都用12MHz因为那些例程重点是讲定时器和中断。真实项目里怎么定我的经验是先看通信需求。只要项目里有一个必须稳定跑9600以上的串口比如和上位机、蓝牙模块、屏通信就老老实实上11.0592MHz或者它的倍数。如果项目里串口只是偶尔打印个调试信息波特率可以压到2400那用12MHz完全没问题。最怕的是两种需求同时存在还要省一颗晶振那就得在软件上做补偿比如定时器用重装值微调麻烦且不划算。3.2 内部RC振荡器能不能顶上去现在的MCU基本都带内部RC振荡器省掉外部晶振能省两块成本加两个焊点对批量产品诱惑很大。但它和波特率的关系必须算清楚。内部RC的出厂校准精度通常在±1%左右室温、标称电压下全温区、全电压范围下能到±2%甚至±3%。这个数字单看还行但要注意它是“绝对频率偏差”会1:1地传递到波特率上。也就是说如果RC偏了2%你的9600实际就是9792接收方看到的就是2%的误差。再加上对方设备的误差很容易逼近4%。短帧、低波特率还能扛长帧、高波特率就悬了。更麻烦的是RC的频率会随温度漂移而且这种漂移不是线性的。实验室里调好的板子装到机柜里跑两个小时温度上来了通信开始偶发丢包。这种问题极难复现也极难定位。我的实际做法是分场景样机阶段、调试阶段、短距离板间通信放心用内部RC方便量产产品、长距离、高波特率、有电磁干扰的环境外部晶振该加还得加。如果成本实在压不下来至少选那种支持外部32.768kHz晶振做校准源的型号用低频晶振定期修RC能把精度拉回±0.5%以内。3.3 32位MCU是怎么把这件事变简单的换到32位MCU之后波特率的算法变了误差问题大大缓解。以常见的Cortex-M内核为例串口波特率寄存器一般叫BRR或者BAUD分成整数部分和小数部分小数部分通常是4位也就是能表示1/16的精度。公式大致是USARTDIV fCK / (16 × baud) // 16倍过采样 BRR (整数部分 4) | (小数部分 × 16)拿72MHz主频、115200波特率算一下72000000 / (16 × 115200) 39.0625。整数部分39小数部分0.0625 × 16 1BRR (39 4) | 1 0x271。实际分频值就是39.0625误差为零。即使主频除不尽4位小数也能把误差压到 1/(16×39) ≈ 0.16% 这个量级。再举个除不尽的例子8MHz主频跑115200。8000000 / (16 × 115200) 4.3403。取整数4小数0.3403 × 16 5.44取5实际分频 4 5/16 4.3125实际波特率 8000000/(16×4.3125) 115942误差 0.64%。完全可用。这就是小数分频的价值——不需要晶振频率去凑整硬件自己帮你补。有些型号还支持8倍过采样把公式里的16换成8分频值翻倍小数部分的相对精度更高。代价是采样点变少抗干扰能力略降通常在高速率、短距离的场合用。4. 从零把一路串口调到能用4.1 硬件最小系统的几个必查项软件写得再对硬件上有问题一样白搭。上电之前这几项我会逐一过一遍。晶振和两个负载电容必须紧贴芯片引脚走线尽量短下面最好不要走其他信号线。负载电容的取值按晶振规格书来常见的是12pF、20pF、22pF选错了频率会偏。有些板子在晶振下面铺了地平面这是好事能减少干扰但要注意别让引脚焊盘和地平面之间形成意外的寄生电容。串口线必须共地。这是最容易被忽略的一条。两块板子各自用独立的电源只连了TX和RX没连GND通信能通但极不稳定稍微一动就乱码。原因是两边的电平参考点不同接收方判断高低电平的阈值全乱了。TTL电平的串口GND一定要接。还要确认电平标准。芯片出来的是TTL电平0V/3.3V或0V/5V如果对面是RS232电平±12V中间必须加电平转换芯片如果对面是USB转串口模块要确认模块输出的是TTL还是RS232很多模块两种都做跳线帽插错就通不了。最后确认收发方向本机的TX接对方的RX本机的RX接对方的TX。这个错太常见了画板子的时候丝印标反、排线做成交叉还是直连搞混都会导致“能发不能收”或者完全没反应。4.2 初始化的完整代码与逐行说明以经典8051内核、11.0592MHz晶振、9600波特率为例初始化函数大概长这样#define FOSC 11059200UL // 晶振频率统一在这里改 #define BAUD 9600 void uart_init(void) { /* 定时器1模式28位自动重装 */ TMOD 0x0F; // 保留定时器0的配置 TMOD | 0x20; // 定时器1工作在模式2 /* 波特率加倍位这里取0 */ PCON 0x7F; // 清SMOD /* 计算重装值256 - fosc/(12*32*baud) */ TH1 256 - (FOSC / 12 / 32 / BAUD); TL1 TH1; // 模式2下TL1作为计数器初值同TH1 /* 串口模式18位UART波特率可变 */ SCON 0x50; // 0101 0000模式1允许接收 TR1 1; // 启动定时器1 ES 1; // 打开串口中断用中断方式时 EA 1; // 打开总中断 }这段代码里有几个地方值得单独说一下。TH1 256 - (FOSC / 12 / 32 / BAUD)这一行是整数除法编译器会自动向下取整正好对应“定时器只能装整数”的现实。用宏把FOSC单独拎出来是为了换晶振的时候只改一个地方不至于漏改。TL1 TH1这一句在模式2下其实是可选的因为模式2的重装值是TH1TL1只是第一次计数用但写上养成习惯没坏处。如果要跑19200或者57600把PCON那一行的0x7F改成0x80置位SMOD同时TH1的值按加倍后的公式算。注意PCON寄存器不可位寻址不能用SMOD 1这种写法必须整体读改写这一点初学者经常踩。换成32位MCU的话思路一样但配置方式完全不同。核心就是把算好的BRR值写进去然后使能发送和接收位、配置好数据位长度和停止位、最后使能串口。配置顺序上有个小坑很多型号要求先配好参数再使能串口如果先使能了再改波特率可能会发出一帧错误数据。这个细节在参考手册里通常有明确说明值得花两分钟确认。4.3 用示波器和回环测试验证真伪代码烧进去怎么确认波特率真的对了最直接的办法是发一个 0x55二进制01010101。这个字节在线上是标准的方波——起始位低、然后高低交替、停止位高用示波器一眼就能看出位宽。1/9600 104.17微秒。把示波器的时间轴设到100微秒/格量一个高电平的宽度如果读出来在104微秒附近说明波特率正确。如果读出来是96微秒反推实际波特率就是 1/96e-6 ≈ 10417正好对上前面算的12MHz误差值。这个测量方法比对着串口助手瞎试有效得多因为它把“到底是频率错了还是别的错了”这个判断直接做掉了。没有示波器的话退而求其次做回环测试把TX和RX短接自己发自己收。发一串已知字节比如0x00到0xFF看收到的是否完全一致。回环测试有个局限——它验证的是本机时序自洽即使波特率偏了8%自己和自己通信也是正常的因为收发用的是同一个错误时钟。所以回环通过不代表能和别的设备通信但它能排除发送/接收逻辑、中断处理、缓冲区这几个环节的问题。有逻辑分析仪就更省事了直接按波特率解码能一帧一帧地看数据。解码的时候如果发现每一位都有偏移但整体还能解出来说明误差在容错范围内如果解出来一堆帧错误那就是误差太大或者根本对不上。5. 现场排查那些让人抓头的现象5.1 常见问题速查表把实际工作中遇到过的、以及帮别人看代码时反复见到的现象整理成一张表遇到问题先对号入座。现象高概率原因验证方法处理全乱码偶尔蹦出正确字符晶振与初值不匹配误差过大示波器测位宽改用11.0592MHz或降低波特率完全无数据TX/RX接反、未共地、串口未使能万用表测通断、查SCON交叉接线、补地线、检查使能位能发不能收接收中断未开、RI未清、接收使能位未置在接收中断里打点补ES1、RI0、REN1上电正常跑一段时间后丢包内部RC温漂、电源不稳换外部晶振对比加外部晶振或做频率校准短帧正常长帧出错误差累积、缓冲区溢出缩短帧长对比减误差、加大缓冲、加校验高速率115200上不去晶振频率算不出、中断响应太慢算 256-TH1 是否为整数换晶振、改1T模式、用DMA两块板子单独都正常一联调就乱双方误差叠加、地线回路交换主从再测把两边波特率误差都压到1%内5.2 几个不写在手册里的实操心得第一个心得把晶振频率定义成全局宏而且只允许在一个头文件里定义。我见过不止一个项目不同模块里各自写了一边#define FOSC 12000000另一边写11059200最后串口模块按12M算、定时器按11.0592算两边都觉得自己是对的。这种问题排查起来非常费时间因为每个文件单独看都没毛病。第二个心得不要迷信“波特率能通就行”。误差在2%以内的时候实验室里短线和常温下确实能通但客户现场线缆长、温度高、旁边有变频器就会开始偶发丢包。这类问题最难处理因为它不是稳定复现的故障。我的做法是在设计阶段就把误差压到1%以下留出足够的余量。多花的那点功夫比后期出差现场排查便宜太多。第三个心得做波特率自适应要谨慎。有些方案用起始位的宽度去反推波特率听起来很聪明但起始位只有一个测量误差大更好的做法是用第一个字节的多个边沿来算平均同时要求第一个字节是 0x55 这种边沿密集的同步字节。即便如此自适应也只能覆盖一定范围如果对方设备的误差本身就超了怎么适应都没用。第四个心得多机通信场景下要注意地址位。有些内核的串口模式支持第9位作为地址/数据标志这时候帧长度变成11位误差容限比10位更紧。原来2%的误差勉强够用加了地址位就变成1.8%可能就翻车了。这类隐性的位宽变化在改通信协议的时候一定要重新核对一遍误差。5.3 一个真实踩过的坑换晶振忘了改电容最后分享一个我自己踩过的坑。有个项目为了降成本把原来的11.0592MHz晶振换成了更便宜的一批频率标称一样但规格书里的负载电容从20pF变成了12pF。板子上的电容没动还是按20pF焊的。结果装上去之后大部分板子通信正常有十几块间歇性乱码。查了很久才想明白负载电容偏大实际振荡频率会往低走偏离量在100ppm到200ppm这个量级也就是0.01%到0.02%。这个偏差本身不足以造成乱码但它和分频误差叠加之后把总误差从接近0推到了接近某个临界值再赶上那批板子的晶振本身精度也偏下差几个因素凑一块就出问题了。后来把电容换成12pF问题消失。这件事让我养成了一个习惯换任何与时钟相关的物料哪怕标称参数一样也要把负载电容、精度等级、温度特性这三项一起重新核对一遍。频率这个参数看着只有几个数字背后的门道比想象中多。
企业数字化 ERP 产品动态
相关推荐
hindsight决策回看系统:如何把事后聪明变成事前规则 最近半年我一直在鼓捣一套叫hindsight的个人决策回看系统,简单说就是把自己每次"事后才想明白"的瞬间当成宝贵信号,收集起来、定期回看、提炼成可执行规则。以前我一直觉得hindsight(后见之明)是个贬义词,翻… · 2026/11/3 6:08:13
晶振频率与波特率:单片机串口通信精度计算与验证 1. 先把这两个参数的关系讲透:为什么波特率总跟晶振绑在一起刚接触单片机串口的人,十有八九踩过同一个坑:代码照着例程抄,TH1 0xFD也抄了,结果接上串口助手一看,满屏都是烫嘴的乱码。换个波特率࿰… · 2026/11/3 6:08:13
TensorFlow工程实践:从生产部署到异构设备落地 1. 这不是“又一个深度学习框架”——TensorFlow 的真实定位与生存逻辑很多人第一次听说 TensorFlow,是在某篇“AI入门指南”里看到它和 PyTorch 并列出现,配图是两个并排的 logo,下面写着“选哪个?”。这种呈现方式本身ÿ… · 2026/11/3 6:08:13
Skills.md演进:从静态清单到动态能力接口 1. 项目背景与核心概念最近在整理技术文档时,发现一个有趣的现象:传统的Skills.md文件正在经历一场静默的革命。这种原本用于记录开发者技能栈的Markdown文档,正在从静态的技能清单进化为动态的能力接口。这背后反映的是整个技术行业对"… · 2026/11/3 6:44:47
MAX1968/MAX1969 TEC驱动器恒流双向控温与限流设计 简介:《max1968/max1969中文资料》面向从事热电制冷、珀尔帖模块驱动与热管理硬件设计的工程师及电子爱好者,聚焦MAX1968/MAX1969功率驱动器的中文查阅与快速选型。压缩包内为1个doc文档,约36KB,内容围绕引脚功能、操作原理与应用… · 2026/11/3 6:44:47
网络安全工程师职业发展指南:从入门到进阶 1. 网络安全工程师职业全景解析网络安全工程师这个职业在数字化时代扮演着至关重要的角色。记得我2012年刚入行时,国内专业的安全团队屈指可数,如今各类安全岗位已遍布各行各业。不同于普通IT岗位,网络安全工程师更像数字世界的"特种兵&… · 2026/11/3 6:44:47
OpenCV安装避坑指南:pip包选择、报错排查与CUDA编译 装 OpenCV 这件事,很多人第一次接触时都觉得“不就是一行 pip 命令吗”,结果半小时后还在跟ImportError: libGL.so.1或者DLL load failed大眼瞪小眼。我在不同机器、不同系统、不同 Python 版本上反复折腾过这件事,从纯 CPU 的轻量推理服务&a… · 2026/11/3 6:44:47
LLM底层技术原理入门指南:从MLP到Transformer与RLHF的跳读路径 简介:《The Document is All You Need!》是一份面向零基础读者的 LLM 底层技术原理入门 PDF,尤其适合非科班出身、希望理解大模型技术脉络的投资人、创业者与 AI 爱好者。内容从 MLP、CNN、RNN 及 LSTM/GRU、强化学习、seq2seq 与自监督学习讲… · 2026/11/3 6:44:47
AI工程从零构建实战:五层解耦架构与生产级落地 1. 这不是“搭积木”,而是亲手锻造AI系统的全流程实战“AI Engineering from Scratch”——看到这个标题,很多人第一反应是:又要学Python、调PyTorch、跑个ResNet?不。这六个单词背后,是一整套被工业界反复验证、却极少… · 2026/11/3 6:43:47
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46