前言如果你是从这个专栏第一篇文章一路看过来的那恭喜你咱们终于走到结业这一步了。说实话当我写完专栏里最后一篇笔记时我坐在电脑前愣了一会儿——原来江科大那个几十小时的入门教程我真的一点一点啃完了。从最开始连GPIO_Init函数都要对着视频敲到现在能独立配置一个带中断、DMA、多外设联动的小模块这段路说长不长说短也不短。但这篇不是来煽情的。我想做的是把这个专栏里散落的知识点串成一张网顺便把我这一路上踩过的坑、有过的困惑、突然开窍的瞬间原原本本地分享给你。如果你也正在学STM32或者刚刷完江科大的视频感觉好像懂了又好像没懂那这篇文章应该能给你一点方向。二、专栏内容回顾我们都学了啥STM32学习专栏点击跳转这个专栏跟着江科大的视频节奏基本上把STM32F103最核心、最常用的外设都覆盖到了。为了方便大家按需复习我把专栏文章按学习顺序整理了一下你可以直接点链接跳转到对应文章知识点核心内容专栏文章链接GPIO8种工作模式、寄存器/库函数操作、流水灯/按键实验 点击跳转EXTI外部中断NVIC配置、中断优先级、EXTI线映射 点击跳转TIM定时器基本定时、通用定时器、时基单元配置 点击跳转PWM输出PWM原理、CCR/ARR关系、舵机/电机控制点击跳转TIM输入捕获测频率、测脉宽、主从触发模式 点击跳转ADC模数转换单/多通道、规则组/注入组、扫描/连续模式 点击跳转DMA直接存储器访问存储器↔外设搬运、DMA中断、减轻CPU负担 点击跳转USART串口通信波特率配置、收发数据、printf重定向点击跳转I2C通信起始/停止信号、应答位、MPU6050/OLED实战 点击跳转SPI通信全双工/半双工、W25Q64/W25Q128 Flash读写 点击跳转RTC实时时钟后备区域、BKP寄存器、秒中断/闹钟点击跳转WDG看门狗独立看门狗IWDG、窗口看门狗WWDG 点击跳转⚠️版本提示以上所有内容均基于STM32F103C8T6 标准库3.5.0编写。如果你使用的是HAL库或STM32CubeMX自动生成代码配置方式和函数接口会有较大差异建议先理解标准库底层原理后再迁移到HAL库会轻松很多。三、我的理解这些知识点到底是怎么串起来的刷完视频、写完专栏之后我尝试用一个项目思维重新梳理了一遍这些外设。我的理解是STM32的学习本质上是在学习如何让CPU高效地跟外部世界打交道。咱们一步一步来看第一步点亮一个LEDGPIO这是最基础的打交道方式——CPU直接控制引脚电平高低。但GPIO不仅仅是输出高/低电平8种工作模式的存在是为了应对不同的对话场景推挽输出能稳定驱动LED开漏输出能玩I2C总线浮空输入能检测按键上拉输入能省一个电阻……选错模式硬件就罢工这是我对GPIO最深的体会。第二步让LED闪得有规律TIM定时器手动延时Delay()太蠢了CPU被死死卡住啥也干不了。定时器的出现就是为了让时间控制这件事从CPU手里解放出来——定时器自己数自己的数够了发个中断通知CPU一声。我的理解是定时器是STM32的心脏节拍器PWM、输入捕获、甚至后面ADC的定时采样都要靠它来打底。第三步按键按下就闪EXTI外部中断轮询检测按键太浪费CPU资源了中断的思想就是没事别找我有事我喊你。但这里有个大坑——NVIC中断优先级。我一开始以为优先级数字越小越优先就完事了直到我在一个项目里同时开了定时器中断和串口中断发现高优先级中断能打断低优先级的而同级中断不能嵌套这才真正理解了抢占优先级和响应优先级的区别。第四步LED亮度可调PWMPWM不是新的外设它是定时器的一个功能。这个知识点让我第一次感觉到外设之间是有联系的——PWM的本质就是定时器在不停地翻转IO口。理解了这一点再看舵机控制、电机调速就不会觉得是什么新东西了。第五步采集传感器数据ADC外部世界是模拟的CPU只认数字。ADC就是翻译官。但翻译官干活慢如果让CPU守着它一个字一个字地读太浪费了。所以DMA登场——DMA是数据搬运工ADC采完一批数据DMA直接搬到内存数组里CPU该干嘛干嘛等DMA搬完了发个中断通知一声就行。这个ADCDMA的组合拳是我觉得标准库里最优雅的设计之一。第六步跟电脑/其他芯片说话USART/I2C/SPI这三个通信协议解决的是远距离/多设备/高速率的通信需求。我的理解是USART一对一长距离异步适合跟电脑调试、蓝牙模块对话I2C一对多两根线有应答机制适合接OLED、MPU6050这种慢速设备SPI一对一/一对多四根线全双工高速适合Flash、TFT屏这种大数据量场景。选错通信协议就像你跟一个只说英语的人讲中文——硬件连对了数据也对不上。四、个人理解 学习心得 ⭐以下是我自己的真实学习感受供参考。4.1 看懂和会做之间差了一个手熟本身也是第一次接触单片机直接听了江科大的stm32江科大的视频我第一遍刷的时候感觉这都是什么嘛,根本看不懂。当我关掉视频自己从头写一个定时器中断程序的时候光是TIM_TimeBaseInitTypeDef结构体里那几个参数就卡了半小时——预分频系数到底填多少计数模式选向上还是向下时钟分频因子是干嘛的看视频的时候你的大脑会自动帮你脑补那些你没真正理解的细节。只有亲手敲一遍、编译报错一遍、调试器里单步跟一遍那些模糊的概念才会变清晰。所以我的建议是每看完一个外设的视频立刻关掉视频凭记忆把代码写一遍写不出来再回去看。4.2 不要急着背代码要理解为什么这样配我一开始学的时候特别喜欢把江科大的代码原封不动抄下来甚至想把那些初始化函数背下来。后来发现完全没必要——STM32的库函数就是填空题你只要理解每个外设的工作原理知道结构体里每个成员是控制什么的配起来就是水到渠成。理解了为什么代码自然就写出来了只背了是什么换个芯片就抓瞎。4.3 调试能力比编码能力更重要这个专栏写下来找bug的过程其实是对STM32工作原理的二次学习。印象最深的一次是我配ADC多通道扫描DMA传输代码逻辑完全没问题但读出来的数据始终是乱的。最后发现是因为DMA的传输长度设成了半字16位但我的数组是32位整型数据对齐出了问题。这种坑你不亲手踩一遍看视频是永远学不会的。所以别怕报错。报错是STM32在教你做人也是在教你做工程师。五、踩坑记录 ️以下是我整个专栏学习过程中印象最深的几个坑。有些坑是江科大视频里提过的有些是我自己额外踩的整理出来给大家避雷踩坑现象原因分析解决办法涉及外设程序下载后没反应板子假死Boot0引脚悬空或接高芯片进入了系统存储器启动模式Boot0接GND确保从主闪存启动通用某个外设初始化完功能就是不对99%的概率是没开这个外设的时钟检查RCC_APB2PeriphClockCmd/RCC_APB1PeriphClockCmd有没有使能对应外设通用定时器中断死活进不去NVIC优先级分组没配或者TIM_ITConfig没开启对应中断源确认NVIC_PriorityGroupConfig()和TIM_ITConfig()都正确调用TIM串口打印乱码/收不到数据波特率计算错误晶振用错了、USART时钟没开、TX/RX引脚复用没配确认晶振是8MHz检查GPIO_PinRemapConfig和AFIO时钟USARTADC多通道扫描结果错位通道转换顺序和数组索引没对应上或者采样时间太短信号没稳定检查ADC_RegularChannelConfig的Rank参数适当延长采样周期ADCDMA传输完数据不对数据宽度Byte/HalfWord/Word和数组类型不匹配确保DMA_InitStructure.DMA_PeripheralDataSize与数组类型一致DMAI2C通信时序混乱设备无应答软件模拟I2C时延时不够或者硬件I2C的时钟配置有问题检查上拉电阻4.7KΩ软件模拟时适当增加延时I2C看门狗复位导致程序莫名其妙重启独立看门狗一旦开启就必须定时喂狗否则超时就复位在main循环里加入IWDG_ReloadCounter()注意中断里喂狗可能被打断WDG⚠️ 以上踩坑记录基于STM32F103C8T6 标准库3.5.0 Keil5环境。如果你使用的是HAL库、STM32CubeMX或其他型号芯片如F4系列、G0系列部分寄存器名称和配置函数会有差异请以对应参考手册和库函数手册为准。七、给正在学STM32的你下一步该怎么走刷完视频、写完专栏其实只是STM32学习的第一阶段。接下来该怎么走结合我自己的规划和踩坑经验给大家几个建议7.1 去B站找个小项目把知识点串起来这是最重要的一步。专栏里的知识点是一颗颗珠子项目是穿珠子的线。没有项目珠子永远是散的。推荐几个适合练手、且B站有完整教程的小项目温湿度监测OLED显示DHT11 I2C OLED覆盖GPIO、I2C、定时器蓝牙遥控LED/舵机HC-05 PWM覆盖USART、GPIO、TIM简易示波器ADCDMATFT屏覆盖高速数据采集和显示智能小车红外循迹/超声波避障覆盖GPIO、PWM、EXTI、定时器综合应用我的建议是第一个项目别选太复杂的。能把温湿度OLED串口打印这三个外设整合到一个项目里跑通就已经很厉害了我找的是一个智能小车项目。7.2 尝试脱离视频自己看参考手册江科大的视频是喂饭参考手册是食谱。当你对一个外设有了基本理解之后试着去翻一翻《STM32F10xxx参考手册》对应章节。一开始肯定看不懂但看多了你会发现库函数本质上就是参考手册里寄存器操作的C语言封装。能看懂参考手册你就真正自由了。7.3 考虑向HAL库/CubeMX迁移标准库的优点是透明缺点是繁琐。当你用标准库把底层原理理解透彻之后HAL库和CubeMX就是提效工具——它们能帮你自动生成初始化代码让你把精力集中在业务逻辑上。但注意不要一上来就用CubeMX否则你根本不知道它生成的代码在干什么出了问题也调不了。学习这件事真的就是看一遍会忘做一遍会懂教一遍才会。希望这篇博客能帮助到和我一样正在入门STM32的小伙伴也欢迎大家把做项目过程中遇到的问题分享出来咱们一起踩坑一起进步我们的STM32入门专栏就更新到这里了我以后还会更新关于嵌入式的更多学习笔记欢迎关注我们一起学习更多嵌入式知识。如果本文对你有帮助欢迎点赞 收藏 ⭐ 有任何问题欢迎在评论区交流一起学习进步互动时间你目前学到哪个外设了或者你已经做完什么项目了欢迎在评论区分享你的学习进度和踩坑经历这个评论区就当成咱们STM32学习互助小组吧