PostgreSQL生态下国产数据库的演进路径与选型评估
2026/7/4 18:40:40
配图:选题阶段最容易踩的坑,90% 的同学在第一步就输了
毕设开题前,大家习惯在购物平台搜索“单片机 模块”,于是出现以下名场面:
这些“拍脑袋”式选题的共同结局是:4 月底还在调 I²C 死锁,5 月答辩 PPT 只能放效果图。
| 维度 | 51 单片机 | STM32F1 | ESP32 |
|---|---|---|---|
| 主频 | 12 MHz | 72 MHz | 240 MHz |
| Flash | 8–64 kB | 64–512 kB | 4 MB |
| 低功耗 | 无睡眠分级 | Stop 模式 20 µA | Deep-sleep 10 µA |
| 外设 | 定时器+UART | 3×ADC、2×I²C、USB-FS | Wi-Fi+蓝牙 |
| 成本 | 3 元 | 8 元 | 20 元 |
| 推荐场景 | 单点 LED、按键 | 传感器+段码屏 | 需连云、需 OTA |
传感器与通信方式同理,先列“场景-指标-成本”三维表,再打分,能瞬间排除 70% 的“伪需求”。
typedef enum { ST_SLEEP, ST_SAMPLE, ST_PUMP, ST_BLE_TX, ST_LOWBAT } state_t; static volatile state_t current ST_SLEEP; int main(void) { HAL_Init(); SystemClock_Config(); Periph_Init(); for (;;) { switch (current) { case ST_SLEEP: HAL_PWR_EnterSTOPMode(PWR_REGULATOR_LOWPOWER, PWR_STOPENTRY_WFI); /* RTC 唤醒后 -> ST_SAMPLE */ break; case ST_SAMPLE: if (sht31_read(&t, &h) != HAL_OK) { Error_Handler(); } if (h < 40) { current = ST_PUMP; } else { current = ST_BLE_TX;} break; case ST_PUMP: pump_on(); delay_ms(5000); pump_off(); current = ST_BLE_TX; break; /* 其余状态同理 */ } } }以下模块只依赖 HAL 与 cmsis,方便移植。所有驱动与业务逻辑彻底解耦。
/* sht31.h */ typedef struct { float temp; float humi; } sht31_data_t; bool sht31_init(I2C_HandleTypeDef *hi2c); bool sht31_read(sht31_data_t *out); /* pump.h */ void pump_init(void); void pump_on (void); void pump_off(void); /* app_fsm.c */ #include "sht31.h" #include "pump.h" static void enter_pump_if_dry(const sht31_data_t *d) { if (d->humi < 40.0f) { pump_on(); delay_ms(5000); pump_off(); } }通过“接口+私有实现”方式,即使 3 年后换 MCU,也只需改驱动层,业务层无需动。
ADC 采样稳定性
独立看门狗 IWDG
软件陷阱
电源与 ESD
PCB 布局
调试技巧
演示脚本
当 GitHub 出现 50 个 star、淘宝店铺开始卖你的扩展板,毕设就不再是“作业”,而是可复用的 IP。思考三个问题:
menuconfig勾选?把答案写进 README,下一次面试官问“你做过最复杂的项目”时,你只需递上二维码,让代码自己说话。