STM32嵌入式系统期末速成复习:5小时掌握考点与实验实操
2026/9/17 20:15:48 网站建设 项目流程

1. 这门课到底在卖什么:5小时速成的“考试逻辑”先说清楚

先说结论:如果你现在离期末考还有两周,或者正在准备补考、专升本、考研复试,手头这门《嵌入式系统 STM32 附环境搭建工具包》复习速成课,它的核心价值不是让你成为嵌入式工程师,而是让你在最短时间内把一门课的考试套路吃透,稳稳拿到 90+。

嵌入式系统这门课,在很多高校的课程体系里,跨度非常大。从 51 单片机到 STM32,从汇编到 C 语言,从裸机开发到 RTOS,从寄存器操作到 HAL 库,每个学校侧重点还不一样。而 STM32 几乎是目前国内高校教学、毕业设计、竞赛、考研复试里出现频率最高的平台。为什么?因为 STM32 生态太成熟了:资料多、库函数全、芯片便宜、开发板遍地都是。你随便搜一下,光是用 Keil、STM32CubeMX、标准库、HAL 库这几个关键词组合出来的教程,就能看到几万条结果。

但问题也出在这里:资料太多,反而不知道怎么复习。我见过太多学生,复习嵌入式系统时抱着几百页的 PPT,或者拿着一本 600 页的教材,从头翻到尾,结果翻到第三章就放弃了。这门速成课的逻辑完全不一样,它把整个课程的考点压缩成一个“最小可行性知识集”,再配上环境搭建工具包,让你先能跑起来代码,再通过做题、看重点、动手实践三步走,把考试需要的东西装进脑子。

适合谁看?三类人:

  • 期末复习:平时上课听了个大概,作业靠抄,考试前想抢救一下的。
  • 补考/专升本:上次挂了,这次想稳过,不想再重修一次的。
  • 考研复试:导师问你做过什么,你说会 STM32,结果连工程都不会建,这时候你需要的不是深度学习,而是快速建立能上手、能聊、能 Demo 的“实战感”。

我个人建议,不管你属于哪一类,看这门课前先调整心态:速成课不是“帮你学会”,而是“帮你通关”。它给你的是地图和装备,但通关操作还得你自己来。接下来我会从复习规划、环境搭建、核心考点、实验实操、避坑经验这五个维度,拆解这门课到底怎么用才最有效。

2. 环境搭建工具包拆解:为什么它值得你花时间提前搞定

标题里特别点出了“附环境搭建工具包”,这说明课程作者很清楚学生最大的痛点在哪里。嵌入式系统这门课,理论上再难都有章可循,真正卡住大多数人的第一关,其实是连第一个 LED 点灯程序都跑不起来

2.1 工具包里到底装了什么

这类工具包通常包含以下几样东西,你可以对照检查一下自己手头缺什么:

  • Keil MDK 安装包:绝大多数高校教学用的还是 Keil,版本从 MDK4 到 MDK5 都有。工具包里一般会给 MDK5 的安装文件,以及对应的 STM32 芯片支持包(Device Family Pack)。如果你用的是 C51 单片机,还需要额外装 C51 的包。这里有个常见坑:Keil5 默认不兼容 C51,需要单独安装 C51 编译器,否则你打开学校发的 51 项目会提示找不到芯片。
  • STM32CubeMX:图形化配置工具,这几年在教学中越来越普及。它的作用是帮你自动生成初始化代码,省去手写 GPIO、时钟、USART 初始化的时间。考试如果允许用 CubeMX,那你写代码的效率能提升一大截,但也别太依赖它,万一手写代码的题目就暴露了。
  • ST-Link 驱动及烧录工具:ST-Link 是 ST 官方调试器,USB 连接电脑,另一端通过 SWD 接口连接 STM32 开发板。工具包里一般会带驱动安装包,以及 STM32 ST-LINK Utility 这个软件。用 Keil 烧录时,需要在 Options for Target -> Debug 里选择 ST-Link,再在 Settings 里确认能识别到芯片 ID。
  • 固件库(标准库 / HAL 库):标准库是老牌教学库,函数名长但逻辑清晰,比如GPIO_Init()USART_SendData()。HAL 库是 ST 现在主推的库,封装更抽象,比如HAL_GPIO_WritePin()。不同学校教的不同,工具包里一般两种都会备好。

2.2 环境搭建的关键步骤与避坑

环境搭建看起来简单,实际踩坑的人特别多。我按顺序走一遍,你看看自己是不是在某些环节卡过壳。

第一步,安装 Keil MDK5。安装包下载后一路 Next 就行,但要注意:安装路径不要带中文,推荐D:\Keil_v5C:\Keil_v5。装完后首次打开,会提示注册 License,这时需要用到密钥(工具包里一般有注册机或说明文档)。这里多说一句,教学用途的 License 网上很多,但我提醒大家注意版权问题,最好用学校或公司购买的正版授权。

第二步,装芯片支持包。打开 Keil 后,点击 Pack Installer 图标,或者在菜单栏选择Project -> Manage -> Pack Installer,在搜索框输入 STM32F1,找到 STM32F1xx 系列的支持包安装。如果你下载的是工具包里的离线包,可以直接点击.pack文件安装,速度更快。这步做完,你新建工程时才能选到 STM32F103C8 这类具体型号。

第三步,装 ST-Link 驱动。插上 ST-Link 到电脑 USB 口,如果设备管理器里显示感叹号,说明驱动没装好。工具包里的ST-Link USB Driver安装一下,然后重新插拔。注意:有些盗版 ST-Link 需要手动更新固件,用 STM32 ST-LINK Utility 连接时如果提示连接失败,可以试着升级一下 ST-Link 固件再试。

第四步,验证环境。这个步骤别省。新建一个最简单的空工程,随便配置一个 GPIO,让它输出低电平,然后编译、下载。如果能在代码里看到 LED 亮起来,你的环境就算跑通了。如果这一步卡住,后面所有实验都做不了。

2.3 环境搭好后别急着写代码,先做这件事

把编译器的下载算法选对。很多新手卡在 Keil 能编译但不能烧录,提示Error: Flash Download failed - "Cortex-M3"。这个问题的根源是下载算法没选对。在 Keil 的 Options for Target -> Utilities -> Settings -> Flash Download 里,要勾选Reset and Run,并且在 Programming Algorithm 里添加对应芯片的 Flash 算法,比如 STM32F10x 高密度 512KB 的算法。如果你用的是 STM32F103C8T6(64KB Flash),选型号时不要选成 STM32F103CB(128KB)或 STM32F103VC(256KB),否则下载算法可能不完全匹配,烧录到一半会报错。

别小看环境搭建这类琐事,现实中不少学生挂科不是因为不会写代码,而是因为考前找了个晚上想复习,结果环境没搭好,一晚上全耗在装软件上,心态直接崩了。工具包的价值就在于,把这些坑提前帮你填平,让你的复习时间真正花在考点上。

3. 5小时复习时间怎么分配:从“啥也不会”到“90+ 稳了”

速成课最忌讳的就是“均匀用力”。嵌入式系统课程内容非常多,但考试重点其实非常集中。我结合这套课程的内容大纲和历年期末题型,给出一个我认为最合理的 5 小时时间分配方案,你可以照着执行。

3.1 第 1 小时:死磕核心概念,建立知识骨架

这一个小时的任务是“扫盲”。你需要搞清楚嵌入式系统到底考什么。主流课程的知识骨架基本是这几块:

  • 嵌入式系统概述:定义、特点、组成、应用领域、发展趋势。这块背多分题目居多,重点记住“嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统”这个定义。考试经常让你判断以下哪些属于嵌入式系统,手机、路由器、智能手表、MP3 都算,普通 PC 不算。
  • ARM 体系结构:ARM 是什么、Cortex-M 系列特点、寄存器组织、工作模式、异常与中断。其中工作模式一定要分清:User(用户模式)、FIQ(快中断)、IRQ(普通中断)、Supervisor(管理模式)、Abort(中止)、Undefined(未定义)、System(系统)。面试和复试常问的问题包括“Cortex-M3/M4 有多少个寄存器,R13、R14、R15 分别是什么”,答案分别是:16 个 32 位寄存器(R0-R12 通用、R13 SP 堆栈指针、R14 LR 链接寄存器、R15 PC 程序计数器)。
  • STM32 芯片架构:芯片内部结构、总线矩阵、时钟树、电源管理。这里建议用“城市交通”类比去理解:CPU 是市中心,总线是主干道,外设是各个区域,时钟是交通信号灯。没有时钟,外设就无法工作。STM32 的时钟树非常经典,APB2 最高 72MHz,APB1 最高 36MHz,前者高频,后者省电,这个细节常考。
  • GPIO 与寄存器:GPIO 工作模式(输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽输出、复用开漏、复用推挽)、GPIO 寄存器(CRL、CRH、IDR、ODR、BSRR、BRR)。这个几乎是必考点,结合实践来理解最好。

这一个小时,不建议看视频课程,直接看课件 PPT 里的“重点摘要”部分和习题集。因为视频节奏慢,动辄一小时只讲了 GPIO 的 8 种模式,效率太低。速成课配套的重点讲义才是这一小时的主角。

3.2 第 2-3 小时:动手跑通 3 个必考实验

嵌入式系统的实验题,翻来覆去就是那几种:LED 流水灯、按键控制、串口打印、定时器中断、PWM 输出、ADC 采集。考试通常从里面选 1-2 个做上机或写代码。

这一阶段,你要用工具包里的工程模板,亲手跑通以下三个实验:

第一个是 LED 流水灯。这个实验的核心是点灯逻辑和延时函数。代码非常经典,循环里把对应引脚拉高/拉低,再加一个延时,就能实现流水效果。但要注意:延时函数不能用太简单的for循环空转,因为编译器优化后可能直接跳过。推荐用 SysTick 定时器做延时,这也是常考知识点。

第二个是串口通信。初始化 USART1,设置波特率 115200,8 位数据,1 位停止位,无校验。然后写一个printf重定向函数,用串口调试助手接收数据。这里考的是“数据发送”的全流程,包括配置 GPIO 复用功能、配置串口参数、配置中断(如果需要接收)。

第三个是外部中断/定时器实验。比较常见的是按键触发中断,在中断服务函数里翻转 LED。或者定时器产生 1ms 中断,在中断里累加计数。做这个实验时,务必理解NVIC 优先级分组EXTI 边沿检测这两个概念,面试和复试特别喜欢问。

你会发现,跑通这三个实验后,你对 GPIO、时钟、中断、外设这些核心概念的理解已经完全不是看书能比的了。“代码先跑起来,再回头看书”,这个顺序比反过来高效十倍。

3.3 第 4 小时:做卷子,总结高频考点规律

这一个小时用来“刷题”。工具包里一般包含近 3-5 年的期末真题、补考题和答案解析。做卷子时有个策略:只做大题和代码题,选择题判断填空题快速过

大题集中在这么几类:

  • 给一段 STM32 代码,让你写出执行结果。这类题考的是寄存器操作和位运算,比如 BSRR 寄存器、|=&=操作。你要能看懂GPIOB->ODR |= (1<<5)这样的语句,这是在将 PB5 引脚输出高电平。
  • 让你补全某个外设的初始化代码。比如“请写出 USART1 的初始化代码,要求波特率 115200,8N1”。这时你就要背住标准库或 HAL 库的初始化函数框架,至少知道套路。
  • 画系统框图/引脚连接图。比STM32 与 ST-Link 的 SWD 接线:SWDIO、SWCLK、GND、3.3V 四根线,分别接哪几个引脚。

刷完两份真题后,你自己都会有感觉:“哎,怎么考来考去都是这些。” 对,嵌入式系统考试就是这样,考点非常集中,真题价值极高。

3.4 第 5 小时:冲刺背诵 + 查漏补缺

最后这一小时,专门用来背。背什么呢?

  • 背 STM32 芯片型号与资源对照表。比如 STM32F103C8T6 是 64KB Flash、20KB SRAM、48 引脚;STM32F103ZET6 是 512KB Flash、64KB SRAM、144 引脚。这种数据题,考前看一眼就能记住,考场上白送分。
  • 背 ARM 工作模式和寄存器。我前面提过,如果复试提问“R13、R14、R15 是什么”,你得条件反射:“R13 是堆栈指针 SP,R14 是链接寄存器 LR,R15 是程序计数器 PC。”
  • 背 GPIO 8 种模式的中英文对照与使用场景。比如:开漏输出适合接外部上拉,推挽输出适合驱动 LED,模拟输入适合 ADC,浮空输入适合直接检测按键。
  • 背中断优先级分组规则。STM32 的中断优先级由抢占优先级和子优先级组成,分组方式通过NVIC_PriorityGroupConfig()设置。抢占优先级决定能否打断当前中断,子优先级只决定同时挂起时的执行顺序。这个点每年必考,而且经常有人混淆。

到这里,5 小时过完。你可能不敢说自己“掌握了嵌入式系统全部内容”,但你对考试的把握,已经比大多数裸考同学强太多。

4. 核心考点深度拆解:考试爱考的 7 个“魔鬼细节”

很多速成课只讲框架,不讲细节,结果上了考场发现每个空都在抠细节。这一节我帮你把最常考但又最容易错的七个点拆开揉碎,结合我的实操经验告诉你该怎么记、怎么理解。

4.1 GPIO 的 8 种模式,千万别只背名字

GPIO 的 8 种模式,考试不仅考选择,还可能考“请配置某引脚为上拉输入,并解释为什么”。你光背“上拉输入”四个字没用,你得知道:上拉输入是内部接了一个上拉电阻到 VDD,默认状态是高电平,按键一端接地、一端接引脚时,按下按键会被拉低,实现低电平有效检测。

我当年在教学时,发现一个特别好的记忆方式:输入模式看“外部怎么接”,输出模式看“内部怎么驱”

  • 输入:浮空输入(外部不接,引脚电平不确定)、上拉输入(内部上拉到高)、下拉输入(内部下拉到低)、模拟输入(引脚直连 ADC 内部)。
  • 输出:开漏输出(只能拉低,输出高要靠外部上拉)、推挽输出(既能拉高又能拉低)、复用开漏/复用推挽(引脚由外设控制,而不是 GPIO 模块直接控制)。

判断输出模式用不用外部上拉,就看电路设计。如果 LED 接正极,引脚接负极,那么引脚输出低电平时 LED 亮,用推挽输出就够;如果 LED 接负极,引脚接正极,引脚输出高电平时 LED 亮,推挽输出也能做到。但如果你的电路是开漏输出还要输出高电平,外部必须接上拉电阻,否则测出来是浮空电平,LED 不会亮。

4.2 时钟树:为什么 APB2 能到 72MHz,APB1 只有 36MHz

STM32F103 的时钟树,考试喜欢让你画出简化的时钟路径,或者判断某个外设挂在哪个总线上。这个知识点用“主干道和支路”来记特别清楚。

高速时钟 HSE 是外部晶振(通常是 8MHz),经过 PLL 锁相环倍频到 72MHz,这个 72MHz 是 STM32F103 的最高主频。然后 SYSCLK(系统时钟)通过 AHB 预分频器给下面各个总线:

  • APB1(低速外设总线):最高 36MHz,挂在这里的有 USART2/3/4/5、SPI2/3、I2C1/2、定时器 TIM2-TIM7、RTC、DAC 等。为什么低速?因为功耗低,适合不需要太高频率的外设。
  • APB2(高速外设总线):最高 72MHz,挂在这里的有 USART1、SPI1、TIM1、ADC1/2/3、GPIOA-GPIOE、EXTI、AFIO 等。

考试问“USART1 挂在哪条总线上”,答案是 APB2。问“USART2”“UART4”挂在 APB1。这个必须背,但别死背,记规律:“1 开头的高频外设基本都在 APB2,2-5 开头的地频外设在 APB1”,比如 USART1、TIM1、SPI1 都在 APB2,USART2、SPI2、TIM2 都在 APB1。

还有一个常考坑:ADC 挂在 APB2,虽然名字里没 1/2,但 ADC 是要采样的,频率高一点才能保证采样率。所以 APB2 上挂 ADC 是有道理的。

4.3 中断与 NVIC:抢占优先级和子优先级到底怎么区分

中断系统是 STM32 的必考点,也是很多人的丢分点。你只要记住一个场景:医院看病时的优先级系统

抢占优先级就是“能不能插队”。一个抢占优先级更高的中断,可以打断正在执行的抢占优先级较低的中断。如果两个中断的抢占优先级相同,那么它们就不能互相打断,只能等当前中断执行完再进下一个。这就像两个普通号患者,谁先到谁先看,不能插队。

子优先级就是“排队号”。当两个中断同时发生,且抢占优先级相同,谁的子优先级高(数字小),谁先执行。如果抢占优先级和子优先级都相同,那就看中断源编号,编号小的先执行。

配置函数NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)的意思是抢占优先级占 2 位(0-3),子优先级占 2 位(0-3)。这是 STM32F103 上最常用的分组方式。考试如果给你NVIC_PriorityGroup_2,让你分配,你要能算出多少个抢占优先级级别、多少个子优先级级别。

4.4 定时器:怎么用定时器产生 1ms 中断

定时器是 STM32 里最灵活的外设,也是考试最爱出代码题的地方。用 STM32F103 的 TIM2 产生 1ms 定时中断,配置思路如下:

首先要知道定时器的时钟频率。TIM2 挂在 APB1 上,APB1 的时钟是 36MHz,但当 APB1 预分频系数不为 1 时,定时器时钟是 APB1 时钟的 2 倍,也就是 72MHz。这个你需要去查手册或者看 CubeMX 生成的配置,直接记住“F103 的定时器时钟基本都是 72MHz”也可以。

然后设置预分频器 PSC 和自动重装载寄存器 ARR。定时器计数频率 = 72MHz / (PSC+1),中断频率 = 定时器计数频率 / (ARR+1)。要产生 1ms 中断,需要计数 72 次,所以设 PSC=71(即 72 分频),ARR=999(计 1000 个数)。算一下:72MHz / 72 / 1000 = 1kHz,即每 1ms 产生一次更新中断。

代码里开定时器更新中断,主循环里空转,中断服务函数里执行你需要的操作。这里提醒一点,中断服务函数里不要做复杂运算,因为中断会打断主程序,太耗时会丢数据。一般只置个标志位,主循环去处理。

4.5 串口通信:USART 接收中断里最容易出的问题

串口在实验中经常用到,也是考试的重要考点。写 USART1 的接收中断时,最经典的坑是:进中断后必须读一下 SR 寄存器和 DR 寄存器来清除标志位,否则中断会反复进入,程序卡死在中断里。

我见过太多学生写串口接收,中断服务函数里只有一句USART_ReceiveData(USART1),结果程序一会跑就卡死。原因是库函数USART_GetITStatus()检查到 RXNE(读数据寄存器非空)标志位为 SET,如果你不清标志位,CPU 会一直响应同一个中断。标准库的做法是读取 DR 数据寄存器后,RXNE 会自动清零。但如果你用了USART_ReceiveData()拿到数据后没有保存,这个读操作本身也清了标志,所以关键是每次进中断必须真的读取数据

另一个坑是波特率不匹配。你代码里设 115200,电脑串口调试助手选 9600,收到的就是乱码。排除乱码第一步永远是检查两边波特率。

4.6 启动模式与存储器映射:BOOT0/BOOT1 怎么选

STM32 的启动方式有 3 种,通过 BOOT0 和 BOOT1 引脚的电平组合来选择:

  • BOOT0=0,BOOT1=X:从主 Flash 启动,正常运行模式,几乎所有应用场景都选这种。
  • BOOT0=1,BOOT1=0:从系统存储器启动,用于 ISP 烧录,可以通过串口下载程序。
  • BOOT0=1,BOOT1=1:从 SRAM 启动,用于调试阶段,程序掉电丢失。

考试喜欢考“如果要从系统存储器启动,BOOT0 和 BOOT1 分别是什么”,答案是 BOOT0=1、BOOT1=0。如果问“正常运行时 BOOT0 怎么接”,答案是 BOOT0 接地。

结合实操提醒一句:很多开发板的 BOOT0 是通过跳线帽或拨码开关控制的,如果程序下载后不运行,先检查是不是 BOOT 设置在系统存储器模式。这个问题在实验室里简直防不胜防。

4.7 文件系统与库函数:标准库和 HAL 库到底选哪套

本科教学现在横跨两代:老教师喜欢标准库,新课程和工业界偏向 HAL 库。考试用哪套,取决于你们教材和实验指导书。我的建议是:课程摆烂法。看你们老师发的实验模板用的是标准库还是 HAL 库,你就学哪套,别在这个阶段面面俱到,不然 5 小时根本不够用。

标准库的特点是寄存器操作封装得比较浅,每个外设对应一组初始化函数和状态读取函数。你写代码时GPIO_Init()USART_Init()这类函数,参数是一个结构体,里面成员名和寄存器含义一一对应,适合理解底层原理。

HAL 库则是“一站式服务”,HAL_GPIO_Init()HAL_UART_Transmit()HAL_UART_Receive_IT(),名字长但功能集成度高。配合 CubeMX 自动生成的代码,你只需要在用户代码区(USER CODE BEGINUSER CODE END)加自己的逻辑。考试如果允许用 CubeMX,HAL 库能节省大量时间。但笔试里如果让默写初始化代码,HAL 库反而不好写,因为函数名太长,参数太多。这种情景下标准库更好写,函数结构更清晰。

5. 实验实操全流程:从零跑通一个“LED 流水灯 + 按键控制”

考试复习不落实到代码上是不行的。这一节我以“LED 流水灯 + 按键控制”为例,完整走一遍写代码、烧录、调试的流程,这套流程也是这门速成课里最值得反复练习的部分。

5.1 新建工程的完整步骤

如果你用标准库,新建工程的步骤大概是:

  1. 打开 Keil,点击Project -> New uVision Project,工程名取LED_Demo,保存。
  2. 在弹出的芯片选择窗口里,搜索并选择STM32F103C8(如果你用的是兼容版,也可以选 STM32F103C8T6)。
  3. 添加文件到工程。右键工程名,选择Manage Project Items,在 Groups 里新建UserCorePeripheral这些分组。然后把标准库的stm32f10x_gpio.cstm32f10x_rcc.cstm32f10x_usart.c等源文件加进来,启动文件startup_stm32f10x_md.s也要加。
  4. 添加头文件路径。右键工程,Options for Target -> C/C++ -> Include Paths,把标准库的头文件目录加进去。
  5. 设置编译选项。在Options for Target -> Target里,Xtal填 8.0MHz(如果你的外部晶振是 8MHz),Code Generation里勾选Use MicroLIB,因为微库可以省不少 Flash 空间。
  6. 编译。如果零错误零警告,工程就建好了。

如果这个环节你经常卡在“找不到头文件”或者“重复定义”,多半是头文件路径没加全,或者同一个.c文件被重复添加了。

5.2 写代码:LED 流水灯 + 按键控制中断

工程建好后,写代码。这里我用标准库的代码风格提供一个完整示例,也是我当年带学生时觉得最好理解、改动最少的一版:

#include "stm32f10x.h" // 简易延时函数,用 SysTick 实现 void Delay_us(uint32_t us) { uint32_t i; for (i = 0; i < us; i++) { // 空循环,编译器优化时需要加 volatile __NOP(); } } void Delay_ms(uint32_t ms) { uint32_t i; for (i = 0; i < ms; i++) { Delay_us(1000); } } // GPIO 初始化 void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); // PA0-PA7 输出推挽,驱动 LED GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // PB0 输入上拉,接按键 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStructure); } // 外部中断初始化 void EXTI_Config(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 将 PB0 连接到 EXTI0 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 按键按下产生下降沿 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } // 外部中断服务函数 void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET) { // LED 翻转 if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0) == 0) { GPIO_SetBits(GPIOA, GPIO_Pin_0); } else { GPIO_ResetBits(GPIOA, GPIO_Pin_0); } // 清除中断标志 EXTI_ClearITPendingBit(EXTI_Line0); } } int main(void) { uint8_t i; GPIO_Config(); EXTI_Config(); while (1) { // 流水灯:PA0 -> PA1 -> PA2 循环点亮 for (i = 0; i < 3; i++) { GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2); // 全部灭 GPIO_SetBits(GPIOA, GPIO_Pin_0 << i); // 点亮第 i 个 LED Delay_ms(500); } } }

这段代码如果遇到编译问题,最常见的是GPIO_Pin_0 << i这个写法,因为枚举类型和 uint8_t 混用有时告警。你可以先定义一个uint16_t pin = GPIO_Pin_0;,然后pin <<= i;来避免。考试时写代码,不求最优,但求能跑。

下载烧录后,你应该看到三个 LED 依次点亮,按下按键,第一个 LED 状态翻转。

5.3 烧录时会遇到的 3 个经典报错

烧录阶段,最常见三个报错,我把解决思路列成速查表:

报错信息原因解决方法
No ST-Link detected驱动没装好,或 ST-Link 供电不足,或 USB 线质量差重装驱动,换线,换 USB 口,检查 ST-Link 指示灯
Error: Flash Download failed - "Cortex-M3"芯片型号选错,或下载算法没配置,或芯片锁死检查 Options for Target -> Device 芯片型号,Utilities 里重新添加 Flash 下载算法,用 ST-LINK Utility 全片擦除
Cannot access target/RDDI-DAP Error接线错误,或者板子没供电,或者调试口被禁用检查 SWDIO/SWCLK 接线,检查目标板电源,如果代码里禁用了 SWD 口,用 FLYMCU 或 STLINK Utility 恢复

第三个报错里“调试口被禁用”是个大坑。有些代码初始化时把 GPIO 重新映射了,把 SWD 引脚占了,然后用 Keil 就再也连不上芯片了。解决方法是:用 ST-LINK Utility 里面Target -> Connect之前按住复位键,或者用短接线把 BOOT0 拉高停在复位状态,然后全片擦除,再恢复 BOOT0 为低。

6. 常见复习坑与应试技巧:考前必看的“后悔药”合集

这部分内容,是我结合多年辅导学生经验总结出来的。如果你已经到了冲刺阶段,下面每一条都可能帮你捡回 5-10 分。

6.1 坑点 1:只背概念,不跑代码

嵌入式系统是一个实践性极强的科目,笔试虽然考概念,但概念题一旦结合实际代码场景,就考查你“见得够不够多”。比如考题问“如果你配置 GPIO 输出模式为开漏,外部没接上拉电阻,LED 能亮吗?”你要是只看过书,大概率答错。但如果你跑过流水灯实验,你马上会想:“开漏输出高电平不行,得上拉。”

所以我建议,环境搭好之后,先花 20 分钟把老师 PPT 里的示例代码全部敲一遍。哪怕你觉得很简单,也敲一遍。你会发现很多“原来如此”的细节。

6.2 坑点 2:死记硬背头文件里的寄存器地址

STM32 的寄存器地址,考试如果考到,一般会给你表格,你不需要背。你需要背的是“外设为什么挂在特定总线”以及“RCC 时钟要打开哪个位”。比如:你用了 GPIOA,必须在代码里写RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);,否则寄存器操作无效,程序跑飞但硬件无反应。这个知识点比背寄存器地址重要得多。

6.3 坑点 3:中断服务函数里做耗时操作

前面提过,中断里尽量只做置标志位和简单赋值,复杂逻辑放主循环里。考试如果给你一段中断服务函数的代码,让你判断哪里有问题,你一定要能指出“延迟函数不能在中断里长时间调用”。原因很简单:中断优先级高的任务如果一直占着 CPU,低优先级任务就永远得不到执行,系统实时性就无从谈起。

6.4 应试技巧:抓大放小,按分值分配时间

期末试卷的题型分布一般比较稳定。以我见过的多所高校的嵌入式系统试卷为例,大致分值分布如下:

  • 选择/填空/判断(30-40 分)—— 概念记忆,快速做
  • 简答题(20-30 分)—— 流程题,比如“简述 STM32 启动流程”“简述 GPIO 八种模式”
  • 代码分析题(20-30 分)—— 给你代码写结果,或补全代码
  • 综合应用题(10-20 分)—— 设计一个小系统,比如“设计一个基于 STM32 的智能台灯,画出系统框图,写出主要外设”

根据分值分配你的 5 小时复习,而不是从头翻课本。如果代码分析题占 30 分,你就要多练 3-5 道真题;如果综合题只有 10 分,那临时背个模版就好。

6.5 复试/面试必问:把项目经验说得“像自己做的”

如果你是考研复试要用,光会考试还不够,面试官会问“你有没有做过 STM32 项目”。这时候这门速成课的作用就体现出来了——它给你的工具包和实验代码,其实就是一个“微型项目”。

我建议你在复试前,把 LED 流水灯、按键中断、串口打印三个实验合并成一个“多功能嵌入式实验平台”项目,写进简历。描述时这么说:“基于 STM32F103 构建多功能实验平台,实现了 GPIO 控制 LED 流水灯、外部中断检测按键、USART 串口通信等功能,掌握了基于标准库的嵌入式开发流程、中断优先级配置和串口调试方法。” 面试官再问你,你就能从容回答 GPIO 怎么配、中断优先级怎么设、串口乱码怎么排查。这些实验你都亲手跑过,回答起来非常自然,不容易翻车。

7. 我的最终建议:速成课的正确打开方式

作为一门“复习速成课”,这套资源最大的价值不是“教你怎么精通嵌入式”,而是“教你怎么在有限时间内拿到够用的分数”。我见过不少学生,考完试后说:“如果当时有人告诉我考点就那么多,我也不至于挂科。” 这门课要解决的就是这个信息差问题。

我个人在实际使用这套资源时的体验是:别把它当课程,把它当“带练教练”。你先看 15 分钟重点讲义,然后立刻照着工具包把环境搭好,跑一遍实验,做完之后再看真题,你会发现自己脑子里已经形成了一套“考点地图”。这比反复看视频课有效得多。

最后再分享一个小技巧。考前最后一晚,把每个实验的操作流程写在一张 A4 纸上,不是背代码,而是写步骤:“新建工程 -> 配时钟 -> 初始化 GPIO -> 写主循环 -> 编译 -> 下载 -> 看现象”。到了考场上,无论笔试还是上机,这个流程都是你的底层骨架,能引导你写出完整代码。把这张纸放在手边,心里就有底。

这门课后续还可以怎么扩展?如果你考完试觉得嵌入式有意思,可以继续做两件事:一是把 HAL 库 + CubeMX 开发流程跑一遍,这是目前工业界的主流;二是做一个小项目,比如智能小车、环境监测节点,把 GPIO、定时器、串口、ADC 串成一个完整系统。到那时候,你回头看这份速成课资料,会觉得它只是你嵌入式之路的第一块敲门砖,但足够好用了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询