返回首页

VLI IV-11 和 STM32F401 时钟:原理图和代码

桌面时钟项目使用 VLI IV-11 和微控制器 STM32F401CC。实现动态显示控制、带校准的硬件 RTC 以及通过 DC-DC 模块的 USB 电源。完整代码和原理图可复制。

STM32 上的复古 IV-11 时钟:完整组装指南
Advertisement 728x90

STM32F401 驱动 IV-11 VFD 真空荧光显示桌摆钟

这个项目打造了一款时尚的桌面时钟,使用真空荧光显示管(VFD)——具体是 IV-11 型号。STM32F401CC 微控制器通过 8 通道驱动器(如 TD62783AP 或兼容的 KID65783AP)实现动态时间显示。电源采用现代 DC-DC 模块:XL6009 升压至 45V 供阳极使用,MP2307 将 USB 5V 稳压至精确的 1.5V 灯丝供电。板载硬件 RTC 确保走时精准,无需外部模块。

IV-11 参数:灯丝 1.5V,阳极约 50V。使用 Altium Designer 设计,提供生产级 Gerber 文件。

组件与原理图

主要部件:

Google AdInline article slot
  • 微控制器:STM32F401CC(Black Pill 开发板),内置 RTC。
  • 显示驱动:TD62783AP,用于高压段选控制。
  • 电源模块

- XL6009:升压转换器 5V → 45V。

- MP2307:降压稳压器,提供稳定的 1.5V 灯丝电压。

  • 显示屏:4 位 IV-11 VFD,支持动态扫描。
  • 控制:单按钮调时(短按调分,长按调时)。

原理图使用 GPIO 控制段码和位选,按键去抖用定时器。

Google AdInline article slot

STM32CubeIDE 固件开发

代码基于 segment_lcd 库实现流畅动态显示。主循环:读取 RTC、处理按键、格式化时间字符串(冒号 2 秒闪烁周期),并刷新显示。

完整代码:

#include "main.h"
#include "segment_lcd.h"
#include "stdio.h"
#include "button.h"

/* Private variables ---------------------------------------------------------*/
RTC_HandleTypeDef hrtc;
TIM_HandleTypeDef htim3;
TIM_HandleTypeDef htim10;

RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef DateToUpdate = {0};

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_RTC_Init(void);
static void MX_TIM10_Init(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();

  MX_GPIO_Init();
  MX_RTC_Init();
  MX_TIM10_Init();

  HAL_PWR_EnableBkUpAccess();

  HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
  HAL_TIM_Base_Start_IT(&htim10);

  while (1)
  {
    HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
    HAL_RTC_GetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN);

    BUTTON_Process();
    if (BUTTON_GetAction(BUTTON_SETTINGS) == BUTTON_SHORT_PRESS)
    {
      sTime.Minutes++;
      sTime.Seconds = 0;
      if(sTime.Minutes >=60)
      {
        sTime.Seconds = 0;
        sTime.Minutes = 0;
      }
      HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
    }

    if (BUTTON_GetAction(BUTTON_SETTINGS) == BUTTON_LONG_PRESS)
    {
      sTime.Hours++;
      if(sTime.Hours >=24)
      {
        sTime.Hours = 0;
      }
      HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
    }
    BUTTON_ResetActions();

    SEG_LCD_Process();
    HAL_Delay(1);

    char str[DIGITS_NUM + 2];
    if(sTime.Seconds % 2 == 0)
    {
      snprintf(str, DIGITS_NUM +2, "%02d.%02d", sTime.Hours, sTime.Minutes );
    }
    else
    {
      snprintf(str, DIGITS_NUM +2, "%02d%02d", sTime.Hours, sTime.Minutes );
    }
    SEG_LCD_WriteString(str);
  }
}

// ... (其他函数:SystemClock_Config, MX_RTC_Init, MX_TIM10_Init, MX_GPIO_Init - 详见原代码)

时钟设置与 RTC 配置

系统时钟:HSE 25 MHz → PLL 84 MHz (HCLK)。RTC 使用 LSE 32.768 kHz。预分频器:异步 127,同步 255。RTC 校准:平滑校准,32 秒内 -142 脉冲修正。

Google AdInline article slot

首次上电初始化:设置为 2026 年 12 月 2 日 12:00,备份标志存于 BKP_DR0 (0x32F2)。TIM10 (10 kHz) 处理按键逻辑。

GPIO:PB3-6,12-15 用于位选/段码(推挽输出,低速);PA2 为按键输入(无上拉)。

组装与调试

  • 将 Gerber 文件发送给 PCB 厂家制作。
  • 使用 STM32CubeIDE 通过 ST-Link 烧录固件。
  • 插入 USB 5V 供电。
  • 用按钮设置时间。

小贴士:避免假冒 TD62783AP,推荐 KID65783AP。若用 IV-6 管子,灯丝加电阻降至 1.2V。

核心亮点

  • TD62783AP 动态驱动节省 GPIO 引脚。
  • STM32 内置 RTC,无需 DS3231。
  • XL6009/MP2307 模块提供稳如磐石的 USB 供电。
  • RTC 校准精度达 ±142 脉冲/32 秒。
  • 代码即插即用;segment_lcd 库简化 VFD 控制。

— Editorial Team

Advertisement 728x90

继续阅读