本教程开发平台 ubuntu2.4 寸 TFT 显示屏选型说明本次项目选用2.4 英寸 8 线 SPI 接口 TFT 彩色显示屏核心参数与选型优势如下1.驱动芯片ILI9341兼容性强STM32 标准库与 HAL 库均有成熟驱动代码分辨率 240×320显示色彩丰富满足时钟界面的时间、日期等信息展示需求。2.硬件配置新款带片选 CS 引脚8 线 SPI 通信包含 SDA、SCL、CS、RES、DC、BLK 等关键引脚通过 CS 引脚可精准控制数据传输避免无 CS 引脚导致的屏幕乱码、刷新异常问题稳定性优于简化版接口。3.易用性出厂已预焊接排针8 线引脚全部引出到手后可直接通过杜邦线与 STM32F103C8T6 最小系统板对应引脚连接无需额外焊接降低新手接线难度。4.接口优势8 线 SPI 相比 4 线 SPI 保留了完整控制信号通信更稳定同时仅占用 STM32 的 SPI 接口及少量 GPIO 引脚为后续拓展按键、蜂鸣器等功能预留空间。该显示屏的 8 线 SPI 接口设计既保证了通信稳定性又兼顾了制作便捷性非常适合作为自制时钟的显示模块。DS3231 高精度实时时钟模块DS3231 实时时钟模块作为时间核心核心参数与选型优势如下1.高精度计时内置温补晶振温度漂移低至 ±2ppm年误差小于 1 分钟远高于普通 DS1302 模块确保时钟走时准确。2.通信协议采用 I2C 总线通信仅需 SDA、SCL 两根信号线与 STM32F103C8T6 连接节省 IO 资源代码实现简单。3.断电续航板载 CR2032 纽扣电池座断电后可依靠电池继续计时重新上电后时间无需重新校准提升使用体验。4.功能拓展预留 SQW 方波输出引脚可配置为 1Hz/1kHz 等频率方便后续拓展闹钟、秒脉冲指示等功能。5.稳定性设计模块自带电源稳压电路支持 3.3V-5V 宽电压输入与 STM32 的 3.3V 逻辑电平完美兼容接线简单且不易损坏。作为时钟项目的 “时间心脏”DS3231 的高精度和低功耗特性能为整个系统提供可靠的时间基准。主控芯片STM32F103C8T6STM32F103C8T6 Type‑C 升级版最小系统核心板64KB Flash、20KB SRAM杜邦线接线清单显示屏接线7 根母对母杜邦线、1 根母对公杜邦线时钟模块接线3 根母对母杜邦线、1 根母对公杜邦线供电并联接线1 母转 2 母杜邦线 1 根将时钟模块与显示屏的供电端并联至单片机 3.3V 引脚实现双模块同电压稳定供电。ST - LINK V2 下载器ST-LINK 下载器针脚 对应 开发板对应针脚3.3V 3.3VGND GNDSWCLK SWCLKSWDIO SWIOplatformio.ini[env:bluepill_f103c8]platform ststm32board bluepill_f103c8framework arduinoupload_protocol stlinkdebug_tool stlinkupload_port autolib_deps bodmer/TFT_eSPIadafruit/RTClibadafruit/Adafruit Unified Sensorbuild_flags -D USER_SETUP_LOADED1-D ILI9341_DRIVER1-D TFT_MOSIPA7-D TFT_SCLKPA5-D TFT_CSPA4-D TFT_DCPA2-D TFT_RSTPA3-D TFT_WIDTH240-D TFT_HEIGHT320-D SPI_FREQUENCY4000000-D LOAD_GLCD1-D USE_FONT_11main.cpp// 引入Arduino核心基础库#include Arduino.h// 引入TFT屏幕驱动库#include TFT_eSPI.h// 引入I2C通信库用于和DS3231时钟模块通讯#include Wire.h// 引入RTC时钟功能库驱动DS3231实时时钟#include RTClib.h// 实例化TFT屏幕对象TFT_eSPI tft;// 实例化DS3231时钟模块对象RTC_DS3231 rtc;// 记录上一次显示的小时用于判断是否需要刷新int last_hour -1;// 记录上一次显示的分钟用于判断是否需要刷新int last_min -1;// 记录上一次显示的秒数用于判断是否需要刷新int last_sec -1;// 初始化函数上电只执行一次void setup() {delay(500); // 延时500ms等待硬件上电稳定tft.init(); // 初始化TFT显示屏tft.setRotation(1); // 设置屏幕为横屏模式tft.fillScreen(TFT_BLACK); // 全屏填充黑色完成清屏tft.setTextSize(5); // 设置屏幕字体大小为5号Wire.begin(); // 启动I2C总线通信rtc.begin(); // 初始化DS3231时钟模块// 校准开关取消//上传同步电脑时间日常使用务必带//防止上电重置时间// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));DateTime now rtc.now(); // 读取DS3231芯片持续运行的时间tft.fillRect(10, 70, 240, 70, TFT_BLACK); // 清空显示区域// 显示小时tft.setTextColor(TFT_YELLOW, TFT_BLACK);tft.setCursor(20, 80);tft.printf(%02d, now.hour());// 第一个冒号tft.setTextColor(TFT_GREEN, TFT_BLACK);tft.setCursor(100, 80);tft.print(:);// 显示分钟tft.setTextColor(TFT_YELLOW, TFT_BLACK);tft.setCursor(130, 80);tft.printf(%02d, now.minute());// 第二个冒号tft.setTextColor(TFT_GREEN, TFT_BLACK);tft.setCursor(200, 80);tft.print(:);// 显示秒tft.setTextColor(TFT_YELLOW, TFT_BLACK);tft.setCursor(230, 80);tft.printf(%02d, now.second());last_hour now.hour();last_min now.minute();last_sec now.second();}// 主循环持续刷新时间void loop() {DateTime now rtc.now();// 单独刷新小时if (now.hour() ! last_hour) {tft.fillRect(20, 80, 65, 60, TFT_BLACK);tft.setTextColor(TFT_YELLOW, TFT_BLACK);tft.setCursor(20, 80);tft.printf(%02d, now.hour());last_hour now.hour();}// 单独刷新分钟if (now.minute() ! last_min) {tft.fillRect(130, 80, 65, 60, TFT_BLACK);tft.setTextColor(TFT_YELLOW, TFT_BLACK);tft.setCursor(130, 80);tft.printf(%02d, now.minute());last_min now.minute();}// 单独刷新秒if (now.second() ! last_sec) {tft.fillRect(230, 80, 65, 60, TFT_BLACK);tft.setTextColor(TFT_YELLOW, TFT_BLACK);tft.setCursor(230, 80);tft.printf(%02d, now.second());last_sec now.second();}// 固定显示两个分隔冒号防止刷新消失tft.setTextColor(TFT_GREEN, TFT_BLACK);tft.setCursor(100, 80);tft.print(:);tft.setCursor(200, 80);tft.print(:);delay(100);}本文部分文字由ai辅助优化