硬件模块
作者: MayGe
前言
整洁规范的前端需要显卡渲染以及显示器显示,复杂的后端也离不开 CPU 的支持。软件的一切永远建立在硬件的基础上。作为一名计算机科学与技术专业的学生,很有必要了解一些硬件的知识,将来不论是做软件还是做硬件,都有极大的益处。
计算机硬件的范围极大,包括了数字电路设计、模拟电路设计、计算机组成、嵌入式、硬件接口设计等诸多领域。在计科专业,实践是至关重要的,仅仅依靠理论学习是远远不够的。编写代码、打印 PCB、以及后续的焊接安装,往往需要强大的动手能力和团队协作能力。
因此在本课程中,我们更多的以嵌入式系统为切入点,引入常用的外设[1]进行学习研究,以项目为导向。嵌入式系统无处不在,从我们日常使用的智能手机到汽车电子系统,从家用电器到工业控制设备,它们都在默默地运行着嵌入式程序。通过学习嵌入式,我们既能接触到硬件设计,又能进行软件编程,在有限的资源约束下解决实际问题,同时通过 LED、蜂鸣器等外设能够直观地看到程序运行的效果。
学习目标
笔者认为,未来的时代是 AI 的时代。但是最初的学习,绝不可以让 AI 介入,最起码要一句一句把教程里面的代码敲下来。我们的学习会从最基础的数字电路概念开始,逐步掌握 51 单片机的基础编程,理解嵌入式系统的工作原理,然后进阶到各种外设的使用、中断处理和定时器应用,最后完成一些有实际意义的小项目。
教学注重嵌入式[2]方向,使用 STC89C52[3] 芯片,便宜、好用又简单。刚开始学的时候,笔者烧了 5 块。所以一开始非常不建议直接上 ESP32[4] 和 STM32[5] 这种系列,难度是 51 的好几倍,价格也是。选择从 51 单片机开始有很多好处:芯片便宜,烧坏了不心疼,8 位架构结构简单容易理解,中文教程丰富社区支持好,Keil C51 开发环境配置也相对简单。
AI 编程
AI 是时代特产。比起一味枯燥的理论研究,使用 AI 快速开发也是重要的能力之一。当然在使用 AI 之前,你需要涉猎大部分的理论知识,AI 大部分时候只会给出你认知之内的见解。它大部分时候只会根据你给定的设计思路来设计程序。
举一个简单的例子,假如你要设计一个按键点亮 LED,AI 可能给你的代码是这样的:
void P1_pressed(){
led_toggle();
}
void main(){
while(1){
if (P1 == 1){
p1_pressed();
}
}
}
2
3
4
5
6
7
8
9
10
11
但是实际在写入板子之后,你按下开关,这个 LED 灯一定会多次开关。代码本身没有问题,这是由按键的物理性质导致的。当开关按下后,会产生振动,导致多次接通。振动的频率远低于外设的时钟,所以这些振动全部会被捕捉,产生信号。只有知道这些性质,你才能在关键时刻提醒 AI,来帮你做得更好。
void p1_pressed(){
led_toggle();
}
void main(){
while(1){
if (P1 == 1){
delay_ms(20); // 20ms 等待振动结束
while(P1 == 1); // 等待松手
delay_ms(20); // 20ms 等待振动结束
p1_pressed(); // 触发函数
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
设计硬件烧录程序往往需要考虑更多东西。编写计算机软件的时候,我们很少细化地考虑资源调度问题,你最多考虑内存、显存是否够用,然后操作系统会把资源喂到你的嘴边。但是在嵌入式设备中,我们几乎不可能安装操作系统,最大的问题是成本,加入系统意味着更大的内存,多 1M 内存,成本可能要高一块钱。于是我们需要精心使用我们手上所有的外设、内存资源,大部分时候需要妥协。
在这种高度定制化的情况下,使用 AI 开发也需要一定的技术门槛。就拿嵌入式设备的中断模块来说吧,众所周知,计算机的实时性由中断来保证,操作系统负责调度和确定中断优先级,所以计算机可以并发上万个程序。但是请看我们的按键代码,你会惊奇地发现,在这段逻辑中,我们按下开关不松手,那么整个设备都会进入死循环中。倘若你想用 AI 帮你解决这个问题,它会给出这样的代码帮你解决:
// 每 100ms 触发一次,避开抖动
void keymap_scan() interrupt 1 // 这里调用了定时器 1
{
static uint8_t p1_previous = 0x00;
if (p1_previous == 0x01 && P1 == 0){
key_num = 0x01;
}
if (P1 == 1){
p1_previous = 0x01;
}
}
uint8_t key_num = 0x00;
void p1_pressed(){...}
void main(){
init(); // 初始化中断,定时器 1 每 100ms 中断一次
while(1){
if(key_num == 0x01){
key_num = 0x00;
p1_pressed();
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
它帮你解决了问题,可是它调用了整个定时器帮你完成。定时器是一种非常宝贵的资源,这块 51 单片机中只有 3 个定时器可以使用。也许在项目中,数码显示器、蜂鸣器、温度传感器(模拟信号)以及电动机都需要使用。那么假如你完全不懂中断的原理和使用方法,完全靠 AI 绝对会导致你的项目崩溃。
使用 AI 作为我们的好帮手之前,强烈建议你先学习一定的基础知识,面对 AI 的犯错和不当的资源分配,也能更加从容应对。注意,你不可能创造出你认知之外的事物,现阶段的 AI 同样如此。
AI + 硬件
AI + 硬件无疑是一个非常好的发展方向,笔者在此有所涉猎。虽然目前市场上大部分是以玩具的形式出现的,就比如说小智系列。在这块做得最好的就是乐鑫的 ESP 系列,我一般使用 ESP32-S3-N16R8 来实验,这块板子的优点就是它拥有 16M 的 Flash 以及 8M 的 SRAM 作为内存,这些空间足以搭建文件系统保存图片来进行人脸识别和声纹识别。
语音识别的话 ESP32 性能完全不足,所以我部署语音合成服务让设备通过局域网连接到我的服务器进行合成。同时我还本地部署了 DeepSeek-R1 模型用于生成文本,最后安装了 Home Assistant OS 用于接入智能家居。就这样,搭配半导体制冷片和继电器以及风扇,我做了一台智能冰箱,由语音控制,我可以语音唤醒、设定温度以及定时开启。
目前市场上大部分 AI 支持的产品都采用 ESP32 这种国产芯片,价格便宜、社区广大,相比于 STM32 系列和 8051 系列来说,使用 AI 编程会流畅很多。不过对于大家来说,还是可以先学习 8051 系列加深对嵌入式和硬件的理解。即使 AI 的支持再好,面对大项目时,必须人工排查。
说实话,目前的大部分 AI + 硬件的产品大多只是在后端部署服务,前端(也就是嵌入式硬件部分)只负责和人类的沟通,大多也只是提供情绪价值,真正落地的非常少。不过按照发展的规律来看,目前尚处在发展的前期阶段,大量的研究也在如火如荼地展开。最具热度的是战争催生的大型无人机应用,这催生了一大批无人机相关的研究。还有就是 AI + 医疗系列,解决快速诊断病情,不过这个目前还在研究的早期,AI 的发展离不开大量的数据训练,训练好办,但是数据呢?这又需要传感器的迭代升级。
就这么多了,希望大家在闲暇时光接触一下硬件,享受一下独自 DIY 的快乐。硬件开发不仅能让你更深入地理解计算机系统,更能在这个 AI 时代为你提供独特的竞争优势。记住,在这个快速变化的时代,掌握硬件知识的软件工程师,和懂软件开发的硬件工程师,都将是最稀缺的人才。
外设(外部设备)是电子计算机中能够通电并可以不依赖计算机进行正常的独立或半独立运行的硬件。外部设备通常被用来扩展计算机系统的功能,包括输入输出设备(如显示器、键盘)、网络设备(如 USB 网卡、调制解调器等)和外置存储设备(如移动硬盘、USB 集线器等设备),以及 UPS(不间断电源)、独立显卡和声卡等辅助硬件。 ↩︎
嵌入式系统(Embedded System)是一种专用的计算机系统,作为完整设备的一部分而存在。与通用计算机系统不同,嵌入式系统通常执行预先定义的任务,具有实时计算约束。它由硬件和软件组成,软件通常只包括功能所需的特性,被设计为执行特定任务。嵌入式系统广泛应用于消费电子、汽车、医疗设备、工业控制、物联网等领域,其特点是体积小、功耗低、成本低、可靠性高。 ↩︎
STC89C52 是基于 8051 内核的 8 位单片机,具有 8KB Flash 程序存储器和 512 字节 RAM,是学习嵌入式开发的经典入门芯片。其结构简单、资源丰富、开发工具完善,非常适合初学者掌握单片机的基本概念和编程方法。 ↩︎
ESP32 是乐鑫科技推出的系统级芯片,集成了 Wi-Fi 和蓝牙功能,采用双核处理器,具有丰富的外设接口。相比 51 单片机,ESP32 功能更强大但学习曲线更陡峭,适合有一定基础后进阶学习。 ↩︎
STM32 是 STMicroelectronics 公司基于 ARM Cortex-M 内核的 32 位微控制器系列,性能强劲、外设丰富,广泛应用于工业控制、物联网等领域。对于初学者来说,其复杂的架构和配置需要较高的学习门槛。 ↩︎