尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

STM32入门避坑:工具链、时钟配置与调试排错实战

STM32入门避坑:工具链、时钟配置与调试排错实战 大概三年前我第一次摸 STM32买了一块最小系统板装好软件跟着一份入门教程从头敲到尾结果在第一个点灯程序上卡了整整一下午。后来回头看问题根本不在代码本身。现在这套 2023 版的 STM32 入门教程中文字幕讲得比我当年看的细得多但我发现新手栽跟头的地方几乎没变——工具链、芯片包、下载器驱动、时钟配置这些代码之外的东西才是真正的门槛。这篇东西我想干的事很具体把这类 STM32 入门教程里讲得飞快、一带而过的环节按我自己踩过的顺序重新摊开讲一遍。适合谁看完全没碰过单片机、准备从 STM32 起步的人也适合学过一点 51、想换到 32 位平台的人。看完你应该能自己把开发环境搭起来、把第一个工程跑通、看懂定时器和中断那几集并且在自己卡住的时候知道该往哪个方向查。视频里已经讲透的内容我不复述只补那些讲的人觉得你天生就该会、但你真的不会的部分。1. 动手之前把这套教程要用的工具链捋清楚教程第一集通常就是装软件很多人会快进我建议这一集老老实实看甚至可以放慢。因为 STM32 的学习曲线里前 20% 的难度全在环境上代码反而简单。你需要准备的东西就五样一块开发板、一个下载器ST-Link 或 DAP-Link、一根 USB 线、一个 IDE、还有和板子型号匹配的芯片支持包。听起来不多但这五样里任何一样版本对不上你都会在第一个工程上浪费半天。我见过太多人是被编译零错误、下载也提示成功、灯就是不亮这种情况劝退的而这套组合拳的成因八成在工具链这一层。1.1 为什么多数中文教程还在用 Keil52023 年前后录制的 STM32 入门教程主流还是 Keil MDK5这不是因为它最好用而是因为国内绝大多数例程、毕设模板、工程文件都是 Keil 工程。你随便找一个开源项目、一份学长留下的代码99% 是.uvprojx文件打开就能编译这种生态惯性是真实存在的优势。Keil5 本身有两个让人难受的点一是授权问题社区版对代码体积有限制二是编辑器体验确实比现代 IDE 落后。但作为入门阶段别折腾先用它把知识跑通。至于 STM32CubeIDE 和 VSCode PlatformIO 这两条路我个人的建议是入门阶段先放一放。CubeIDE 基于 Eclipse生成代码走 HAL 库和 CubeMX配置外设确实快但它抽象得太狠你会写代码却不理解寄存器和时钟树。等你把标准库的 GPIO、定时器、中断都手写一遍之后再切到 CubeIDE会发现那才是降维打击。顺序反了学起来会很虚。还有一个绕不开的问题是库的选择。同一块 F103 板子教程可能用标准库Standard Peripheral Library也可能用 HAL 库。这两种库的 API 长得完全不一样不要混着跟。判断方法很简单看教程里写的是GPIO_SetBits()还是HAL_GPIO_WritePin()。前者是标准库后者是 HAL。选定一套之后把你的整个学习周期都锁在这套上网上的参考代码也要按这套来筛否则你会同时记住两套语法最后哪套都不熟。1.2 芯片包、支持包、驱动三者到底谁依赖谁这是新手最容易乱的地方我用一句话说清楚Keil 是壳芯片包是零件库驱动是桥。Keil MDK5 本体装完之后它不认识 STM32你得再装 STM32F1 的 Device Family PackDFP装完在新建工程的芯片列表里才能找到 STM32F103C8 这类具体型号。这一步没做新建工程时会发现型号列表里空空如也很多人以为是软件装坏了其实只是缺包。芯片包安装有个坑在线安装依赖网络国内环境下经常卡在下载一半。解决办法是去官网下载离线的.pack文件双击安装或者在 Pack Installer 里选 File → Import 导入本地包。我个人的习惯是把常用的 F1、F4 两个包都离线存一份换电脑或者重装系统时不用再等。驱动这块取决于你手上是哪种下载器。ST-Link 需要装驱动装完后设备管理器里应该出现一个 STLink 设备DAP-Link 在 Windows 10 之后基本免驱走 WinUSB如果是靠板载 CH340 串口芯片下载的那还要装 CH340 的串口驱动驱动装好后会在端口里多出一个 COM 口。下面这张表是我自己总结的对应关系下载器需要驱动识别标志常见故障ST-Link V2ST-Link 官方驱动通用串行总线设备里有 STLink买到山寨版固件老Keil 里选不到DAP-Link免驱WinUSB端口或通用设备里出现 CMSIS-DAP固件被刷成别的需重新刷CH340 串口CH340 驱动端口里多出 COM 口驱动签名问题装完感叹号CP2102 串口CP210x 驱动端口里多出 COM 口用了劣质数据线只供电不通数据注意很多下载失败其实败在数据线上。那种买充电宝送的细线只有电源两根线没有数据线插上能供电但电脑永远识别不到设备。手边备一根确认能传数据的线能省掉大量怀疑人生的时间。1.3 板子决定了你的学习路径分叉教程用的板子型号直接决定你能不能一比一跟做。最常见的入门板是 STM32F103C8T6 最小系统板便宜、资料多但板载外设少很多时候要自己接杜邦线。另一种是带丰富外设的开发板比如 F103 系列的战舰指南者这一类板上有 LED、按键、OLED、蜂鸣器、传感器接口跟教程的匹配度最高。关键点是外设寄存器地址、GPIO 引脚编号、时钟来源这些是跟芯片型号绑定的不是跟STM32这个大概念绑定的。F103 和 F407 之间同样的点灯代码引脚可能一样但时钟树配置完全不同F407 主频 168MHzF103 是 72MHz直接抄会出问题。跟着 2023 版教程走之前先翻到第一集确认它用的是哪个型号然后尽量买同款或者同系列。已经买了别的板子也不要紧把教程当成知识讲解看代码自己按板子的原理图改引脚号只是会多花点时间。2. 第一个工程从新建模板到 LED 闪烁之间藏着的细节点灯几乎是所有 STM32 入门教程的第一课但它被严重低估了。这一节课浓缩了三块核心知识启动流程、时钟系统、GPIO 配置。你如果只学会了照抄那几行库函数后面学定时器和串口时会立刻原形毕露。这一个章节我把这三块拆开讲讲透之后你会发现后面所有的外设配置都只是这个套路的重复。2.1 启动文件、时钟树与 SystemInit 到底干了什么工程目录里那个startup_stm32f10x_md.s文件是用汇编写的启动文件它的作用是定义中断向量表、初始化堆栈指针、然后在复位之后跳转到SystemInit再到main。中间那一步SystemInit很多人不知道它在哪它藏在system_stm32f10x.c里任务是配置系统时钟。对于 F103目标是把外部 8MHz 晶振经过 PLL 倍频到 72MHz。为什么必须先配时钟因为 STM32 所有外设都挂在不同总线上总线频率决定了外设的工作节拍。你写串口时设的波特率、写定时器时算的分频全都基于这个 72MHz。如果时钟没配对代码不报错但实际波特率会偏你收到的就是乱码。这里有个很反直觉的现象时钟配错了点灯程序照样能跑。因为 GPIO 挂在 APB2 上即使主频只跑到内部 8MHz 的 HSIGPIO 翻转速度也远快于人眼能察觉的程度。所以灯亮了不能证明你的时钟是对的。我建议在学时钟这一集时打开调试器看SystemCoreClock这个全局变量的值它应该是 72000000。看到这个数字才算真正配对了。这个习惯在后面调串口时会救你一命。2.2 GPIO 输出模式的选择逻辑库函数里GPIO_Init()结构体有两三个字段最容易被忽略的是GPIO_Mode。新手往往记住输出就用推挽然后一路推挽到底遇到 I2C 就傻了。这几个模式的选择逻辑其实对应的是电路特性理解了电路选型就是自然而然的事。模式电路特点典型场景推挽输出上管下管都能主动驱动拉高拉低都有力驱动 LED、继电器、普通数字信号开漏输出只能主动拉低拉高靠外部上拉电阻I2C 总线、多设备共享一根线、电平转换复用推挽引脚控制权交给片上外设定时器 PWM 输出、SPI、USART TX复用开漏片上外设控制开漏形式硬件 I2C 的 SCL/SDA上拉输入内部接一个上拉电阻按键按下接地、空闲时为高下拉输入内部接一个下拉电阻按键按下接 VCC、空闲时为低浮空输入无内部上下拉高阻态外部已有上下拉、信号源主动驱动模拟输入断开数字部分ADC 采样看这张表你就能理解为什么按键要配上拉或下拉为什么 I2C 必须开漏。开漏的妙处在于线与多个设备把线拉低就能表示占用没有设备主动拉高时靠上拉电阻恢复到高电平这样谁都不会因为互相推电流而烧掉。这个道理跟教程后面讲 I2C 通信时是一模一样的先在这里埋个印象。2.3 编译通过但灯不亮按这个顺序查这是我这几年帮人排查时总结的固定顺序从最容易的查到最麻烦的理论上五分钟内能定位大部分问题供电与跳线确认板子上的电源指示灯亮着。有些最小系统板有 ST-Link 供电跳线帽不插就只能靠外部供电。这一步虽然傻但占比不低。下载是否真的成功看 Keil 的 Build Output 窗口是不是有 Application running 或者类似的提示。如果勾了 Reset and Run下载完芯片会自动复位运行没勾的话你需要手动按一下复位键程序才跑起来。这个细节坑了无数人。LED 极性翻原理图确认 LED 是共阳还是共阴。共阳接法下引脚输出低电平灯才亮也就是GPIO_ResetBits()。你如果照着点亮的直觉写成了拉高灯就是不亮。引脚号对不对原理图上的 LED 接的是 PC13 还是 PA5一定要看准。凭印象写引脚是高频错误。时钟使能漏了RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE)这行必须有。STM32 为了省电所有外设默认关闭时钟不开时钟你写多少次GPIO_SetBits寄存器都没反应。这是从 51 转过来的人最容易犯的错——51 的 IO 口默认就是通的。GPIO_Speed 没填F103 的 GPIO 配置结构体里有个速度字段虽然填了不一定影响灯亮但建议养成习惯填GPIO_Speed_50MHz因为后面接 SPI 或 PWM 时速度不够会导致波形失真。引脚被 JTAG 占用如果你用的恰好是 PA13、PA14、PA15、PB3、PB4 这几个脚它们在复位后默认被 JTAG/SWD 调试接口占用普通 GPIO 用不了得先关闭 JTAG 复用或者重映射。这一条我下面单独开一节讲。3. 定时器与中断这套教程最值得反复看的部分如果说点灯是入门那定时器和中断就是分水岭。从这里开始代码才真正会做事而不只是会亮灯。这也是 2023 版这套教程中文字幕优势最明显的地方——分频系数、重装载值这些数字背后的计算过程视频里会一步步写出来你跟着算一遍比看十篇文字教程都清楚。但恰恰因为讲得细很多人看得慢容易半途放弃。我的建议是这两集一定要亲手算一遍、亲手改一遍参数不动手是学不会的。3.1 分频系数和重装载值到底怎么算出来定时器的工作流程是这样的时钟源先过一个预分频器PSC得到计数频率然后计数器从 0 数到自动重装载值ARR数满一次产生一个更新事件。所以定时周期的公式是Tout (ARR 1) × (PSC 1) / Tclk其中Tclk是定时器的输入时钟F103 上一般等于 72MHz。注意 ARR 和 PSC 都是 16 位寄存器最大 65535所以单靠它们两个最长定时大约是 65536 × 65536 / 72MHz ≈ 59.6 秒再长就要靠软件累计更新次数了。拿一个具体的例子要定时 500ms。先选预分频器把 72MHz 降到 10kHz也就是一个计数代表 0.1msPSC 72000000 / 10000 - 1 7199再算需要数多少次才够 500ms500ms / 0.1ms 5000 次 ARR 5000 - 1 4999代回公式验证(49991) × (71991) / 72000000 5000 × 7200 / 72000000 0.5s对上了。再看一个做微秒级延时的场景比如驱动 DHT11 这类单总线传感器需要 1us 的精度PSC 72 - 1 71 // 72MHz / 72 1MHz一个计数 1us ARR 65535 // 用满最大值每次溢出是 65.535ms这时候定时器每 1us 计一次数你读 CNT 寄存器的差值就能知道过了多少微秒。这个用法跟定时中断是两个思路前者是轮询计数后者是中断触发。教程里两种都会出现别搞混。一个容易被忽略的坑计数频率不要设得太高。有人图省事PSC 设成 0让计数器按 72MHz 跑结果中断里做不了几件事就到下一次了程序一直在响应中断主循环几乎没执行机会。经验上定时中断频率控制在 1kHz 到 10kHz 之间比较舒服既有精度又不会拖垮 CPU。3.2 NVIC 优先级分组的常见误用中断优先级这块新手最常见的问题不是不会配而是配了没效果。原因通常出在分组上。Cortex-M3 的优先级分抢占优先级和响应优先级两部分一共 4 位可以分配。分组决定了这 4 位里多少位给抢占、多少位给响应。默认是群组 0也就是所有位都是抢占优先级这时候你设置响应优先级是无效的。几个我踩过的坑列出来给你对照在 main 里反复调用分组函数分组函数NVIC_PriorityGroupConfig()只应在程序最开始调用一次。如果中途又调一次会把之前设置的所有中断优先级重新解释一遍行为变得不可预测。分组的位数用超了比如选了分组 22 位抢占、2 位响应那抢占优先级只能填 0~3你填 5 就会溢出截断实际生效的值和你以为的不一样。以为数字越大优先级越高STM32 里恰恰相反数值越小优先级越高。0 是最高优先级。SysTick 的优先级被忽略SysTick 默认优先级是最低的如果你的定时中断优先级也比它低或者一样两个中断同时挂起时延时函数的计数会不准。这就是下一节 delay 卡死的一个诱因。配置中断的固定套路是这样的先设置分组再给每个中断单独设优先级最后使能中断。库函数里分别是NVIC_PriorityGroupConfig()、NVIC_Init()HAL 库里则是HAL_NVIC_SetPriorityGrouping()和HAL_NVIC_SetPriority()。跟哪套库就用哪套别拼。3.3 输入捕获测频率的完整思路输入捕获是定时器里最实用也最绕的一个功能。它的原理说白了很简单定时器在引脚上检测到指定边沿比如上升沿时把当前计数器的值咔嚓一下复制到捕获寄存器里。连续捕获两次两个值一减就得到了这两个边沿之间的计数个数再换算成时间频率就出来了。具体到代码流程大概是这几步把定时器配成 1MHz 计数PSC71这样每个计数就是 1us。选定一个通道设成输入捕获模式触发边沿设为上升沿。开启捕获中断在中断里读取捕获值和上一次的值相减得到周期计数 N。频率 1000000 / N 赫兹。这里有两个必须处理的细节。第一是溢出。如果被测信号频率很低比如 10Hz周期 100ms而定时器的 ARR 只能数到 65.535ms中间会溢出。你必须在更新中断里记录溢出次数最后周期 溢出次数 × 65536 本次捕获值 - 上次捕获值。第二是极性。测占空比时需要同时捕获上升沿和下降沿这时候要用 PWM 输入模式PWMI一个通道测周期、另一个通道测高电平时间两者一除就是占空比。还有一个选型上的经验测高频信号用计频法测低频信号用测周法。计频法是在固定时间内数边沿个数1 秒数到多少个就是多少 Hz适合几百赫兹以上的信号测周法就是上面说的捕获周期适合低频因为低频周期长相对误差小。反过来用会很尴尬——用测周法测 1MHz 信号一个周期才 1 个计数值误差大得没法看。4. 跟着敲能跑、自己写就崩几个高频故障的排查链路这一节是整篇里我最想写的部分。前面几节讲的是怎么学这节讲的是崩了怎么办。STM32 的调试有个特点很多时候程序不是在语法上出错而是卡死、不响应、下载不上日志栏干干净净。这种问题最消耗耐心也最需要一套系统化的排查方法而不是凭感觉乱试。下面三个是我遇到频率最高的按我实际的排查顺序完整写出来。4.1 delay 函数卡死一个把新手劝退的经典问题现象是这样的程序编译下载都正常但一运行就卡住不动LED 停在某个状态调试器停下看程序停在delay_ms()的循环里出不来。这个问题的根因不止一个得挨个排查。第一种可能在中断服务函数里调用了阻塞延时。这是最典型的。比如你在定时器中断里想做个 10ms 的延时写了delay_ms(10)而这个 delay 是靠 SysTick 计数实现的。如果此时 SysTick 的中断优先级比当前中断低那么 SysTick 中断根本进不来计数永远不增加delay 就死等。记住一条铁律中断服务函数里绝对不能使用任何阻塞式延时只能设标志位。需要延时就在主循环里根据标志位做状态机。第二种可能SysTick 被关掉了。有些代码为了做临界区保护调用了__disable_irq()关闭全局中断然后忘了开回来或者中途某处出错跳过了开启语句。SysTick 中断进不来delay 自然卡死。查这一类问题就看调试器里 PRIMASK 寄存器是不是被置位了。第三种可能时钟没配对SysTick 的重装载值算错。delay 的实现通常是按 72MHz 算的如果你的实际系统频率是 8MHz比如外部晶振没起振自动切到内部 HSI那 SysTick 的重载值就大了将近十倍虽然最终还是会数完但如果重载值超过了 24 位的最大值就会溢出出错计时变得乱七八糟。排查顺序我一般是先在调试器里看程序停在哪一行确认是卡在 delay 里然后检查调用 delay 的位置是不是在中断里再检查时钟配置是否正确最后检查有没有全局关中断。按照这个链路走基本都能定位。4.2 下载器连不上与 SWD 引脚被占用下载器识别不到目标是最让人抓狂的问题之一因为可能性太多。我把它拆成从外到内的排查链条物理层换一根确定能传数据的 USB 线换一个 USB 口尤其别用前置面板的口确认板子有电。驱动层打开设备管理器确认下载器出现在列表里没有黄色感叹号。ST-Link 如果显示未知设备重装驱动。连接层检查 SWD 的四根线——SWDIO、SWCLK、GND、3.3V 是不是都接对了。注意 SWDIO 和 SWCLK 千万别接反接反了会一直提示连不上。有些板子还用 5V 供电那就不要接 3.3V 到下载器的 3.3V 脚避免倒灌。芯片层确认芯片没被锁死。最后一层最麻烦也最常见。症状是之前能下载改了一次代码之后就再也连不上了。原因通常是你在代码里把调试接口的引脚配成了普通 GPIO或者干脆关闭了 SWD。F103 复位后PA13/PA14 默认是 SWD 功能PA15、PB3、PB4 默认是 JTAG 功能。如果你把 PA13 配置成推挽输出并拉低Keil 就连不上芯片了因为调试信号被你的程序抢走了。恢复的办法有这么几个连接方式改成 Connect under ResetKeil 的 Debug 设置里有一个选项让调试器在按住复位的情况下连接这样芯片还来不及运行你的程序就被接管了。BOOT0 拉高进系统存储器把 BOOT0 跳线帽拨到 1芯片从内置 bootloader 启动不运行你的程序此时 SWD 是空闲的可以正常连接并擦除。手动时序一边按住板子上的复位键一边点 Keil 的下载按钮在下载开始的一瞬间松开复位键。这个手法靠手速多试几次能成。预防的办法很简单如果你要用 PA15/PB3/PB4 做普通 IO先调用GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE)把 JTAG 关掉但保留 SWD。千万不要用完全禁用 SWJ 的那个选项那样会把自己锁死。这就是为什么引脚分配时我永远优先避开 PA13、PA14把这两个留给调试。4.3 串口 ISP 下载与 BOOT 引脚的那点事没有下载器、只有一根 USB 转串口线的时候可以用芯片内置的 bootloader 通过串口下载程序这就是所谓的 ISP 下载。它依赖 BOOT0 和 BOOT1 两个引脚的电平组合F103 的组合如下BOOT0BOOT1启动区域用途0任意主闪存正常运行用户程序10系统存储器进入内置 bootloader用于串口下载11内置 SRAM调试用极少使用流程是先把 BOOT0 拨到 1复位一下芯片进入 bootloader然后用 FlyMcu 之类的工具通过串口把程序写进去写完之后一定要把 BOOT0 拨回 0 再复位否则芯片下次上电还是进 bootloader你的程序永远不运行。注意很多人遇到下载提示成功但程序不跑99% 是忘了把 BOOT0 拨回去。这个坑我自己踩过也帮别人排查过至少五次属于无论提醒多少次都还会发生的经典问题。养成习惯下载完先拨跳线再按复位。另外串口下载还有个速度问题。CH340 这类芯片在波特率特别高的时候比如 115200 以上容易丢数据导致写入校验失败。如果一直失败把波特率降到 57600 甚至 38400 再试虽然慢一点但稳。5. 学完之后往哪走三个能把知识串起来的练手方向教程看完最大的风险是看懂了但不会用。因为教程里的例子是孤立的一个个外设而真实项目是把它们编在一起的。我建议每学完一块就找一个能综合两三种外设的小项目做一遍。下面三个方向是我自己走过、也推荐给别人的难度从低到高每个都能把前面学的知识用上而且网上参考的代码足够多不至于卡死。5.1 传感器采集 报警类小项目最推荐的第一个实战是数字温湿度计加报警器。用 DHT11 或者 SHT30 采集温湿度用 OLED 或者数码管显示超过阈值就驱动蜂鸣器响。这个项目小但把 GPIO、I2C或者单总线时序、定时器、状态机全串起来了。这里面有个几乎所有人都会踩的坑DHT11 这类单总线传感器对时序极其敏感通信过程中不能被中断打断。你如果一边在定时器中断里刷数码管一边在主循环里读 DHT11读出来的数据大概率是错的。正确的做法是在读传感器的这段窗口里临时关闭中断读完再打开或者干脆把传感器读取放在主循环、显示刷新放在一个宽松的定时中断里。OLED 用硬件 I2C 还是软件模拟 I2C我的经验是入门阶段先用软件模拟虽然慢但时序完全可控出问题好查。等熟了再切硬件 I2C会发现硬件 I2C 的坑更多时钟延展、总线卡死反而不如软件模拟省心。5.2 电机与电源类控制如果你对硬件感兴趣电机和电源方向是很好的练手场。用定时器输出 PWM 驱动步进电机驱动器比如 HR4988或者做一个小型的双向升降压电源这些项目会把 PWM、ADC 采样、PID 闭环全部用上含金量比单纯的点灯高得多。PWM 这块有几个参数要想清楚。频率选择驱动电机一般用几千到二十几千赫兹太低会有可闻的啸叫太高开关损耗大。死区时间如果是半桥或全桥驱动上下管切换时必须留死区否则会直通烧管。分辨率在固定时钟下PWM 频率越高可调的占空比档位越少这两个是互相制约的。比如 72MHz 时钟PWM 频率设 20kHz那么一周期是 3600 个计数占空比就有 3600 档可调精度够用了。做电源类项目还要特别注意电流采样。用 ADC 采采样电阻上的电压配合定时器的触发同步才能采到准确的瞬时电流。如果采样时机不对采到的是开关瞬间的噪声PID 会疯狂震荡。这块的调试经验是先用示波器看一眼采样点的波形确认稳定了再进闭环。5.3 通信与组网方向再往上走就是通信。从串口开始把环形缓冲区、协议解析练熟再玩 RS485本质是差分串口多个设备挂在总线上、CAN车载和工业里用得极多。这三个学完你就有能力做多设备协同的项目了。串口通信我强烈建议自己写一个环形缓冲区。中断里只管把收到的字节丢进缓冲区主循环里慢慢解析发送也是先塞进发送缓冲区用发送完成中断一个个发出去。直接用printf阻塞发送在数据量大的时候会把整个程序拖住。这个中断搬运 主循环处理的模式是嵌入式开发里最核心的解耦思想早点建立这个思维后面做项目会轻松非常多。至于以太网STM32 的 MAC 是片上的但 PHY 得外接硬件设计上的门道比软件多。如果你的兴趣在通信方向我建议先把串口和 CAN 这两个吃透以太网可以放到后面等硬件基础够了再上不然会被一堆硬件问题干扰学习节奏。最后聊点个人的体会。STM32 入门最反直觉的地方在于它真正难的不是代码而是看不见的部分——时钟、驱动、启动文件、调试接口。这些东西教程里往往一句话带过但它们决定了你的程序到底跑不跑得起来。我现在带新人的时候从来不看他们点灯写得对不对而是问三个问题你的系统时钟是多少你的下载器是怎么接的你出问题的时候是怎么查的能答上来这三个说明已经入门了。另外别贪快。我见过太多人一周刷完所有外设教程然后做毕设时发现自己什么都不会。每个外设都亲手改一遍参数、看着现象变一遍比看完十个视频有用得多。这套 2023 版教程讲得细是好事但也意味着你得跟着动手光看是学不进去的。哪怕只是把定时器的分频系数改一改看灯闪的频率变没变这个动作也比纯看强十倍。
返回列表