Funpack4-3 基于MAX32655实现LCD显示ADC数据
该项目使用了MAX32655FTHR开发板,实现了ADC电压采集并LCD显示的设计,它的主要功能为:控制LCD显示ADC采集的电压值。
标签
嵌入式系统
Funpack活动
ADC
ADI
lvgl
MAX32655
MAX32655FTHR
Funpack4-3
枫雪天
更新2026-02-10
13

任务介绍

    本项目实现了Funpack4-3活动MAX32655FTHR开发板的任务一,基于ADI的MAX32655FTHR开发板实现了对ADC模拟输入信号的实时采集,并通过LVGL图形库在LCD屏幕上可视化显示电压值。系统能够同时监测两个ADC通道的电压变化,并以进度条形式直观展示测量结果。

硬件平台

    本次使用ADI推出的MAX32655FTHR开发板,是一款面向嵌入式开发的高性能评估平台。该开发板搭载了基于ARM Cortex-M4内核的MAX32655系列MCU,具备丰富的外设资源,包括多个ADC通道、SPI接口、GPIO等,非常适合用于数据采集和人机交互系统的开发。开发板集成了调试器接口、USB接口、RGB-LED、音频输入输出与SD卡接口,便于快速搭建原型系统。


主控设备:ADI MAX32655FTHR开发板

  • 搭载MAX32655 MCU(ARM Cortex-M4F 100MHz)
  • 集成USB接口与调试器
  • 板载音频输入输出外设
  • 板载输入按键与三色LED

外接设备:ST7735显示屏

任务分析与实现

本系统实现了基于LVGL图形库的ADC电压采集平台,主要功能包括:

三通道数据交互:

  • 游戏输入采集
    • 采样频率:4Hz(250ms周期)
    • 支持两路模拟信号输入
  • LCD显示控制
    • 显示刷新率:33Hz(30ms周期)
    • LVGL图形化UI
    • 实时电压可视化


方案框图:

LVGL 图形库的配置过程

本项目基于ADI MAX32655FTHR开发板完成了LVGL图形库的成功移植,并在此基础上实现了对ST7735S LCD屏幕的控制与ADC电压值的可视化显示。以下详细描述了LVGL配置的关键流程和核心要点。

一、移植前的准备

1. 硬件环境

  • 主控芯片:ADI MAX32655(ARM Cortex-M4F 内核)
  • 开发板:MAX32655FTHR
  • 外设资源
    • SPI接口用于驱动ST7735S LCD显示屏
    • GPIO控制D/C和RESET信号
    • ADC用于模拟信号采集
    • USART串口调试输出

2. 软件环境

  • LVGL版本:适配MAX32655的定制版本
  • 编译工具链:GCC ARM Embedded (arm-none-eabi-gcc)
  • 构建工具:Makefile构建系统
  • 底层支持库:ADI SDK提供HAL支持

二、移植的核心步骤

1. 显示驱动配置 (st7735s.c)

BSP 是 RT-Thread 针对特定硬件平台的支持包,主要包括启动代码、CPU 初始化、中断向量表、时钟配置以及设备驱动适配。

完成LCD控制器初始化序列,关键流程如下:

  1. 配置SPI接口,设置合适的传输速率
  2. 初始化GPIO引脚控制D/C和RESET信号线
  3. 实现显示刷新函数,将帧缓冲区数据传输到LCD
static int spi_tx(uint8_t *data, unsigned int len)
{
mxc_spi_req_t req;
req.spi = MXC_SPI1;
req.txData = data;
req.rxData = NULL;
req.txLen = len;
req.rxLen = 0;
req.ssIdx = 0;
req.ssDeassert = 1;
req.txCnt = 0;
req.rxCnt = 0;
req.completeCB = NULL;
return MXC_SPI_MasterTransaction(&req);
}

static void disp_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
{
// 实现将颜色数据刷入指定区域的LCD显示缓存
// ...existing code...
}

2. LVGL库初始化 (main.c)

配置图形库基本参数和显示驱动:

void lvgl_setup(void)
{
    /* LittlevGL setup */
    lv_init();


    /* Initialize `disp_buf` with the buffer(s). */
    lv_disp_draw_buf_init(&disp_buf, disp_buf1, disp_buf2, DRAW_BUF_SIZE);


    /* Display driver setup */
    lv_disp_drv_init(&disp_drv);
    disp_drv.draw_buf = &disp_buf;
    disp_drv.flush_cb = disp_flush;
    disp_drv.hor_res = DISP_HOR_RES;
    disp_drv.ver_res = DISP_VER_RES;
    disp = lv_disp_drv_register(&disp_drv);
}

3. ADC数据采集配置

使用内部ADC模块实现模拟信号数字化

static float adc_to_voltage(int32_t adc_value) {
    // 10-bit ADC (0-1023) maps to 0-1.22V
    const float voltage_reference = 1.22f;
    const float max_adc_value = 1024.0f;
    float voltage = (adc_value / max_adc_value) * voltage_reference;
    return voltage;
}
  1. UI元素创建与更新

创建进度条和标签用于显示电压值:

/* Create progress bar for Channel 0 - top half */
bar_ch0 = lv_bar_create(lv_scr_act());
lv_obj_set_size(bar_ch0, 100, 15);
lv_obj_align(bar_ch0, LV_ALIGN_TOP_MID, 0, 20);
lv_bar_set_range(bar_ch0, 0, 12);
lv_bar_set_value(bar_ch0, 0, LV_ANIM_OFF);

代码详解

整体软件流程图:


一、硬件初始化与传感器配置

系统上电后首先完成外设初始化序列,关键流程如下:


  • 配置SPI引脚为复用模式,确保LCD通信正常
  • 初始化ADC模块,设置参考电压和采样参数
  • 启动LVGL图形库并创建基础UI元素
static int spi_init(void)
{
    // 配置SPI1用于LCD通信
    // ...existing code...
}


static int display_init(void)
{
    st7735s_cfg_t panel;
    spi_init();
   
    /* Initialize ST7735S controller with panel-specific sequence */
    panel.delayfn = delay_ms;
    panel.sendfn = spi_tx;
    panel.regcfg = cfaf128128b1_regcfg;
    panel.ncfgs = sizeof(cfaf128128b1_regcfg) / sizeof(st7735s_regcfg_t);
    st7735s_init(&panel);
    return 0;
}

二、数据显示任务调度

#define CONT_TIMER MXC_TMR3
#define CONT_TIMER_IRQn TMR3_IRQn

static void on_timer_irq(void)
{
// Clear interrupt
MXC_TMR_ClearFlags(CONT_TIMER);
// tick lvgl lib
lv_tick_inc(1);
}

int main(void)
{
// 初始化硬件和软件模块
tmr_init_for_1KHz_periodic_interrupt();
display_init();
lvgl_setup();

// 主循环处理数据采集和显示更新
while (1) {
/* Read ADC channels every 250ms */
if ((last_adc_tick + 250) < lv_tick_get()) {
// 读取ADC值并转换为电压
// 更新进度条和标签显示
}

if ((last_tick + 30) < lv_tick_get()) {
/* The timing is not critical but should be between 1..30 ms */
lv_task_handler();
last_tick = lv_tick_get();
}
}
}

效果展示

遇到的难题与解决办法

问题:SPI时钟频率较高时,屏幕容易初始化失败

解法

本次使用杜邦线+面包板连接,通信信号容易受干扰,可在D/C引脚控制时适当引入延时便于信号建立,同时适当降低SPI时钟频率。

活动感想

通过本项目实践,学习了新的MAX32655微控制器和MSDK开发工具链,并且深入掌握了LVGL图形库在嵌入式平台上的移植方法。ADI MAX32655FTHR开发板良好的硬件兼容性与完整的SDK文档、例程极大提升了开发效率。整个移植过程中,需重点关注

  • SPI总线时序优化
  • ADC采样精度提升方法
  • 实时数据显示的UI设计

MAX32655FTHR开发板出色的性能表现和ADI官方完善的技术支持极大提升了开发效率。整个项目过程中,体会到嵌入式系统需要硬件、固件、应用层的紧密配合,每一个细节的优化都能显著提升整体体验。

    感谢硬禾学堂和得捷电子联合举办的Funpack活动,祝硬禾的活动越办越好!

附件下载
MAX32655电压计源代码.zip
团队介绍
个人
团队成员
枫雪天
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号