单片机 ADC 读数为什么一直跳?聊聊采样与滤波
New
🌡️ 同一个稳定电压,ADC 每次读出来却忽高忽低,很多人第一反应是芯片坏了——其实多半是方法问题。
🔍 读数是怎么来的
ADC 把模拟电压按量程切成 2 的 N 次方份:12 位 ADC 就是 4096 格。理论上最小分辨一格,但真实读数会被各种噪声搅动。
[*]✔ 参考电压波动:VREF 抖 10mV,读数整体漂移
[*]✔ 电源噪声干扰:开关 ...
LED调光到底是怎么做到的?聊聊PWM的占空比魔法
New
💡 LED 能从 1% 亮度无级调到 100%,电机能精确调速还顺便省电——背后都是同一门技术:PWM。
⚡ PWM 的核心:占空比
数字引脚只有高低两种电平,没法直接输出"半个电压"。PWM 的思路是疯狂开关:一秒内 30% 时间输出高电平、70% 低电平,等效电压就是 30%。开关频率够快时,LED 和人眼都察觉不到闪烁,只觉得"变暗了"。
🔧 ...
单片机凭什么能同时跑多个任务?聊聊RTOS调度
New
⏱️ 单片机主频不到一百 MHz,凭什么能"同时"跑按键、屏幕、通信好几件事?聊聊 RTOS 的任务调度。
🔍 裸机和 RTOS 差在哪
裸机大循环是一件做完再做下一件,急事也得排队;RTOS 把功能拆成一个个任务,由内核统一安排谁上 CPU,毫秒级来回切换。
🧵 调度怎么排班
[*]✔ 每个任务有优先级,高优先级先跑
[*]✔ 同优先级按 ...
单片机上电后的第一行代码从哪来?聊聊Bootloader
New
🔌 按下复位键到 main 函数跑起来,中间发生了什么?其实芯片最先执行的不是你写的应用代码,而是固件里那段"引导程序"。
🔍 Bootloader 是干什么的
它是上电后第一段跑起来的代码,由复位向量指向,负责判断"这次启动该干什么":正常跳转到应用区,还是停留在升级模式等新固件。
💡 它常见的三个本领
[*]✔ 通过串口、USB ...
中断为什么有的能插队?聊聊NVIC优先级
New
⚡ 程序正在跑串口接收,定时器中断突然来了——谁让谁?答案藏在 STM32 的 NVIC 里。
🔍 抢占优先级 vs 子优先级
Cortex-M 的中断优先级分两层:抢占优先级决定"能不能打断别人",子优先级只决定"同时挂起时谁先响应",不能互相打断。
[*]✔ 抢占优先级数字越小,级别越高,0 是最高优先级
[*]✔ 高抢占优先级可以打断低 ...
I2C总线为什么要挂上拉电阻?聊聊开漏输出
New
🧵两根线就能挂十几个外设,I2C 简单好用,但新手常栽在第一关:总线没接上拉电阻,一测波形全是"平顶",通信直接罢工。
🔍 根子上的原因:开漏输出
I2C 的 SDA、SCL 都是开漏(开集)结构,芯片只能把线"拉到低",自己没有能力输出高电平——高电平必须靠上拉电阻从电源"拽"回来。
[*]✔ 主机和从机都只做下拉,谁都不主动 ...
单片机拷数据为什么不再靠CPU搬砖?聊聊DMA
New
⏱单片机要连续采集 8 路传感器数据,如果全靠 CPU 一个字节一个字节搬,主循环还得同时跑 PID、刷屏幕——很快你就发现,代码"变慢"了。这时候该请 DMA 出场。
🧠 DMA 到底是什么
DMA(Direct Memory Access,直接内存访问)是独立于 CPU 的搬运工外设:你告诉它源地址、目标地址和长度,它就在总线上自己搬数据,搬完发个 ...
volatile 到底防什么?编译器优化挖的坑
New
🛠️ 代码逻辑明明没错,仿真跑得好好的,一上板子就死循环——八成是编译器把你的变量“优化”掉了。
[hr]🔍一、不加 volatile 会发生什么
[*]循环被提到寄存器:while(!flag); 编译器只读一次 flag 装进寄存器,之后死等,永远看不到中断里改的值;
[*]写被省掉:连续写同一个寄存器,中间没有读,编译器认为前一次白写 ...
看门狗到底在防谁?IWDG 和 WWDG 的分工一次讲清
🐕 程序“死机”从来不是小概率事件:电磁干扰、寄存器跑飞、死循环、等一个永远不来的标志位……看门狗的哲学很朴素——
[hr]🐕一、STM32 里两条狗,防的层面不一样
[*]IWDG(独立看门狗):防“整条命没了”。由独立低速时钟(LSI)驱动,主时钟挂了它照样跑,超时就是彻底复位。兜底用,超时可放宽些(1~2 秒);
[*]WW ...
单片机为什么多用LDO供电,而很少用BUCK芯片直接供电?
单片机设计更倾向LDO供电,主要由LDO的技术特性适配了单片机供电需求,而BUCK芯片存在明显适配缺陷,具体对比分析如下:
一、LDO供电适配单片机的核心优势
[*]供电质量更稳定纯净
LDO采用线性稳压原理,无开关动作,输出纹波和噪声极低,能满足单片机内核、射频模块等对电源噪声敏感的需求,同时电压精度更高,可保 ...