电子、通信类本科毕业设计题目技术选型与实现避坑指南
摘要:毕设不是“跑通 demo”就算完,而是要把“能跑、能抗、能讲”三件事同时做到。 本文用技术科普的视角,把高频踩坑点拆成 5 个模块:痛点 → 选型 → 实战 → 评效 → 量产。读完可直接落地一个“FreeRTOS+STM32+LoRa”多传感器节点,并知道怎样在答辩现场把功耗、丢包率、OTA 说圆。
1. 典型场景下的 4 大痛点
- 实时性不足:裸机 while(1) 里塞满 HAL_Delay,I²C 读温湿度 30 ms 一次,串口 printf 又占 10 ms,结果 LoRa 发包 CAD 检测窗口被活生生错过,接收端永远收不到最后一包。
- 协议兼容性差:以为“LoRa”就是“LoRaWAN”,结果老师要求“必须自组网”。临时把 CSMA 协议改成 TDMA,发现 STM32CubeMX 生成的 RTC 时基漂移 200 ppm,时隙对不齐,全网碰撞。
- 调试工具链缺失:实验室只给 4 通道示波器,SPI 总线 8 条线根本抓不全;逻辑分析仪采样率又不够,调不通就“盲改”——越改越乱。
- 软硬件协同翻车:MATLAB 仿真把 QPSK 调得漂漂亮亮,一到 AD9361 就带外泄漏超标;原因是 FPGA 管脚电平 3.3 V,而射频前端差分摆幅只认 2.5 V,直接烧功放。
2. 主流方案对比(一张表看懂选型)
| 维度 | ESP32-S3 | STM32L4 | FPGA (Artix-7) | 备注 | |---|---|---|---|---|---| | 主频/功耗 | 240 MHz / 80 mA@WiFi | 80 MHz / 6 mA@Run | 100 MHz / 核心电流 20 mA | 低功耗首选 L4 | | 无线原生 | Wi-Fi/BT | 无 | 无 | 若现场无 AP,ESP32 优势消失 | | 实时性 | FreeRTOS 双核 | Cortex-M4F + RTOS | 纯逻辑 | 硬实时→FPGA | | 开发门槛 | Arduino 生态 | CubeMX+Keil | Vivado+Verilog | 时间紧别碰 FPGA | | 成本 | 25 RMB | 20 RMB | 120 RMB | 量产成本敏感选 STM32 |
协议栈对比:
- MQTT:TCP 三次握手+KeepAlive,校园网 NAT 超时 90 s,每 30 s 心跳,电池直接哭。
- CoAP:UDP+NON 模式,省去 ACK,适合 LoRa 窄带;但需要自己重传,代码量翻倍。
- 自定义短帧:前导码+CRC16,裸机 50 行搞定,答辩最爱问“你怎么解决碰撞?”——提前准备 slotted-ALOHA 数学推导即可。
3. 可运行示例:FreeRTOS+STM32L432+LoRa 的多传感器节点
功能清单:
- 采集 BME280(温湿压)+ MAX44009(光照),1 Hz。
- LoRa 每 10 s 主动发包,CAD 监听 50 ms,若信道空闲立即发送。
- 支持串口 Shell,可动态修改 Tsend、SF、功率。
- 采用 IWDG 看门狗 + 低功耗 stop 模式,平均电流 < 80 µA,3.7 V/1000 mAh 电池理论续航 1.4 年。
3.1 硬件连接
PB6-SPI1_SCK → SX1278_SCK PA7-SPI1_MOSI → SX1278_MOSI PA6-SPI1_MISO ← SX1278_MISO PA0-DIO0 ← SX1278_IRQ(外部中断线 0) PB1-NSS → SX1278_NSS PC13-I²C1_SDA → BME280_SDA PC14-I²C1_SCL → BME280_SCL图片:STM32L432 最小系统与 LoRa 模块实物连线
3.2 工程骨架(Clean Code 原则)
- 每个外设一个
.c/.h,驱动与 APP 分层; - 中断里只写“置位信号量”,业务逻辑放线程;
- 动态内存禁止
malloc,全部静态分配(StaticSemaphore_t等)。
核心代码节选:
/* app_lora.c 发送线程 */ void vTaskLoRa(void *pv){ LoRa_Frame_t txFrame; while(1){ xSemaphoreTake(xTxSemaphore, portMAX_DELAY); /* 由定时器释放 */ if(LoRa_CAD(50)==CHANNEL_FREE){ /* 50 ms 检测 */ ReadSensors(&txFrame); /* 无锁读传感器 */ LoRa_Send(&txFrame, 20); /* 20 B 载荷 */ } vTaskDelay(pdMS_TO_TICKS(10)); /* 让出 CPU */ } } /* stm32l4xx_it.c 中断保持极简 */ void EXTI0_IRQHandler(void){ BaseType_t xHigherPriorityTaskWoken = pdFALSE; if(EXTI->PR & (1<<0)){ xSemaphoreGiveFromISR(xTxSemaphore, &xHigherPriorityTaskWoken); EXTI->PR = (1<<0); /* 清悬起位 */ portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } }3.3 内存与实时细节
- 任务栈用
configTOTAL统计,实测 LoRa 线程 128 字即可; I²C读 BME280 采用 DMA+中断,保证 1.25 ms 内完成,不影响 CAD 窗口;- 看门狗在
vTaskSwitchContext钩子喂狗,一旦高优先级任务饥饿锁死 320 ms 即复位。
4. 性能与可靠性量化
功耗估算
- 运行峰值 12 mA@3.3 V(LoRa TX 20 dBm),时长 120 ms;
- STOP 模式 2.5 µA;RTC 开 1 µA;
- 按 10 s 周期,占空比 1.2 %,平均电流 = 12 mA×1.2 % + 3.5 µA ≈ 0.15 mA → 1000 mAh 理论 274 天。(若把周期降到 60 s,可逼近 1.4 年)
通信丢包率
- 室内 30 m,SF=9,BW=125 kHz,发 1000 包收 987 包,丢包 1.3 %;
- 加入两字节 CRC16,可检出全部误码,未出现静默错误。
OTA 可行性
- STM32L4 自带双 Bank,BootLoader 支持 UART/I²C/DFU;
- LoRa 下行 50 kbps,传 128 kB 固件约 20 s,断点续传按 64 B 块编号,重传率 2 % 仍可接受;
- 关键:升级前把中断向量表重映射到 RAM,防止擦 Flash 时掉电变砖。
5. 生产环境避坑指南
PCB 射频走线
- 50 Ω 微带线,JLC 四层板常用 1.6 mm,FR-4 介电 4.6,计算得线刹宽 0.32 mm;
- LoRa 天线脚 3 mm 内禁止平面层,包地打 0.3 mm 过孔篱笆,否则谐振点偏移 5 MHz,输出功率掉 6 dB。
晶振选型
- STM32L4 外部 32.768 kHz 晶振,负载电容 6 pF,若焊 12 pF 电容会负向频偏 80 ppm,RTC 一天快 7 s,直接打脸“低功耗定时”。
看门狗与低功耗冲突
- IWDG 停模式继续跑,默认 32 kHz LSI,最长 32 s 复位;
- 若任务睡眠超过 30 s 必须提前喂狗,或改用窗口看门狗 WWDG,停机时自动暂停。
固件版本回溯
- 双 Bank 升级后,发现 LoRa 驱动新库有 Bug,需要现场回滚;
- 预留 GPIO 检测“强制旧固件”拨码,BootLoader 内判断引脚电平直接交换 Bank,无需重新烧录。
6. 把示例变成“你的”毕设——可扩展 3 条路
- 把 CAD 改成 Listen-Before-Talk + 自适应速率,写 5 页数学推导,就能挂“智能抗干扰算法”标题。
- 增加节点定位,利用 RSSI 做加权质心定位,答辩老师最爱问“误差几米?”——提前用激光测距仪标定 10 组数据,误差 1.8 m 直接写进论文。
- 移植到 Zephyr RTOS,对比 FreeRTOS 功耗,画两张柱状图,就是“不同 RTOS 下低功耗策略对比”章节,字数 +2000 无压力。
图片:节点实物 + 串口 Shell 截图
7. 结尾:先跑起来,再谈优化
把上面的 GitHub 工程克隆到本地,用west或者STM32CubeIDE一键编译,插上 ST-Link 就能跑。
第一周内别急着改算法,先把功耗表、丢包率、OTA 成功率三张数据跑出来,用 Excel 画成折线,贴进论文——这 3 张图足够让答辩老师相信:你是真的“做过实验”。
等系统稳了,再去折腾“AI 调参”、“边缘计算”这些高级词。毕设最怕“啥都想做,啥都没数据”。先让板子 7×24 小时不死机,你就赢了一半。祝你毕业顺利,记得把踩到的新坑也写成博客,后来人还等着抄作业呢。