
简介《嵌入式系统》实验报告文档面向高校嵌入式课程学习者和需要完成实验课记录的学生基于苏州大学金葫芦平台整理六个验证性实验覆盖GPIO编程、串口通信与中断、PWM、Flash、SPI以及独立看门狗等基础模块。文档按实验目的、准备、过程要求、具体步骤截图和实验总结组织能帮助读者对照开发环境搭建、工程导入编译、串口更新与现象观察等环节理解硬件与软件的交互。包内共1个docx文件约10.04MB是一册可直接查阅和编辑的实验报告文档便于归档、打印和按课程要求补充修改。已有400人学习下载适合用作实验课前预习、课中对照和课后复盘也可为后续设计性实验提供报告框架与排错思路参考。1. 先弄明白嵌入式入门到底在学什么很多人对嵌入式的第一印象是“焊板子”“看电路图”还没开始就先发怵。其实入门阶段做的事比想象中朴素让一块巴掌大的板子按你的意思亮灯、发声、回你一句话。它不像写网页那样点一下刷新就能看到结果程序要先编译、再下载跑进芯片里你才能看到现象。这也正是新手最容易懵的地方代码看着没错灯就是不亮问题可能只是线没插好或者下载的还是上一次的旧文件。这份六个验证性实验的合集把这条路切成了六小步从点亮一盏 LED 一直走到让系统在卡死时自己重启。它适合刚接触嵌入式、手里有开发板却不知道从哪下手的人也适合想先把“完整流程走通一遍”再谈原理的人。2. 六个实验的全貌先看清路线再动手新手最容易犯的错是拿到资料就从实验一开始逐字硬啃啃到第三个实验发现前面的概念全忘了。更省力的做法是先花二十分钟把六个实验当成一张地图看一遍知道每一步在练什么、为什么排在这个位置。这一章就干这件事先给你一张全貌表再讲清楚顺序背后的逻辑最后说说动手前要准备什么。2.1 六个实验各练什么一张表看明白六个实验都围绕同一块教学开发板和配套的图形化 IDE 展开区别只在于每次多打开一个“构件”。所谓构件你可以理解成厂商提前写好的积木点灯的、收发串口的、输出波形的、读写存储的各管一摊。你不需要从寄存器一位一位地配只要调用它给你的函数就能让硬件动起来。实验练的核心概念你会看到的现象实验一GPIO 输入输出、IDE 基本使用LED 按程序亮灭按键状态能被读进来实验二串口通信、中断、多字节组帧电脑发一个字符板子回一个字符实验三定时器与 PWM灯的亮度变化或波形占空比变化实验四Flash 擦除与读写断电再上电之前写进去的数据还在实验五SPI 总线主从通信板子和外围器件之间能交换数据实验六独立看门狗程序卡死后系统自动复位重来看这张表时别急着记名词先记住一条主线前两个实验解决“我能控制它、它能回应我”中间三个解决“它能输出、能存、能对外通信”最后一个解决“它出问题了怎么办”。这条主线比任何定义都重要。2.2 为什么顺序不能乱从“会亮”到“会自保”实验一的 GPIO 看起来最没技术含量无非是让灯亮但它是整条链路的地基。LED 亮了说明你的电脑、数据线、IDE、编译器、下载工具、板子这六个环节全都通了。这六个环节里任意一个出问题现象都是“灯不亮”而新手往往第一反应是怀疑代码。先把这条链路验证通后面所有实验的排错才有参照物。实验二引入串口和中断性质变了从“我单向命令它”变成“它能主动打断我”。中断是嵌入式里非常核心的思维——CPU 不必一直守着某个引脚事情来了再处理。这个思维不建立起来后面看任何带中断的代码都会觉得跳跃。实验三的 PWM 依赖定时器而定时器和中断是同一套机制所以它必须排在实验二之后。实验四到实验六原文明确写的是“基于构件”的编程Flash 是存储、SPI 是总线、看门狗是系统保护。这三个实验的共同点是你已经默认“板子能跑、能通信”了注意力可以放在单一模块上。如果顺序反过来你会在还没确认下载链路是否正常的时候就去调一个根本看不到现象的存储实验那才是真正的折磨。2.3 动手前要准备的三样东西第一样是硬件一台电脑、一根 Type-C 数据线、一套教学开发套件。这里有个血泪经验——数据线一定要用能传数据的不能随手抓一根只能充电的线否则你会对着“连接不上设备”的提示怀疑人生半小时。第二样是软件配套的集成开发环境以及从教学资源里下载的示例工程包。装完之后先别急着写代码把 IDE 打开确认菜单里有“导入工程”“编译工程”“串口更新”这几个入口心里有数再往下走。第三样是文件夹习惯。原文里特别强调“分门别类各有归处”这不是形式主义。建议你建一个总目录下面按实验编号分子目录每个实验里再分“原始模板”“我的版本”“截图记录”。我见过太多人把所有工程堆在桌面改到第三个实验时已经分不清哪个文件夹是能跑的了。这个习惯花你五分钟能省你后面几个小时。提示每个实验开始前先把原始模板工程复制一份再改永远保留一份没动过的。改坏了直接换回来比重装环境快得多。3. 第一个例子怎么跑起来亲手点亮一盏 LED这一章是全程最需要你动手的部分。别只看把板子插上跟着做一遍哪怕中间出错也没关系。第一个例子跑通的那一刻你对嵌入式的畏惧会消掉一大半因为你会亲眼看到“我写的东西在真实世界里发生了”。3.1 装 IDE 和建文件夹别小看这一步装好 IDE 之后先做三件事。第一在磁盘上建一个总工作目录名字随意但不要带空格和中文路径越短越好因为有些编译工具对长路径和特殊字符处理得不够好这是新手翻车的经典原因之一。第二在总目录下建一个“实验一”的子目录。第三把示例工程包里实验一对应的模板工程整个复制进来重命名成你自己能认出的名字比如“gpio-led-我的版本”。复制而不是直接打开原工程是因为原工程是只读的参照物。你后面会反复修改、反复编译一旦改乱了还有一份干净的可以对照。3.2 导入、编译、下载三板斧的每一步打开 IDE点“文件”里的“导入工程”选中你刚复制出来的那个文件夹。导入成功后先点“编译工程”。编译这一步是把 C 代码翻译成芯片能执行的机器码成功后会生成一个下载文件通常在工程目录下的 Debug 文件夹里。这个文件就是你接下来要送进板子的东西。然后是硬件连接用 Type-C 线把开发板接到电脑。接着点“下载”里的“串口更新”在弹出的窗口里点“连接开发板”。连接成功时界面会显示串口号和版本号——这一步很关键它证明电脑真的找到板子了。最后点“选择文件”把刚才 Debug 目录里的下载文件选进去执行更新。整个流程里“连接成功”这个提示就是你的第一个里程碑。只要它出现后面的路基本是通的。3.3 改一行代码看现象GPIO 输出到底在控制什么灯亮了之后别急着做下一个实验。打开主程序文件找到控制灯的那几行改一个数字重新编译下载看现象有没有变。这一步是让你建立“代码和现象”的对应关系比看十页原理都管用。/* 让板载 LED 周期性亮灭先初始化引脚方向再循环写电平 */ #include gpio.h /* 构件头文件声明引脚编号和操作函数 */ #define LED_PIN GPIO_PIN_5 /* 灯接在哪个引脚按你的板子实际连接改 */ int main(void) { gpio_init(LED_PIN, GPIO_OUTPUT); /* 把引脚配成“输出”芯片才知道要往外送电平 */ while (1) { /* 嵌入式程序通常不会退出靠死循环一直跑 */ gpio_write(LED_PIN, 1); /* 输出高电平灯亮接法不同可能相反 */ delay_ms(500); /* 停 500 毫秒太快了人眼看不出闪 */ gpio_write(LED_PIN, 0); /* 输出低电平灯灭 */ delay_ms(500); } }几个参数值得说清楚。gpio_init的第二个参数是方向写输出还是写输入配错了灯不会亮因为芯片压根没打算往外送电平。gpio_write的第二个参数是电平高低取值 0 或 1。delay_ms的单位是毫秒把它从 500 改成 100灯会闪得更快改成 2000就是慢慢闪。你可以先只改这个数字验证自己改的代码确实生效了。还有一个容易被忽略的点高电平到底是亮还是灭取决于电路是共阳还是共阴接法。所以看到“写 1 反而灭”不要慌这不是你写错了把 1 和 0 对调就行。3.4 灯不亮时先查这四处按顺序排查别乱试。第一看 IDE 的编译输出有没有报错编译没过就没有新文件你下载的还是旧的。第二看下载时“连接开发板”有没有成功没成功就是线或驱动的问题。第三确认你选中的下载文件是不是刚编译出来的那个文件时间戳能看出来。第四确认代码里改的引脚编号和板子上灯的实际连接一致。这四步覆盖了绝大多数新手“灯不亮”的场景。原文里还提到一个很好的习惯先用厂家给的样例工程跑通再去做自己的修改。样例能跑通说明环境和硬件没问题剩下的问题一定出在你改的那几行里排查范围立刻缩小。4. 从串口到看门狗剩下五个实验逐个拆跑通第一个实验之后你已经有了一个可复用的操作流程导入、编译、连接、下载、看现象。后面五个实验的操作步骤基本是同一套变化的是“中间多打开了哪个构件”。所以这一章不再重复点击路径重点讲每个实验到底在练什么、新手该关注哪一点。4.1 串口通信与中断让板子第一次开口说话串口是嵌入式和外界对话最基础的方式。入门可以先记三根线一根发、一根收、一根共地。板子通过发线把数据送到电脑通过收线接收电脑发来的数据。电脑那边IDE 自带的串口工具就能充当对话窗口。中断则是这套对话的“门铃”。如果不用中断程序只能不停地问“有没有新数据来了”问一万次可能一次都没有CPU 全浪费在这上面。用了中断CPU 该干嘛干嘛数据一到硬件自动打断它跳去执行中断服务程序。原文的实验二就是让你以串行接收中断为例把这个流程走一遍。组帧是这一步的进阶点。一个字节好办但真实通信里一条完整消息往往是好几个字节怎么知道从哪开始、到哪结束这就是组帧要解决的问题。入门阶段先理解“多字节要拼起来看”别一上来就抠协议细节。4.2 改一个字节收到 7 回 4原文里有一个特别适合新手的练习让板子收到一个字节后减 3再发回去。你在串口工具里输入字符 7就会收到 4。这个改动很小但它把“接收—处理—发送”整条链路都串起来了。/* 串口中断服务程序里的核心逻辑收到一个字节减 3原路发回 */ void uart_rx_isr(void) { unsigned char ch uart_read_byte(); /* 从接收寄存器取走刚到的那个字节 */ ch ch - 3; /* 处理减 3。字符 7 减 3 就是 4 */ uart_send_byte(ch); /* 把结果发回电脑串口工具里就能看到 */ }这段代码里uart_read_byte取的是接收到的原始字节uart_send_byte负责发出去。注意这里处理的是字符的编码值不是数字本身所以输入 7 收到 4 是编码减 3 的结果。改完之后一定要重新编译、重新下载否则板子里跑的还是旧程序——这是新手最高频的翻车点没有之一。4.3 PWM用“开开关关”调出亮度PWM 听起来玄其实日常里到处都是。你可以把它想成快速开关一盏灯开的时间长、关的时间短人眼平均下来就觉得亮反过来就觉得暗。由于开关速度足够快人眼看不到闪烁只看到明暗变化。这个“开的时间占整个周期的比例”就是占空比。实验三的重点是定时器。PWM 的周期和占空比都靠定时器算出来所以原文把它排在中断实验之后因为两者共用同一套计时思路。动手时最值得做的一件事是改一个参数重新下载看现象怎么变。原文记录的做法就是“修改函数里的一个参数”再更新。你可以先改占空比观察亮度或波形变化再改周期感受频率的影响。改一个、看一次比一次改五个参数有效得多。4.4 Flash断电也不丢数据的小仓库程序里的变量断电就没了。Flash 不一样它是掉电也能保住的存储区相当于板子自带的一块小硬盘。实验四要练的就是往这块区域写数据、再读出来核对。这里有个关键概念必须提前知道Flash 写入之前通常要先擦除而且擦除是按块进行的不能想擦一个字节就擦一个字节。这就像黑板擦不掉的粉笔字——你得整块擦干净再重写。新手常见误区是直接写结果数据不对还以为是读函数写错了。实验操作的观察点很朴素写进去一组数据断电重新上电再读出来看还在不在。这个“断电验证”的动作千万别省它是区分 RAM 和 Flash 的唯一实证。4.5 SPI板子和外设的高速专线SPI 是一种板内通信总线用来让主控和外围器件高速对话。入门先记住四根线的分工一根时钟线负责打拍子一根主发从收一根从发主收还有一根片选线用来指定“现在跟谁说话”。因为有时钟线统一节奏SPI 的速率比串口高不少常见于显示屏、存储芯片、传感器这类需要搬大量数据的器件。实验五的重点是理解主从关系主设备发时钟、决定节奏从设备被动响应。片选信号是新手最容易忽略的一根线——一根总线上挂多个器件时片选拉错数据就会跑到别的器件那里去。如果你手上有原理图花两分钟确认片选接的是哪个引脚比事后排查半天强。4.6 独立看门狗给程序留一颗后悔药程序跑飞了怎么办看门狗就是答案。它本质是一个倒计时器程序必须在它数到零之前定期“喂”一下把它重新装满。只要程序正常运行喂狗动作就会一直发生一旦程序卡死在某处喂不了狗倒计时归零硬件自动把系统复位让程序从头再来。这个机制在无人值守的设备里几乎是标配。实验六要你做的是配置好倒计时长度然后在循环里按时喂狗。有意思的验证方式是故意让程序停住不喂看看系统是不是真的重启了。这个“故意翻车”的实验比顺利跑通更能让你记住看门狗的价值。倒计时长度也别设太短喂狗间隔要留出余量否则正常逻辑稍微慢一点就被误复位那才叫冤枉。5. 新手避坑五条血泪经验少走一周弯路这一章不给新知识只讲坑。下面五条都是零基础阶段最容易撞上的每条都按“看到什么现象、为什么会这样、怎么解决”来说。建议你实验卡住的时候回来对一遍大概率能对上号。5.1 现象代码改了板子还是老样子原因最常见的两种情况一是编译没成功输出窗口里有错误但你没注意于是 Debug 目录里还是上一次的文件二是编译成功了但你下载时选的文件路径不对或者干脆忘了重新下载。解决养成固定顺序——先看编译输出有没有红色错误再看下载文件的时间戳是不是刚刚最后才怀疑代码逻辑。这个顺序能挡掉八成的无效排查。我自己的习惯是每次编译完瞄一眼输出末尾有没有“成功”字样看一眼只要两秒钟。5.2 现象下载时连不上开发板提示找不到设备原因按概率排第一是数据线只能充电不能传数据第二是串口被别的软件占用了比如你开着另一个串口工具没关第三是驱动没装好或端口号变了第四是板子没上电或没复位。解决先换一根确定能传数据的线这一条解决过太多问题。然后关掉所有可能占用串口的软件重新插拔一次看设备列表里端口号有没有变化。如果换线换口都不行再去看驱动。别一上来就重装 IDE那是最后手段。5.3 现象串口工具里收到的是一堆乱码原因几乎都是波特率对不上。发送方和接收方必须用同一个速率差一点就是乱码。次要原因是数据位、停止位、校验位的配置不一致。解决把串口工具里的参数和程序里配置的参数逐项对一遍重点看波特率。改完参数记得重新连接一次有些工具不会自动生效。乱码这个现象很有辨识度看到它基本可以直接锁定通信参数不用去查业务代码。5.4 现象改了参数现象没变化或者变化和预期相反原因一是参数改在了没被调用的函数里改了个寂寞二是改完没重新下载三是硬件接法与假设相反比如共阳接法下写 1 是灭不是亮。解决先确认改动的那行代码确实在执行的路径上可以在里面加一句打印输出看它有没有被跑到。再确认下载流程走完整。最后接受一个事实硬件世界里“高电平等于亮”不是定律接法说了算现象和预期反了就大胆把 0 和 1 对调试试。5.5 现象一开看门狗系统就反复重启原因倒计时设得太短或者喂狗语句被放在了某个耗时较长的操作之后正常流程都来不及喂。也可能是喂狗代码写在了一个根本不会执行到的分支里。解决先把倒计时调长确认系统能稳定运行再逐步缩短到合理值。喂狗位置要放在主循环里稳定能到达的地方别塞进条件分支。排查时可以用一个指示灯辅助喂一次狗翻转一次灯灯不闪了就说明喂狗路径断了比盯着串口输出直观。注意上面五条里第 1 条和第 4 条占了新手卡壳时间的一大半。遇到问题先怀疑流程再怀疑代码最后才怀疑硬件坏了。6. 下一步学什么从“照做”到“自己改一个小项目”六个验证性实验做完你算是把嵌入式开发的主干道走了一遍环境、GPIO、中断、串口、定时器、存储、总线、系统保护。接下来最忌讳的是立刻去找更难的教程看看完还是不会。更有效的路径是拿这六个实验当素材自己拼一个小项目出来。推荐的顺序是这样。第一步把实验一和实验二拼起来按键按下时通过串口往电脑发一句提示。这一步练的是“输入触发输出”也是所有交互设备的雏形。第二步把 PWM 接进来按键每按一次灯的亮度提高一档同时串口打印当前档位。到这里你已经有了输入、处理、输出、显示四要素。第三步把 Flash 用上把亮度档位存进 Flash下次上电自动恢复。第四步加上看门狗让这个设备能自己从卡死中恢复。四步做完你手上就是一个能说清楚、能演示、能写进简历的小东西比六个孤立的实验有说服力得多。阶段用到的实验验收标准拼输入输出实验一 实验二按键能让串口输出变化加状态控制再加实验三亮度分档串口能报档位加掉电保存再加实验四重新上电档位还在加系统保护再加实验六人为卡死后能自动恢复学习资源上别再漫无目的地刷视频。更实在的做法是回到示例工程包挑一个你没跑过的样例先猜它会有什么现象再跑一遍验证。猜对了说明你真懂了猜错了正好是你该补的地方。这个“先猜后验”的习惯比看十篇讲解都长本事。我第一次带人做这类实验时吃过一个亏当时觉得编译下载这种操作太简单没让人形成固定顺序结果对方每次卡住都从代码第一行开始怀疑折腾一晚上。从那以后我每次带新人都强制要求先把“编译有没有过、下载文件是不是新的、连接有没有成功”这三句念一遍再动代码卡壳时间立刻少了一大半。希望帮到你别急着往深里钻先把这六个实验完整跑通一遍手上有了真实的成功体验后面的路自然就好走了。这份实验合集包含六个验证性实验的完整过程记录从环境搭建到每个实验的操作步骤和现象观察都有适合放在手边做一步对一步。本文还有配套的精品资源点击获取