嵌入式系统这门课,很多人的感受是“上课听得懂,考试不会做,代码更是一头雾水”。尤其是STM32,光是开发环境就把一批人拦在门外了。我这个资源包就是冲着这个问题去的——用5小时带你跑完嵌入式系统全部核心内容,帮你把期末速成、补考、专升本、考研复试里最常考、最容易踩坑的点一次讲透,而且环境搭建工具包也一并附上,照着装就能用。
这个资源不是简单把课本目录念一遍,而是按“考试考什么、工作用什么”两条线穿插着来。嵌入式系统概念太抽象,我就用STM32的实际案例来讲;STM32代码太复杂,我又反过来用考试考点去串。两条线互相解释,你会发现原来这门课没有你想象的那么难。
先说清楚这个资源适合谁:期末想快速突击拿高分的、补考需要重新过一遍的、专升本要考专业课的、考研复试需要回答“你会什么嵌入式技术”的,还有刚入门STM32想找个靠谱路径的新手。如果你只是想把知识点背下来应付选择填空,这个资源帮你划重点;如果你还想动手跑几个实验,工具包和环境配置流程也给你准备好了。
1. 内容整体设计与思路拆解
1.1 为什么嵌入式系统这门课“一听就会,一考就废”
我见过太多学生在这门课上栽跟头,不是我吓唬你,确实有规律可循。嵌入式系统不是单纯的理论课,也不是纯粹的编程课,它是软硬件交叉的学科。教材里讲ARM架构、中断系统、存储器映射,这些概念离实际代码太远,你听的时候觉得“哦,原来如此”,但拿到试卷上给你一个具体芯片让你分析寄存器,你就懵了。
反过来,如果只学STM32编程,不回头补架构知识,考试遇到“简述嵌入式系统与通用计算机的区别”这种题目,你又会觉得无话可说。这门课的难点就在这——它要求你在“懂原理”和“会操作”之间来回切换。
我在设计这套速成课时,把内容拆成了“理论考点”和“实操技能”两大块。理论考点包括ARM Cortex-M架构、启动流程、存储器映射、中断与异常、通信协议这些笔试必考内容。实操技能包括GPIO点灯、定时器中断、串口收发、ADC采集这些STM32基础实验。每个理论考点我都尽量对应到一个实操案例,让你理解起来有抓手;每个实操案例我又会回头指出它对应教材里的哪个知识点,这样考试时你就有话可说。
1.2 课程结构安排的底层逻辑
普通人学嵌入式系统会犯的最大错误,是过度纠结某一块内容。比如有人死磕寄存器配置,花三天时间研究GPIO的MODER寄存器每一位该怎么设,结果发现用STM32CubeMX两下就配置好了。还有人反过来,全程用封装好的HAL库函数,连寄存器长什么样都不知道,考试考到“GPIO有哪几种工作模式”就卡住了。
所以我的课程结构非常明确:先搭知识框架,再填具体细节。框架包括嵌入式系统的定义、分类、Cortex-M的体系结构,这部分必须快速过,建立全局观。然后进STM32的具体外设,每个外设我只讲“三个问题”:它解决什么问题、它最核心的寄存器或库函数是什么、考试怎么考它。
三个问题讲完,配上对应的代码示例,这一块就算过。不会让你在某个外设上无限深挖,因为速成课的目的是让你在最短时间内建立起完整的知识网络,而不是成为某个小方向的专家。等你考试过了,或者以后做项目真用到某个外设了,再深入也不迟——那是后话。
1.3 环境搭建工具包为什么必须配套
说句实话,嵌入式系统这门课如果只看书不跑代码,等于白学。但很多学生倒在了第一步——环境装不上。Keil MDK装好了,芯片包没装;芯片包装好了,驱动没装;驱动装好了,板子连不上;板子连上了,程序烧不进去。每一步报错都能劝退一批人。
这个工具包存在的意义,就是把这些坑都提前填平。里面包含的不仅是一堆安装包,还有我踩坑多年总结出来的“安装顺序”。比如Keil MDK安装时必须以管理员身份运行,芯片包需要用Keil自带的Pack Installer安装而不是手动解压,ST-Link驱动和Keil的版本有兼容性要求,这些细节官方文档不会告诉你,但实操中处处都是雷。
2. 核心细节解析与实操要点
2.1 开发环境搭建的标准化流程
开发环境我推荐Keil MDK + STM32CubeMX + ST-Link这个组合,是当前最主流、资料最多、考试也好解释的方案。
先装ST-Link驱动,再装Keil MDK,最后装STM32CubeMX,这是标准顺序。驱动放第一是因为如果先装Keil再装驱动,偶尔会出现Keil识别不到调试器的情况,到时候你还得卸载重装,太折腾。Keil MDK建议直接用最新版,别用太老的版本,因为新版对ARM Compiler 6的支持更好,编译速度也快不少。装完Keil记得装对应型号的芯片包,STM32F1系列就装Keil.STM32F1xx_DFP,这个包可以在Pack Installer里直接搜,也可以去KEIL官网下载。
STM32CubeMX是个图形化配置工具,它能自动生成初始化代码。你别觉得这是“作弊”,考试不考你手写启动代码,工作后更没人手写寄存器初始化。CubeMX生成代码、HAL库封装硬件细节、用户只关注业务逻辑,这才是行业主流做法。
工具装好后的验证方法很关键。打开Keil,新建一个空工程,选择你手上的芯片型号,编译一下,如果不报错就说明编译器正常。然后接上开发板,点击下载按钮,如果能在Debug窗口看到芯片信息,说明调试器连接正常。这个流程走通了,你的环境就算彻底OK了,后面所有实验代码都跑得起来。
2.2 新版Keil MDK的一个常见坑:默认编译器变化
这几年Keil MDK更新的一个明显变化,是默认编译器从ARM Compiler 5切换到了ARM Compiler 6。但考试和很多旧教材里的示例代码,都是基于AC5写的,尤其是标准外设库(SPL)的代码,拿到AC6下面编译,经常会冒出一堆警告甚至错误。
而且ARM Compiler 6和ARM Compiler 5在语法支持上有差异,AC6对C99和C11的支持更好,但对旧风格代码反而更严格。比如在某些旧代码里,使用未声明的函数会被直接当作错误,在AC5里只是一个警告。
我自己在备考阶段就踩过这个坑,网上找了一段标准库的串口示例代码,粘到工程里编译直接报错,后来发现是编译器版本问题。解决方法是:在Keil的Options for Target -> Target标签页里,把编译器显式切换为AC5;或者在工程里使用HAL库重新写一遍。我在工具包里两套代码都准备了,就是为应对这个问题。
2.3 认识STM32的“语言”:从寄存器到HAL库
学STM32编程,你需要明白一个核心问题:程序是怎么控制硬件的?答案是通过寄存器——寄存器是芯片内部特定功能的存储单元,你往某个寄存器写入特定值,硬件就会产生相应动作。比如你设置GPIOA的MODER寄存器的某一位为01,那么对应的引脚就变成了输出模式。
直接操作寄存器,代码效率最高,但学习曲线陡峭。STM32F103有几十个外设,每个外设又有十几个寄存器,手动配地址很容易出错。所以ST官方提供了三套开发方式:寄存器版最底层,标准外设库(SPL)把寄存器操作封装成了函数,HAL库又进一步,把功能封装成了更通用的接口,同时支持代码自动生成。
对于备考而言,我建议你至少要看懂HAL库的代码流程,能知道HAL_GPIO_Init()做了什么、底层大概设置了哪些寄存器。至于考试,讲到GPIO的时候,你要能说出“输入模式、输出模式、复用模式、模拟模式”这四种基本类型,以及推挽输出和开漏输出的区别——这些才是笔试真正会考的。
2.4 STM32的核心外设图谱
STM32外设很多,但考试和入门阶段,你需要掌握的就那么几个:GPIO、外部中断(EXTI)、定时器(TIM)、串口(USART)、ADC、SPI、I2C,以及DMA。
GPIO是基础和门面,所有实验的起点。点灯是最简单的GPIO输出实验,按键检测是最典型的输入实验。这个外设必须掌握到能独立配置的程度。
定时器是STM32里最复杂的外设之一,功能太丰富了:基本的定时、PWM输出、输入捕获、编码器接口。笔试常考的有定时器的四种计数模式(向上、向下、向上向下、编码器模式)、预分频器和自动重装载寄存器的配合计算、PWM的频率和占空比公式。面试也很喜欢问这个,因为做电机控制、呼吸灯、测频率都离不了定时器。
串口是嵌入式系统最常用的调试手段,也是通信协议的基础。你至少要会配置UART发送和接收,知道波特率是怎么计算的,知道中断接收的流程。很多项目里的打印信息都是通过串口输出的,可以这么说,不会用串口,STM32开发寸步难行。
ADC用于采集模拟信号,典型应用是读取电位器电压、光敏电阻、温度传感器。SPI和I2C则是连接外部芯片的常用接口,比如Flash芯片、OLED屏、加速度传感器。DMA可以让外设直接访问内存,减轻CPU负担,做大量数据传输时非常有用。
这些外设不是孤立学的,它们之间经常配合使用。比如DMA+ADC采集多通道电压、定时器触发ADC采样、串口中断+DMA收发不定长数据——考试喜欢这样组合出题,因为能考察综合能力。我在速成课里每个外设都配了最小可运行的代码示例,就是为了让你看到“最小系统”长什么样,然后在这个基础上叠加功能。
3. 实操过程与核心环节实现
3.1 以CubeMX为核心的快速工程建立法
我强烈建议你用STM32CubeMX来建工程,在符合考试要求的工程里,它比手写寄存器快得多,也不容易出错。这里给你一个标准操作流程:
第一步,打开STM32CubeMX,选择芯片型号。你考试用的板子如果是常见的STM32F103C8T6,直接搜“STM32F103C8”就能找到。如果你用的是其他型号,确认好是F1系列还是F4系列,不同系列的外设映射稍有不同。
第二步,配置时钟。这是最容易被忽略的环节。CubeMX的Clock Configuration页面里,你要把系统时钟配置到芯片支持的最大值。比如STM32F103系列最高72MHz,你需要配置外部高速晶振HSE为8MHz,然后通过锁相环PLL倍频到72MHz。这个不配好,串口波特率会不准,定时器定时也会偏,甚至程序跑着跑着就死机了。
第三步,配置引脚。在Pinout View里,你可以图形化地配置引脚功能。比如你想让PC13引脚输出高低电平,就点击PC13,在下拉菜单里选择GPIO_Output。如果你想用串口1,就点击PA9和PA10,分别选USART1_TX和USART1_RX。这个视图非常直观,配置完一目了然。
第四步,生成代码。点击右上角的GENERATE CODE,选择Toolchain为MDK-ARM,CubeMX就会自动生成一个完整的Keil工程。这个工程里已经包含了启动文件、系统时钟初始化、引脚初始化代码,你需要做的就是在main函数里添加自己的业务逻辑。
3.2 GPIO点灯实验:理论与实践的双考点
点灯实验在笔试里对应的是GPIO的结构和工作模式。GPIO模块的每个引脚可以配置为输入或输出,输入模式下还可以选上拉、下拉、浮空;输出模式下可选推挽或开漏。这些都是选择题和简答题的常客。
我直接列出最常见的考点:
推挽输出(Push-Pull):可以输出高电平和低电平,驱动能力强。大多数场景,比如驱动LED、蜂鸣器,都选推挽输出。开漏输出(Open-Drain):只能主动拉低电平,不能主动输出高电平,需要外接上拉电阻才能输出高电平。它主要用于I2C通信和设备共享总线,因为可以“线与”。
实际配置代码长这样(HAL库):
GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOC_CLK_ENABLE(); // 使能GPIOC时钟 GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); while (1) { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // 输出低电平 HAL_Delay(500); HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // 输出高电平 HAL_Delay(500); }第一件事打开GPIOC的时钟,这是新手最容易漏的——在STM32里,大多数外设都需要先使能时钟才能工作,原因是STM32为了省电,默认关闭了绝大多数外设的时钟。第二件事是定义GPIO初始化结构体,填好引脚号、模式、上下拉、翻转速度。第三件事就是主循环里翻转电平。
3.3 定时器中断实验:搞懂数值计算
定时器中断在考试里的出镜率非常高。STM32的定时器有多路,基本定时器TIM6和TIM7最简单,通用定时器TIM2-TIM5除了基本定时功能还带PWM、输入捕获等功能。
定时器的核心是两个寄存器:预分频器PSC和自动重装载寄存器ARR。定时器时钟先经过PSC分频,然后计数器CNT按照分频后的频率递增或递减,当CNT的值等于ARR时,产生更新中断(溢出中断)。
定时时间的计算公式是:
定时时间 = (PSC + 1) × (ARR + 1) / 定时器时钟频率
举个例子,STM32F103的TIM2挂在APB1总线上,时钟频率是72MHz。我想让定时器每1毫秒产生一次中断,那么可以设PSC = 71,ARR = 999。代入公式:(71+1) × (999+1) / 72,000,000 = 0.001秒,正好1毫秒。
如果你跑代码发现定时时间不对,第一检查CubeMX时钟树配置是否正确,第二检查PSC和ARR的数值对不对。我见过太多人公式记住了,但PSC和ARR不分,把分频和重装载搞混了,结果定时时间差了一百倍。
3.4 串口通信实验:调试一切的基础
串口是嵌入式世界里最强大、最简单的调试工具。STM32上实现串口通信,步骤大概是:初始化UART外设、配置读写函数、接收中断处理。
CubeMX里配置串口非常方便,选好USART1,设置波特率(通常115200)、数据位(8位)、停止位(1位)、校验位(无)。生成代码后,使用HAL_UART_Transmit()发送数据,使用HAL_UART_Receive_IT()接收数据。
char msg[] = "Hello STM32\r\n"; HAL_UART_Transmit(&huart1, (uint8_t *)msg, strlen(msg), 1000);这里有个关键点:HAL_UART_Transmit的最后一个参数是超时时间,单位毫秒。如果在这个时间内没发完,函数会返回超时错误。如果你发现串口发不出去数据,很可能就是这个超时时间设得太短,或者串口根本没有成功初始化。
接收方面,HAL库默认的HAL_UART_Receive_IT是单字节接收,每接收一个字节进一次中断回调函数,效率偏低。如果你想接收一整串不定长数据,还可以在中断回调里自行组包。这个方法在工作中很常用,比如接收GPS的NMEA数据、WiFi模块返回的AT命令响应等。
3.5 常见报错的代码级排查
很多同学拿到别人的工程后编译,结果直接报错。我这里说几个最常见的:
“No STM32 Target Found”这个报错是我的经验里出现频率最高的,九成情况是调试器没有连接好。排查顺序是:先确认ST-Link的USB线插了,再确认开发板供电正常,然后确认Keil的Debug设置里选择了ST-Link Debugger,最后确认下载时芯片没被读保护。我见过有同学把USB线插在了一个只有供电功能的充电口上,数据线不同,自然连接不上。
“Error: Flash Download failed - Cortex-M3”这种报错通常是芯片Flash保护或Keil的Flash下载算法配置错误。新手最常见的情况是芯片型号选错,导致Flash大小对不上。检查Options for Target -> Debug -> Settings -> Flash Download里是否勾选了Reset and Run,以及Programing Algorithm列表里的芯片型号是否与你手上的芯片一致。
乱码问题:串口接收到的全是乱码,九成是波特率不匹配,检查一下CubeMX生成的时钟是不是72MHz,代码里的波特率和串口助手的设置是不是一致。注意串口助手选了非标准波特率、还选了奇偶校验,也会导致乱码。
编译报错很多:检查Keil编译器版本。如果你是AC6编译AC5的代码,建议切换编译器或者重新用HAL库写一遍。如果代码里用了中文注释,请把文件编码转为UTF-8或者GB2312,否则可能因为编码问题导致编译失败。
4. 常见问题与排查技巧实录
4.1 环境与工具链高频问题速查表
我在教学过程中经常被问到环境问题,这里整理成一张速查表。表里汇总的都是我实际反复见过的场景,能直接对号入座去排查。
| 问题现象 | 常见原因 | 解决方案 |
|---|---|---|
| Keil安装后无法打开 | 没有以管理员身份运行安装包 | 卸载后右键“以管理员身份运行”重新安装 |
| 芯片包安装失败 | 手动解压导致的路径错误 | 使用Pack Installer安装,不要把包手动塞进Keil目录 |
| 识别不到ST-Link | USB线只支持供电不支持数据、驱动异常 | 换数据线,重新安装ST-Link驱动 |
| 下载时报No Target Found | 调试器连接不良或芯片读保护 | 重插调试器,检查连接,解除读保护 |
| 编译速度极慢 | 优化等级过高或杀毒软件干扰 | 调低Optimization等级,把工程目录加入杀毒白名单 |
| 串口发不出去数据 | 超时时间过短或引脚配置错了 | 把超时改长,核对TX/RX引脚 |
| 程序一进中断就卡死 | 中断优先级配置错误 | 检查NVIC设置,确认中断使能和优先级分组一致 |
| 现象不稳定偶发故障 | 供电不足或时钟配置错误 | 外接5V/3.3V供电,核对时钟树 |
4.2 学习路径上的认知纠偏
很多同学学嵌入式系统时会在“要不要学寄存器”上纠结很久。我的观点是:速成阶段不要从寄存器入手刷题,会严重消耗信心。你可以通过HAL库把功能跑通,再回头去看寄存器级的代码,这样更容易理解。但考试如果考寄存器,你至少要能看懂常见的位操作,比如“|=”、“&=~”是干什么用的,这属于C语言功底。
还有个常见的误区是“背代码”。嵌入式这行,死记硬背代码没什么用,代码是死的,需求是活的。考试考的是原理和理解,不是默写。比如你背下了点灯实验的每一行代码,考试换成让你配置某个引脚为复用功能,你就傻眼了。真正要记的是“GPIO的复用模式是什么含义”,是“为什么配置复用功能时不选输出模式而是选复用模式”。
4.3 面试和复试里的嵌入式问题清单
考研复试和嵌入式岗位面试,提问风格和笔试完全不同,更注重你对整个体系的把握。频率最高的问题包括:
“单片机与嵌入式系统的区别”这个问题每年复试必问到。能听懂最简单通俗的解释是:单片机是把CPU、存储器、外设集成在一颗芯片上的微型计算机,比如8051、AVR、STM32;而嵌入式系统是一个更大范围的概念,凡是“嵌在设备里完成特定功能的计算机系统”都算嵌入式系统。单片机是嵌入式系统的核心处理器之一,而且通常用于中低端场景,而嵌入式系统还包括带操作系统的更复杂系统,比如基于Linux的工控机、手机SoC等。
“STM32的启动过程是怎样的”面试官问这个,是想确认你是否了解从复位到main函数的完整过程。这个问题要答到三个层面:硬件上,复位向量从0x00000000取出栈顶地址,从0x00000004取出复位中断服务函数地址;然后执行SystemInit函数初始化时钟;最后跳转到main函数。
“什么是中断?中断和异常有什么区别”这个问题也经常出现。中断是外部事件触发的异步信号,异常是执行指令时发生的同步事件。Cortex-M内核把中断和异常统称为“异常”,其中编号越小优先级越高。复位是优先级最高的异常,然后是NMI,再往下是各种硬件错误,最后才是外部中断。
“I2C和SPI的区别”I2C是半双工的两线制通信(SCL+ SDA),多设备通过地址区分,速度一般在数百kHz;SPI是全双工的四线制通信(SCLK+ MOSI+ MISO+ CS),一个主机可以连接多个从机,每个从机用一条片选线区分,速度可以达到几十MHz。简而言之:I2C接线少但速度慢,SPI接线性多但速度快,看你项目需要怎么选。
4.4 考场应急与作答技巧
如果你是这门课的“速成型选手”,考试时这几个技巧非常实用。
名词解释和简答题,一定要用“分点作答”的格式。考官看卷是流水线速度,你写成一大段他很可能看漏了关键词。比如问“什么是嵌入式系统”,你回答“嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统”,每个关键词都有,就是高分。
计算题要注意单位换算。定时器定时、波特率计算这些题目,最容易丢分的点就是时钟频率算错。建议做题时把单位统一写成Hz再代入公式,避免MHz和kHz混用。
遇到不会的大题,千万别空着。把你想到的、相关的知识全部写上去,因为嵌入式系统这门课的阅卷通常采用“按点给分”。比如问“设计一个基于STM32的温度采集系统”,你就把能想到的环节全部列出来:温度传感器选型、ADC采集、串口发送、LCD显示、阈值报警。每个环节写两三句,也能把大多数分数捞到。
5. 基于项目实战的冲刺方案
5.1 三个经典项目的速成套路
如果复习时间有限,建议你集中精力把下面三个项目做通,它们能覆盖STM32的八成考点。
项目一:智能台灯,功能是环境光检测加自动开关灯。它会用到ADC采集光敏电阻电压、GPIO控制LED、定时器实现PWM调光。这个项目涵盖了STM32最基础的几个外设,而且逻辑简单清晰,非常适合用来整体走通一套代码流程。
项目二:串口远程控制,通过电脑串口发送命令,控制开发板上的LED亮灭。这个项目用到了USART中断接收、字符串解析、GPIO控制,做下来你对“中断接收+状态处理”这套常用框架就有感觉了。以后做WiFi模块、蓝牙模块、ESP8266的时候,处理逻辑都大同小异。
项目三:基于FreeModbus的工业通信,在STM32上移植Modbus从站协议栈,通过485总线与上位机通信。这个项目偏工业方向,专升本、考研复试里讲到工业控制时很加分。重点是把数据帧解析和寄存器映射搞明白。
5.2 考前三天的高效复习节奏
不管是期末速成还是补考冲刺,考前三天合理安排非常关键。我不建议你把三天全耗在敲代码上,也别只背书不跑代码。比较合理的节奏是:
第一天:过完环境搭建,把CubeMX生成工程的流程走通,跑通GPIO点灯和串口打印。这两个实验必须亲手做,因为它们验证了你的工具链没有问题,之后的代码就算你来不及跑编译运行,至少知道原理。
第二天:集中看理论考点。把Cortex-M架构、启动过程、中断系统、存储器映射、通信协议这些高频考点过一遍,形成“知识树”。方法是用笔在纸上画图,画出STM32的整体结构图,标注每个外设挂在哪个总线上,时钟从哪里来,中断怎么走。这个图是考试答题的万能素材。
第三天:刷题和复盘。找几套历年真题做一遍,重点关注错题。我的经验是,这门课的选择题和判断题,错误选项通常设置在“概念混淆”和“数值错误”上,你只要能把题目中的每个选项都对应到概念上,就能稳拿分。
5.3 考试当天的一些小建议
去考场前,把你做过的实验代码过一遍思路,特别是定时器计算、串口波特率计算这两个经典计算题。到了考场,拿到试卷先做会的,不会的先跳过,别在卡住的地方死磕,选择题和判断题往往能给你提供其他题的线索,后面的解答题也可能有相关的叙述给你提示。做完之后如果还剩时间,重点检查所有计算题的公式和单位换算——这里丢分最可惜。
6. 资源配套与使用建议
6.1 工具包内容清单
工具包里包含的内容,我按用途分了几类:开发环境类,包含Keil MDK安装包、STM32CubeMX安装包、ST-Link驱动、STM32F1/F4芯片包;资料文档类,包含STM32F103数据手册、参考手册、中文版本HAL库手册;代码示例类,包含GPIO、定时器、串口、ADC、PWM、I2C、SPI、DMA等外设的最小工程代码;速成讲义类,包含一套按考点整理的PPT课件和一份高频考点速记表。
不是说所有东西都要用完,你按自己的基础去取舍就行。有C语言基础但没接触过STM32的,按顺序走一遍;之前学过一点但忘干净了,直接扫速记表查漏补缺;即将面试的,重点看面试问题清单。
6.2 合理使用工具包的策略
我特别想提醒的一点是:这个工具包是帮你省时间的,不是让你只依赖它的。环境已经帮你配好,代码已经帮你写好,如果你只是把示例代码烧录进去,看到现象就完事了,那你学到的东西会非常有限。正确做法是:每次跑通一个实验,就尝试改一下参数、加一个功能、或者用另一种方式实现同样的效果。
比如点灯实验跑通了,你就问问自己:把延时改成定时器能做到吗?把点灯改成PWM呼吸灯怎么做?原来代码里用的是HAL_Delay,这是软件延时,占用CPU,如果用定时器中断,CPU就能空出来干别的事——这两个方案的取舍,就是嵌入式系统设计的核心思维。
再说回考试。这门课能速成,但嵌入式这个方向想走远,没有捷径。速成是为了让你跨过眼前的门槛,后续如果有时间,强烈建议你继续深入,把FreeRTOS、Linux驱动、RT-Thread这些逐步拿下。嵌入式是一片很深的海洋,希望这份资料能成为你第一块靠谱的跳板。有问题欢迎随时讨论,祝考试顺利。