news 2026/8/19 1:04:42

基于STM32与TFT屏的智能焊台开发:从PID控制到GUI设计全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于STM32与TFT屏的智能焊台开发:从PID控制到GUI设计全解析

1. 项目概述:一个焊台,为何需要STM32和TFT屏?

做硬件开发、维修或者电子DIY的朋友,对焊台肯定不陌生。一个普通的调温烙铁,核心就是一个可控硅调压电路加上一个热电偶测温,几十块钱就能搞定。但当你需要更精细的焊接,比如维修手机主板上的BGA芯片,或者给0402封装的电阻电容拖焊时,一个功能单一、响应迟钝的焊台就显得力不从心了。这时候,一个带智能控制、实时曲线显示、多参数可调的焊台就成了刚需。

这个“STM32 Soldering and Rework Station with TFT Display”项目,本质上就是打造一个这样的“智能焊台”。它不再是一个简单的加热工具,而是一个集成了精密温度控制、人机交互和多功能扩展的嵌入式系统。STM32作为主控,负责执行核心的PID温度控制算法、处理来自旋转编码器和按键的输入、驱动TFT显示屏进行丰富的图形化显示,并管理烙铁头、热风枪等外设的协同工作。那块TFT彩屏,则是整个系统的“眼睛”和“交互窗口”,它能实时显示温度曲线、设定参数、工作状态,甚至菜单导航,让操作从“盲操”变成“可视化管理”。

我之所以选择这个项目进行深度实践,是因为它几乎涵盖了中小型嵌入式产品开发的全部核心要素:MCU选型、外设驱动(SPI、定时器、ADC)、控制算法、GUI设计以及硬件电路设计。从一块空白的PCB到最终能稳定控温、流畅显示的成品,每一步都充满了挑战和学习的乐趣。接下来,我将从设计思路到代码实现,完整拆解这个项目,分享其中踩过的坑和积累的经验。

2. 核心硬件选型与电路设计思路

一个稳定可靠的焊台,硬件是基石。硬件设计不仅要满足功能需求,更要考虑抗干扰、热设计和长期可靠性。

2.1 MCU选型:为什么是STM32?

在众多单片机中,STM32系列几乎是这类项目的首选。原因有几个:首先,其Cortex-M内核性能足够,主频从几十MHz到几百MHz,能轻松应对PID运算和GUI刷新;其次,外设资源丰富,特别是多路高精度ADC、高级定时器(用于PWM生成)和灵活的SPI/I2C接口,完美契合项目需求;最后,庞大的社区和丰富的库支持(如HAL库、LL库、标准库),能极大降低开发门槛。

对于这个焊台项目,我选择了STM32F103C8T6(俗称“蓝桥杯”或“最小系统板”芯片)。它的性价比极高:72MHz主频的Cortex-M3内核,64KB Flash,20KB RAM,2个12位ADC,3个通用定时器,2个SPI接口。这些资源对于驱动一个ILI9341 TFT屏、读取旋转编码器、运行PID算法、输出PWM控制MOS管来说,绰绰有余。如果你的项目需要更复杂的GUI或更多通道,可以考虑F4系列(如STM32F407),其自带硬件浮点单元和更大的RAM,会让界面更流畅。

注意:STM32F103系列有多个型号,C8T6是TSSOP20封装,引脚较少。如果你的外设很多(比如多个编码器、多个传感器),可能需要选择引脚更多的型号,如STM32F103RCT6(LQFP64封装)。

2.2 显示模块:ILI9341 TFT屏与SPI驱动优化

显示部分我选择了2.8英寸的ILI9341驱动IC的TFT液晶屏,分辨率240x320。选择它是因为其驱动成熟、价格便宜,且支持SPI接口,可以节省宝贵的IO口。

SPI接口选择与配置: STM32通常有多个SPI外设(SPI1, SPI2)。我将SPI1用于驱动TFT屏,原因如下:

  1. 速度优先:SPI1通常挂载在APB2高速总线下,在72MHz系统时钟下,理论上可以达到18MHz或36MHz的通信速率(取决于分频),这能极大提升刷屏速度。
  2. 引脚复用:SPI1的SCK和MISO/MOSI引脚可能与其他功能(如JTAG)复用。需要特别注意,在初始化SPI前,要禁用JTAG功能,释放PA15、PB3、PB4等引脚。这可以通过配置AFIO_MAPR寄存器来实现。
// 禁用JTAG,启用SWD(仅需SWD下载调试) __HAL_AFIO_REMAP_SWJ_NOJTAG();
  1. 硬件片选 vs 软件片选:ILI9341除了SPI的CS引脚,还有一个复位引脚(RESET)和命令/数据选择引脚(DC)。为了最大化SPI效率,我使用硬件SPI,但CS和DC引脚用普通GPIO进行软件控制。这样可以在连续写入显存数据时,只控制DC引脚,而CS保持低电平,实现高速连续传输。

驱动优化技巧: 直接使用HAL库的HAL_SPI_Transmit函数刷屏会很慢,因为其包含大量检查和外设状态管理。为了极致优化,我采用了以下方法:

  1. 使用寄存器直接操作:在确认SPI处于就绪状态后,直接向SPI数据寄存器(SPI1->DR)写入数据。这需要仔细阅读参考手册,处理好发送缓冲区空(TXE)和接收缓冲区非空(RXNE)标志。
void SPI1_WriteByte(uint8_t data) { while(!(SPI1->SR & SPI_SR_TXE)); // 等待发送缓冲区空 SPI1->DR = data; // 写入数据 }
  1. 使用DMA进行数据传输:这是最高效的方式,尤其适合填充整个屏幕区域或显示图片。STM32的SPI可以配合DMA,将显存中的数据不经过CPU直接发送到SPI外设。配置好DMA通道和SPI的TX DMA请求后,只需启动DMA传输,CPU即可去处理其他任务(如读取编码器)。这是解决“stm32h750 dma 驱动 spi lcd 问题”这类问题的关键思路,核心是配置好DMA的数据流、通道、传输方向(内存到外设)、数据宽度以及内存地址自增模式。
  2. 开辟帧缓冲区(Frame Buffer):在内部RAM中开辟一块2403202字节(RGB565格式)的数组作为帧缓冲区。所有绘图操作(画线、写字、显示曲线)都先在内存中完成,最后通过一次DMA传输将整个缓冲区更新到屏幕。这避免了频繁操作SPI导致的屏幕闪烁,但需要消耗约150KB的RAM,对于F103C8T6的20KB RAM来说是不可能的。因此,对于RAM较小的MCU,通常采用“局部更新”策略,只更新屏幕上发生变化的部分区域。

2.3 输入设备:旋转编码器的精准读取

焊台需要频繁调整温度、时间等参数,旋转编码器(Rotary Encoder)是比按键更高效、手感更好的选择。我选用的是常见的EC11编码器,带有按键功能(按下编码器轴)。

读取原理与防抖: 编码器输出两路相位差90度的方波(A相、B相)。通过检测A、B相的边沿变化顺序,可以判断是顺时针还是逆时针旋转。STM32可以通过外部中断(EXTI)或定时器的编码器接口模式来读取。

  1. 外部中断法:将A相和B相都配置为双边沿触发中断。在中断服务函数中,读取另一相的电平状态来判断方向。这种方法编程简单,但在高速旋转时可能丢失脉冲,且中断频繁,需做好防抖。
// 在A相中断中 if (Read_Pin(B) == HIGH) { // A相上升沿时,B相为高,则为顺时针 counter++; } else { counter--; }
  1. 定时器编码器模式(推荐):这是最可靠、最节省CPU资源的方法。STM32的通用定时器(如TIM2, TIM3, TIM4)自带正交编码器接口。将编码器的A、B相分别接到定时器的CH1和CH2通道,配置定时器为编码器模式。此后,定时器的计数器(CNT)会自动根据编码器的旋转方向和脉冲数进行增减,无需CPU干预。我们只需要定期(比如每10ms)去读取一次CNT值,并计算差值,就能得到这段时间内的精确步数。按键功能则通过普通的GPIO输入,配合软件消抖来处理。
// 初始化TIM2为编码器模式 TIM_Encoder_InitTypeDef sConfig = {0}; htim2.Instance = TIM2; sConfig.EncoderMode = TIM_ENCODERMODE_TI12; // 在TI1和TI2边沿都计数 sConfig.IC1Polarity = TIM_ICPOLARITY_RISING; sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI; sConfig.IC1Prescaler = TIM_ICPSC_DIV1; sConfig.IC1Filter = 6; // 设置滤波器,硬件防抖 // ... 类似配置IC2 HAL_TIM_Encoder_Init(&htim2, &sConfig); HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);

硬件滤波:编码器信号容易受到抖动干扰,在硬件上,可以在A、B相引脚对地接一个10nF~100nF的电容,构成简单的RC低通滤波器。在软件上,定时器接口的输入捕获滤波器(IC1Filter)参数也要合理设置。

2.4 功率控制与温度传感电路

这是焊台安全稳定工作的核心。

加热控制:采用MOS管(如IRF540N)作为开关器件,由STM32的定时器产生PWM波驱动。PWM频率不宜过高,否则MOS管开关损耗大;也不宜过低,否则温度波动明显。对于烙铁芯这类热惯性较大的负载,通常选择100Hz到1kHz的频率。我选择的是500Hz。使用定时器的PWM输出功能,通过改变捕获比较寄存器(CCR)的值来调整占空比,从而控制平均加热功率。

温度采样:焊台烙铁头通常采用热电偶或热敏电阻。热电偶需要冷端补偿和复杂的放大电路,而热敏电阻方案更简单。这里以常见的负温度系数(NTC)热敏电阻为例。它通常与一个精密电阻串联,构成分压电路,连接至STM32的ADC输入引脚。ADC采样得到电压值,通过查表法或公式计算(Steinhart-Hart方程)得到对应的温度值。

关键设计:ADC基准电压的稳定性至关重要。务必使用独立的、干净的LDO(如AMS1117-3.3)为MCU和ADC基准供电,并至少在ADC输入引脚加上一个0.1uF的滤波电容,以抑制噪声。对于高精度要求,甚至需要做软件上的多次采样取平均。

安全隔离:加热部分(220V交流电)和控制部分(3.3V弱电)必须进行电气隔离。通常使用光耦(如PC817)来传递PWM控制信号,使用隔离型DC-DC模块为控制部分供电。这是保证人身安全和MCU不被高压击穿的关键,绝对不能省略。

3. 软件架构与核心模块实现

硬件搭好了,软件就是灵魂。一个好的软件架构能让代码清晰、易于维护和扩展。

3.1 系统任务划分与调度

对于一个实时性要求较高的控制系统,我不建议使用简单的超级循环(Super Loop),因为很难保证温度控制周期的精确性。我采用了时间片轮询的轻量级调度方式,也可以考虑使用FreeRTOS这样的实时操作系统,但对于F103C8T6,资源略显紧张,时间片轮询足够。

我将主要任务分解如下:

  1. 温度控制任务:最高优先级,固定周期执行(如每秒100次,即10ms一次)。负责ADC采样、PID计算、PWM输出更新。
  2. 人机交互任务:中等优先级,周期执行(如每秒20次,即50ms一次)。负责扫描编码器和按键、更新菜单状态、处理用户输入。
  3. 显示刷新任务:低优先级,周期执行或事件触发。负责将需要更新的图形区域刷新到TFT屏幕。
  4. 系统监控任务:低优先级,长周期执行(如每秒1次)。负责检测异常(如温度超限、传感器开路)、管理休眠状态等。

main函数的while(1)循环中,通过一个由系统滴答定时器(SysTick)维护的毫秒级时钟,来检查各个任务是否到达其执行周期。

while (1) { uint32_t currentTicks = HAL_GetTick(); // 10ms任务:温度控制 if (currentTicks - lastCtrlTicks >= 10) { lastCtrlTicks = currentTicks; Temperature_Ctrl_Task(); } // 50ms任务:人机交互 if (currentTicks - lastUITicks >= 50) { lastUITicks = currentTicks; UI_Handler_Task(); } // 其他任务... HAL_Delay(1); // 防止CPU空转,也可进入低功耗模式 }

3.2 PID温度控制算法的实现与整定

PID是控制领域的经典算法, Proportional(比例)、Integral(积分)、Derivative(微分)。其目标是通过调整加热功率(输出),使实测温度(反馈)尽可能快地、平稳地达到并稳定在设定温度(目标)。

离散位置式PID公式Output = Kp * e(k) + Ki * ∑e(j) + Kd * [e(k) - e(k-1)]其中,e(k)是当前时刻的偏差(设定温度 - 实测温度)。

代码实现要点

  1. 积分抗饱和:当输出长时间处于最大值或最小值时,积分项会不断累积(windup),导致系统恢复时超调严重。必须对积分项进行限幅,或者当输出饱和时停止积分。
// 伪代码 error = setpoint - measured_temp; integral += error; // 抗饱和处理:如果输出已经饱和,且误差方向会加剧饱和,则停止积分 if ((output >= max_output && error > 0) || (output <= min_output && error < 0)) { integral -= error; // 撤销本次积分 } // 积分项限幅 integral = constrain(integral, -integral_limit, integral_limit);
  1. 微分先行与滤波:微分项对噪声非常敏感。直接对测量值求微分会放大噪声。可以采用“微分先行”策略,只对测量值进行微分,而不对设定值变化微分(因为设定值突变会导致微分项冲击)。同时,可以对测量值进行一阶低通滤波后再计算微分。
  2. 输出限幅:PID的输出最终要映射到PWM的占空比(0-100%),必须进行限幅。

PID参数整定:这是一个经验过程。我通常采用“先P后I再D”的方法。

  • 纯比例P:逐渐增大Kp,直到系统出现等幅振荡。此时的Kp记为Ku,振荡周期记为Tu。
  • 经典Ziegler-Nichols公式
    • Kp = 0.6 * Ku
    • Ki = Kp / (0.5 * Tu) (注意这里的Ki是公式中的,需要转换为代码中的积分系数)
    • Kd = Kp * 0.125 * Tu
  • 将计算出的参数作为初值,在实际系统中微调。目标是升温快、超调小(<5%)、稳态误差小。

实操心得:烙铁头的热惯性很大,微分作用(D)不宜过强,否则容易引起震荡。很多时候,一个精心调校的PI控制器就足够了。整定参数时,一定要在实际负载(插上烙铁头)下进行,空载和带载的系统特性差异巨大。

3.3 用户界面设计与TFT图形库

在TFT屏上绘制一个友好的界面,需要基本的图形绘制功能:画点、线、矩形、圆、显示字符和图片。

字库与显示:我使用了开源的字库取模软件(如PCtoLCD2002)生成12x12、16x16、24x24等不同大小的中英文字库,以数组形式存储在代码中。显示函数通过查表的方式,将字符的像素点绘制到帧缓冲区或直接通过SPI发送到屏幕。

菜单系统:一个清晰的菜单结构至关重要。我设计了一个基于状态机的菜单系统。定义一个菜单项结构体,包含显示文本、上级菜单、下级菜单、当前值、值类型(只读、数值、选项列表等)以及对应的处理函数。

typedef struct { const char* text; // 显示文本 MenuItem* parent; // 父菜单 MenuItem* child; // 子菜单(链表头) MenuItem* next; // 兄弟菜单 int value; // 当前值 int min, max; // 取值范围 ValueType type; // 值类型 void (*action)(MenuItem*); // 确认键处理函数 } MenuItem;

通过旋转编码器可以上下浏览菜单项,按下编码器进入子菜单或编辑当前值。菜单的渲染函数根据当前选中的菜单项,遍历链表并刷新屏幕显示区域。

曲线绘制:实时温度曲线是焊台的“仪表盘”。在屏幕上划定一个矩形区域作为曲线显示区。将时间作为横轴(像素),温度作为纵轴(像素)。每次得到新的温度数据,就计算其在曲线区内的坐标,并与上一个点连线。当曲线画到区域最右边时,需要将整个曲线向左平移一个像素(或清屏重画),实现动态滚动效果。这里需要注意坐标系的转换和数据的缩放。

4. 系统集成、调试与性能优化

当各个模块都调试通过后,将它们整合在一起,才是真正的挑战。

4.1 多任务间的数据共享与通信

温度控制任务需要当前的设定温度,这个值由人机交互任务在用户调整后更新。这里就涉及到了任务间共享数据的问题。在无操作系统的环境下,需要防止数据访问冲突(比如控制任务正在读取设定温度时,交互任务刚好要修改它)。

最简单的保护方法是使用临界区,在访问共享变量前关闭全局中断,访问后再打开。但这种方法会影响系统实时性。对于简单的整型变量,如果MCU架构支持,可以使用原子操作。更通用的方法是,将共享数据的访问封装成函数,并确保该函数不会被中断打断(或者本身就是原子操作)。

对于这个项目,设定温度、当前工作模式等关键共享变量,我采用了volatile关键字声明,并在修改和读取时,暂时关闭中断,虽然粗暴但有效。

volatile int32_t g_setpoint_temp = 300; // 设定温度,单位摄氏度 int32_t Get_Setpoint(void) { int32_t temp; __disable_irq(); // 关中断 temp = g_setpoint_temp; __enable_irq(); // 开中断 return temp; } void Set_Setpoint(int32_t temp) { __disable_irq(); if (temp > MAX_TEMP) temp = MAX_TEMP; if (temp < MIN_TEMP) temp = MIN_TEMP; g_setpoint_temp = temp; __enable_irq(); }

4.2 系统调试与问题排查实录

开发过程中,我遇到了几个典型问题,这里分享排查思路:

问题1:TFT屏幕显示花屏或局部错乱

  • 可能原因1:SPI时序不匹配。ILI9341对SPI模式(CPOL, CPHA)有要求,通常是模式0或模式3。检查STM32的SPI配置是否与屏幕驱动IC要求一致。
  • 可能原因2:初始化序列错误或延时不足。ILI9341上电后需要一段稳定的时间,并严格按照数据手册的初始化序列进行配置。每个命令后的延时(HAL_Delay)必不可少。
  • 可能原因3:电源噪声。TFT屏的背光和驱动电路功耗较大,可能引起电源波动。确保电源走线足够宽,并在屏幕的电源引脚就近放置一个100uF的电解电容和一个0.1uF的陶瓷电容。
  • 排查方法:先编写一个最简单的测试程序,只初始化SPI和GPIO,然后发送清屏命令(全屏填充单一颜色)。如果基础显示正常,再逐步添加复杂功能。

问题2:旋转编码器读数不准,偶尔反向或跳变

  • 可能原因1:硬件抖动。这是最常见的原因。检查硬件滤波电容是否焊接,并增大软件去抖的滤波系数(定时器编码器模式的ICxFilter值)。
  • 可能原因2:中断冲突或优先级。如果使用了外部中断法,确保中断服务函数执行时间尽可能短,并且没有更高优先级的中断长时间阻塞它。
  • 可能原因3:电源电压不稳。编码器内部接触点对电压敏感。用示波器观察编码器输出引脚波形,看是否有毛刺或电压幅值不足。
  • 排查方法:改用定时器编码器模式,这是最稳定的方案。如果必须用中断,在中断服务函数里只设置标志位,在主循环中处理逻辑。

问题3:温度控制波动大,无法稳定

  • 可能原因1:PID参数不合适。这是首要怀疑对象。重新整定PID参数,特别是积分时间。
  • 可能原因2:温度采样噪声大。用万用表或示波器测量ADC输入引脚电压,观察是否稳定。加大ADC采样次数进行软件平均滤波(如16次或32次平均)。
  • 可能原因3:加热执行机构(MOS管)响应问题。检查PWM频率是否合适。频率太低(如1Hz)会导致温度周期性波动;频率太高,MOS管可能无法完全开关,发热严重。用示波器观察MOS管栅极的PWM波形是否干净、幅值足够(要能完全导通MOS管)。
  • 可能原因4:热惯性测量延迟。烙铁头的温度传到传感器有延迟。如果微分参数过强,会放大这个延迟导致的误差。尝试减小微分系数D,甚至设为0。
  • 排查方法:在代码中增加调试输出,通过串口实时打印设定温度、实测温度、PID输出、PWM占空比等数据,在电脑上用串口绘图工具(如Serial Plotter)观察曲线,能非常直观地发现问题。

4.3 高级功能扩展思路

基础功能稳定后,可以考虑增加一些提升体验和实用性的功能:

  1. 多种烙铁头参数存储:不同的烙铁头(刀头、尖头、马蹄头)其热特性不同。可以为每个烙铁头保存一套独立的PID参数和温度校准值,使用时通过菜单选择。
  2. 自动休眠与唤醒:通过检测编码器或按键的操作间隔,在一段时间无操作后,自动降低烙铁温度至休眠温度(如150°C),以延长烙铁头寿命。移动编码器或拿起焊台(通过震动传感器)时,快速恢复至工作温度。
  3. 温度曲线编程:对于焊接BGA芯片或需要特定加热曲线的场景,可以预设多段温度曲线(例如:升温到180°C,保持30秒,再升温到220°C,保持10秒,最后升温到250°C)。系统按照预设的曲线自动控制温度。
  4. 校准模式:提供温度校准功能。使用一个高精度的温度计测量烙铁头实际温度,与系统显示温度对比,输入偏移量进行软件补偿,提高显示精度。
  5. 系统信息与诊断:在菜单中增加显示实时ADC值、PWM占空比、系统运行时间、故障历史记录等信息,方便调试和维护。

这个项目从一块芯片开始,到最终成为一个得心应手的工具,整个过程是对嵌入式开发技能的一次全面检验。它不仅仅是让一个烙铁变热,更是关于如何将传感器、执行器、算法和人机界面有机地整合成一个稳定、可靠、好用的产品。每一个细节的打磨,从硬件滤波电容的选值,到PID参数小数点后几位的调整,都直接影响着最终的使用体验。当你亲手制作的焊台能够精准稳定地停留在你设定的温度,并在漂亮的屏幕上实时反馈出平滑的曲线时,那种成就感是无可替代的。希望我的这些经验分享,能帮你少走些弯路,更快地打造出属于你自己的智能焊台。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/19 1:03:02

ESP32-S3蓝牙广播控制:在无按键CardPuter上运行Doom游戏

1. 项目缘起&#xff1a;当复古掌机遇上现代无线技术最近在折腾一个特别有意思的玩意儿&#xff0c;我把它叫做“CardPuter ADV Doom”。简单来说&#xff0c;就是在一台基于ESP32-S3的、长得像游戏卡带的便携式设备上&#xff0c;运行经典的《毁灭战士》&#xff08;Doom&…

作者头像 李华
网站建设 2026/8/19 1:00:48

基于EMR Serverless StarRocks AI Function构建多模态智能运维平台

1. 从“人肉”到“智能”&#xff1a;一个运维团队的效率困局与破局我所在的团队&#xff0c;曾经长期被两类看似简单、实则繁琐到令人头疼的任务所困扰。第一类是工单标注。每天&#xff0c;来自不同业务线的告警、故障报告、用户反馈像雪花一样涌进工单系统。这些工单里&…

作者头像 李华
网站建设 2026/8/19 0:43:51

系统监控双稳态原理:为何固定频率探针无法实现瞬时故障检测?

1. 从标题拆解&#xff1a;一个关于系统监控的“反直觉”结论 最近在分布式系统和时序监控的圈子里&#xff0c;一个相当硬核的讨论点引起了我的注意&#xff0c;它的标题是“Bistable by Construction: Wall-Clock-Calibrated State Monitors Have No Moment-Detection Regime…

作者头像 李华
网站建设 2026/8/19 0:27:13

【单片机毕设案例分享】基于 XGZP6847A 传感器的气压超限智能报警装置设计 单片机气压数据采集系统与蓝牙移动端 APP 联动方案设计(022403)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于单片机&#xff0c;STM32单片机&#xff0c;51单片机&#xff0c;J…

作者头像 李华
网站建设 2026/8/19 0:17:22

GBase 8a数据库常用日期函数解析

南大通用GBase 8a数据库&#xff08;gbase database&#xff09;提供丰富的日期函数&#xff0c;在 ETL 开发和报表统计中高频使用。以下是最实用的四个函数及其典型场景。使用示例-- 1. NOW() / SYSDATE() —— 获取当前时间SELECT NOW(), SYSDATE();-- 结果: 2026-06-30 15:2…

作者头像 李华