任务介绍
本项目实现了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控制器初始化序列,关键流程如下:
- 配置SPI接口,设置合适的传输速率
- 初始化GPIO引脚控制D/C和RESET信号线
- 实现显示刷新函数,将帧缓冲区数据传输到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;
}
- 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活动,祝硬禾的活动越办越好!