STM32学习笔记
这两天一直在跟着铁头山羊学 STM32前面更多是在熟悉实验节奏、理解输入输出、适应单片机开发这种“代码控制硬件”的思路。而到了这一步明显感觉学习内容开始上强度了。如果说前面的实验更偏“看懂现象、跑通流程”那现在已经开始进入一个新的阶段不仅要知道程序能跑还要开始思考程序为什么这么组织、为什么这样写效率更高、为什么有些方法适合简单实验、有些方法更适合实际开发。今天学习下来最大的感受就是STM32 的核心不只是外设本身而是如何用合理的程序结构去管理外设行为。这也是我开始觉得嵌入式真正有意思的地方。一、学习开始“成体系”了不再只是做单个实验最近这部分内容学下来我越来越明显地感觉到STM32 不是一堆零散实验的堆叠而是在逐渐形成一个完整体系。前面学 GPIO 输出、输入检测、延时的时候还能把它们看成一个个单独模块。但到了现在很多东西已经开始自然地串起来了输入负责感知外部状态判断逻辑决定程序走向输出负责执行结果延时影响现象节奏中断则开始改变程序响应方式一旦把这些内容连在一起看就会发现 STM32 真正学的不是“某个实验怎么做”而是如何建立一个能持续运行、能实时响应、能处理外部事件的程序模型。这和之前单纯写几个函数、跑几个现象已经完全不是一个感觉了。二、对“按键实验”这类输入响应的理解更深入了学到这里我对按键类实验的理解明显比前面更深了一层。以前看到按键实验第一反应就是“按下去有反应松开没反应或者按一次切换一次状态。”但现在再回头看会发现它其实一点都不简单。按键实验的本质不是读一个电平而是处理一个事件这是我今天理解上比较大的变化。表面上看按键实验只是读取某个输入引脚状态。但如果从程序设计角度看按键不是一个简单电平而是一个“事件源”。也就是说程序不是单纯在看当前电平高低而是在处理有没有按下是什么时候按下按下后要触发什么动作是否允许重复触发如何避免误判这样一想按键实验的难度一下就上来了。因为它已经不只是“读输入”而是开始涉及事件判断、状态切换、逻辑控制这些内容了。程序开始需要考虑“响应质量”按键实验还有一个让我印象很深的点就是它会逼着你去思考程序到底是“能响应”就够了还是要“响应得合理”因为在单片机里检测到按键只是第一步。更重要的是程序要能在合适的时机做出合适的反应。比如有些逻辑下按键一次应该只触发一次有些逻辑下按住和短按又可能代表不同含义。虽然我现在还没完全学到特别复杂的按键处理但已经明显感觉到这里面的东西远不止表面这么简单。三、开始真正理解“中断为什么重要”学到这一步我对中断终于不再只是停留在“这是个后面很重要的知识点”这种模糊印象上了。以前总觉得中断就是比轮询高级一点的东西。但现在结合前面的输入检测、按键实验再去看中断的重要性一下子就直观了很多。轮询的核心问题越来越明显随着实验越来越多轮询方式的问题也越来越藏不住了。轮询的思路很直接就是程序一直在那里反复检查某个状态。这种方式在前期入门确实很好理解但它的问题也很明显程序会一直消耗时间去检查实时性依赖于轮询频率如果同时要处理多个任务结构会越来越臃肿代码会越来越像“到处都在等、到处都在看”一开始实验简单时这种问题不明显。但一旦内容开始变复杂你就会发现轮询越来越像一种“能用但不优雅”的方案。中断的价值在于“有事再处理”我现在对中断最朴素的理解就是一句话没事的时候程序可以先干别的等事件真的来了再马上去处理。这个思想特别关键。因为它改变的不是某一段代码写法而是整个程序的运行方式。轮询是程序不断去问“有没有事有没有事”而中断更像是“平时你先正常运行真有事我再叫你。”这个区别一旦想明白就会觉得中断的设计真的很聪明。它本质上是在提升程序对外部事件的响应效率和组织能力。学中断实际上是在学更合理的程序结构今天最大的感受之一就是中断看起来像一个外设知识点但本质上其实是在教我们如何写出更合理的程序结构。因为有了中断之后主循环、中断服务函数、状态变量、事件处理这些概念都开始有了更明确的分工。程序不再是一个“死循环里堆满所有逻辑”的东西而是开始出现层次感。我觉得这一步很重要。因为这意味着 STM32 学习开始从“功能实现”往“结构设计”过渡了。四、对“主循环”这件事的理解开始变了前面学的时候总觉得主循环就是不断执行代码的地方。但现在慢慢发现主循环其实不是一个随便堆逻辑的垃圾桶它应该承担的是程序运行框架的作用。主循环不应该什么都干以前写实验时很容易把所有东西都塞进 while(1) 里。表面上这没问题很多初学实验也确实是这么写的。但学到现在已经能感觉到这种写法的局限。因为如果所有任务都堆在主循环里逻辑会越来越乱不同任务互相影响响应效率会下降后面维护会越来越困难这也让我越来越意识到主循环更适合放“持续运行的框架逻辑”而不是把所有细节都硬塞进去。程序开始有“前台”和“后台”的味道了虽然我现在还没学到特别系统的任务调度或者 RTOS但已经隐约能感觉到一种分工思路主循环负责整体运行中断负责处理突发事件状态变量负责在不同逻辑之间传递信息这种感觉特别有意思。因为它说明 STM32 程序不再只是“从上到下执行”而是开始有了更接近真实系统的运行方式。五、开始意识到“状态”这个概念有多重要最近做实验的时候还有一个理解上的变化特别明显就是我开始更注意“状态”了。以前看程序更多关注的是“这一句在干什么”。现在开始会注意当前程序处于什么状态输入变化后状态怎么改变状态变化后输出怎么跟着变不同状态之间如何切换这个视角一出来很多实验立刻就变得更清楚了。很多现象其实都是状态切换的结果比如某个按键按下后切换输出结果这种实验表面上看是“按键控制某个效果”但从程序角度看本质上就是输入触发事件程序修改状态输出根据状态改变表现所以以后再看一些实验我觉得不能只盯着“用了什么函数”更应该去看它背后的状态流转。会看状态程序就没那么乱了STM32 学习很容易遇到一个问题就是代码一多就觉得乱。但如果换成“状态”的视角去看很多逻辑就能被整理得更清楚。也就是说不是每次都盯着某一句执行语句而是先搞懂这个程序一共有几种状态状态是怎么变化的每种状态下外设表现是什么这样一来很多原本零碎的代码就能被串起来。六、今天最大的进步不是学会了什么而是开始知道该怎么思考了说实话STM32 学到这里我觉得最大的进步已经不完全是“又学了一个新知识点”而是开始慢慢知道面对一个实验应该用什么角度去分析。以前我更关注这段代码要不要背这个函数是干什么的为什么能跑出这个现象现在我会更关注这个实验的输入是什么输出是什么中间判断逻辑是什么用的是轮询还是中断程序结构是否合理后面如果功能增加这套写法还能不能撑住虽然现在理解还远远谈不上很深但这种思考方式的变化我觉得特别重要。因为它决定了后面学东西是越来越清楚还是越来越乱。七、这一阶段踩坑之后我总结出几个很现实的学习经验学到现在已经能明显感觉到STM32 不是那种“看懂视频就等于学会”的内容。很多东西必须自己在实验里反复碰、反复改、反复想才能真正变成自己的理解。不要只记代码写法要记程序模型单纯记某几句初始化代码其实意义没那么大。更重要的是知道为什么要初始化为什么这样组织逻辑什么时候该放主循环什么时候该交给中断状态之间怎么传递这样后面遇到新实验才不会一换题目就不会了。实验现象一定要和程序结构一起看以前容易把“现象”和“代码”分开看。现在越来越觉得两者必须放在一起理解。因为现象不是随机出现的它一定是程序结构、输入变化、输出控制共同作用的结果。只有把这几部分对应起来学习才算真正有效。现在学得慢一点后面反而更轻松STM32 很容易让人着急尤其是一看到后面还有中断、定时器、串口、PWM、ADC就会忍不住想快点往后赶。但学到现在我越来越觉得前面这些输入响应、程序结构、状态理解如果没打牢后面会越来越吃力。所以现在宁愿慢一点也要尽量把逻辑搞清楚。八、接下来最想继续啃的内容学到这里我对后面的内容期待值反而更高了。因为现在已经不只是“想学新模块”而是开始带着问题去学中断到底怎么和主循环配合按键处理怎样才能更稳定定时器是不是能替代很多简单延时方案串口通信在程序结构里应该扮演什么角色多个功能一起运行时程序该怎么组织才不乱我觉得一旦这些内容继续往下学前面这段时间积累的理解会真正开始发挥作用。九、总结学到这里STM32 给我的感觉已经明显和最开始不一样了。刚开始的时候它更像是一门“要学很多配置和外设”的课程但现在慢慢发现它真正吸引人的地方在于你是在通过代码搭一个能感知外部变化、能及时做出响应、还能维持稳定运行的小系统。这种感觉和单纯写算法题、写普通程序完全不一样。这段学习里我觉得自己最重要的收获有三点第一开始真正理解按键、输入响应这类实验背后其实是在处理事件。第二越来越明白中断的重要性本质上是在优化程序响应方式。第三开始意识到程序结构、状态管理、主循环分工这些东西才是 STM32 后面越学越深的关键。现阶段最想对自己说的一句话就是别急着追求“学了多少模块”先把“程序为什么这样组织”想清楚。只要这个思路建立起来后面很多内容都会慢慢顺起来。以上就是这阶段跟着铁头山羊学习 STM32 的一篇记录。这次明显感觉内容开始上强度了已经不再只是“做个实验看看现象”而是开始逼着自己去理解程序结构、响应方式和状态变化这些更底层的逻辑。这种过程虽然比前面更烧脑但也更有意思。后面如果继续学到更具体的中断、定时器或者串口部分我应该还会继续整理下来。