LT7689 是一款结合了 Cortex-M4 MCU 和 2D图形加速器 的控制芯片,旨在提供高效的串口通信和显示功能。它的主要用途是通过简单的串口指令将显示内容传输到 TFT屏幕 上,适合嵌入式系统的显示控制需求。
Cortex-M4 MCU 内核,支持高达 150MHz 的主频,拥有 508KB Flash 和 256KB SRAM 存储,提供了足够的计算和存储空间用于嵌入式应用。
2D图形加速器 用于提升图形显示的效率,减少主控MCU处理显示所需的时间。支持图形加速、几何图形绘制、图形混合等功能,极大地提高了显示操作的性能。
功能/特性 | 描述 |
---|---|
支持的显示分辨率 | 支持 320x240 (QVGA) 到 1280x1024 (SXGA) 分辨率的显示屏。支持 16位、18位 和 24位 的 RGB 接口显示屏。 |
内置显示内存 | 128Mb 的显示内存用于存储图片、动画、UI元素等显示内容。 |
图形加速和硬件支持 | 内置 图形加速器(BTE),支持 旋转、镜像效果、画中画(PIP)、几何图形绘制 等硬件加速功能,减少MCU负担,提升显示效率。 |
UART串口通信 | 通过 UART 串口进行与主控MCU的通信。支持多个 SCI(UART)接口,可连接如 蓝牙模块、WiFi模块 等其他通信模块。 |
外设接口 | 提供 USB接口、SD卡(SPI)接口、音频输出DAC接口、模拟输入AIN、PWM接口 和 INT中断接口 等接口,可作为普通GPIO进行配置。 |
UI界面开发 | 支持 UI_Editor-II 和 UI_Emulator-II 软件,开发者可在PC上进行UI设计和模拟,支持图片显示、GIF动画、进度条、菜单、时钟、二维码等UI元素。 |
UI功能 | 支持 图片显示、进度条、滑动菜单、字符串显示、中英文键盘、数字键盘、模拟时钟、数字时钟、指针显示、二维码生成、多国语言、音效播放、变量控制 等功能。 |
存储与处理能力 | 内部具备 508KB Flash 和 256KB SRAM,可直接在内部存储器中执行和存储显示内容,减少对外部存储的依赖。支持 SPI Flash接口 用于存储外部资源。 |
主控MCU功能 | 除了显示控制功能外,LT7689 还可作为 主控MCU 使用,具有 高容量Flash和SRAM,内置 图形加速引擎(BTE和几何引擎),能独立处理显示任务。 |
应用场景 | 适用于各种嵌入式产品,如 智能家电、汽车仪表盘、摩托车面板、多功能事务机、工业控制设备、医疗美容设备、智能音箱、充电设备、水电表 等。 |
接下来就是相关代码分析,供大家学习乐升的板载资源作为参考。
uint16_t cx, cy;
uint8_t w_temp, h_temp;
NVIC_SetVectorTable(0x800A000, 0);
PeripheralInit();
WDT_Init(0x4786*2);
定义了两个 16位无符号整数 变量 cx
和 cy
,表示 x坐标 和 y坐标,存储图形显示中的坐标位置。
两个 8位无符号整数 变量 w_temp
和 h_temp
,用于存储临时 宽度 和 高度,用图形或区域的尺寸。
NVIC_SetVectorTable(0x800A000, 0);
:此函数调用设置 中断向量表 的地址。在ARM架构的嵌入式系统中,中断向量表 是存放中断服务例程(ISR)的表格,控制CPU如何处理中断请求。
0x800A000
是 中断向量表的地址,它是存放中断服务例程的基地址。
第二个参数 0
通常表示将向量表设置到该地址之后的偏移位置。一般情况下,0 表示从地址 0x800A000
开始加载向量表。
PeripheralInit 外设初始化函数的调用,它负责初始化和配置系统中的外设。
WDT_Init(0x4786*2);
:此函数调用用于初始化 看门狗定时器(WDT)。看门狗定时器是一种用于监控系统健康状态的外设。如果系统在设定的时间内没有重置看门狗定时器,系统就会认为出现故障,并进行复位或其他预设的动作。
0x4786*2
:这是给定的看门狗定时器的 计时值,它是 0x4786
(即 18310
)乘以 2
,所以实际的值是 36620
。这个值会决定看门狗计时器的超时周期。该值可能表示看门狗触发复位的时间,单位可能是毫秒或其他时间单位,具体取决于系统时钟配置。
WDT_FeedDog(); //Clear watchdog
#if !IIC_BUS
#if (UARTBUS_OPTION == 0)
Main_From_UartRxBuff();
if (gUsartRx.Flag)
LT_ReceiveCmd(gUsartRx.Buf);
WDT_FeedDog();用于 喂狗,即清除 看门狗定时器。看门狗定时器用于确保系统在预定时间内执行某些操作。
#if !IIC_BUS
表示当 IIC_BUS
不是宏定义时(即 IIC_BUS
为 0
或未定义时),编译器将包括接下来的代码块。如果 IIC_BUS
被定义了或为非零值,则跳过接下来的代码块。若不使用 I2C 总线,则执行后续代码,否则跳过。
#if (UARTBUS_OPTION == 0)
是一个条件编译指令,当 UARTBUS_OPTION
的值等于 0
时,编译器将包括该块代码。UARTBUS_OPTION
是一个配置选项,用来控制程序使用的串口总线模式。
Main_From_UartRxBuff();
是一个函数调用,用于从 UART 接收缓冲区 中提取数据并进行处理。
if (gUsartRx.Flag)
:检查全局变量 gUsartRx.Flag
的状态,通常 Flag
用来标记是否接收到有效的数据。如果 Flag
被设置为真,说明有数据从串口接收缓冲区中成功读取。
LT_ReceiveCmd(gUsartRx.Buf);
:如果接收标志 Flag
为真,则调用 LT_ReceiveCmd(gUsartRx.Buf)
,处理接收到的数据。gUsartRx.Buf
是一个缓冲区,存储了从 UART 接收到的数据,LT_ReceiveCmd()
函数可能用于解析并执行命令或处理接收到的信息。
if(UI_update == 1)
{
while(1)
{
WDT_FeedDog(); //Clear watchdog;
Main_From_UartRxBuff();
if (gUsartRx.Flag)
LT_ReceiveCmd(gUsartRx.Buf);
if(UI_update == 0) break;
}
}
标记界面是否需要更新,如果更新,进入 while(1)
无限循环,表示代码将不断地执行循环体内的操作,直到条件满足 break
跳出循环。WDT_FeedDog()
函数用于清除看门狗定时器,防止系统在此循环中被看门狗重置。如果看门狗定时器没有被及时喂养(清除),系统会复位。所以每次进入循环时都需要调用该函数来保持系统正常运行。Main_From_UartRxBuff()
函数用于从 UART 接收缓冲区读取数据。根据函数名,将接收到的数据从缓冲区中提取并放入相应的处理队列或缓存中,等待进一步处理。if (gUsartRx.Flag)
检查是否有有效的 UART 数据接收标志。如果 gUsartRx.Flag
被置为真,说明有数据被成功接收到并存储在 gUsartRx.Buf
中。LT_ReceiveCmd(gUsartRx.Buf);
函数用于处理接收到的数据(存储在 gUsartRx.Buf
中)。它可能解析数据并执行相关命令。在每次循环结束时,检查 UI_update
的值。如果 UI_update
被置为 0
,则执行 break
语句跳出 while
循环,终止数据接收和处理的过程。这意味着只有在 UI_update
为 1
时才会持续进入这个循环,直到 UI_update
变为 0
,才能退出循环。
if (var[0x700e * 2 + 1])
BackLight_control(); // Backlight control
if (page_refreshing > 20)
{
page_refreshing = 0;
Get_date_variable_Id_Regular_update(pic_id);
}
if(Count_reg_num > 0)
{
Count_reg_num--;
reg_operation(Count_reg[Count_reg_num]);
}
if (gWavFlag == 1 || gWavType == 1)
LT_PlayWav_DAC();
var[0x700e * 2 + 1]
这一行从 var
数组中获取一个特定的值,地址为 0x700e * 2 + 1
,这个地址对应的是一个配置值。如果这个值不为 0(即为真),调用 BackLight_control()
函数来控制屏幕的背光亮度。此函数会调整屏幕的亮度或开启/关闭背光。page_refreshing
变量用于跟踪页面刷新的计数。if (page_refreshing > 20)
判断如果页面刷新计数超过 20,则:将 page_refreshing
重置为 0
,表示已经完成了一次刷新操作。调用 Get_date_variable_Id_Regular_update(pic_id)
函数,执行定期更新操作,传入 pic_id
作为参数,用于更新某个图像或数据。Count_reg_num
变量记录了待处理的寄存器操作数。if(Count_reg_num > 0)
判断如果还有未操作的寄存器操作:Count_reg_num--
,减少操作计数。调用 reg_operation(Count_reg[Count_reg_num])
执行当前寄存器操作,Count_reg[Count_reg_num]
可能是当前操作的寄存器地址或操作参数。if (gWavFlag == 1 || gWavType == 1)
判断是否有音频播放需求:gWavFlag == 1
或 gWavType == 1
为真时,表示需要播放音频。如果条件成立,调用 LT_PlayWav_DAC()
函数,会通过 DAC(数字到模拟转换器)播放 WAV 文件。
show_gif(); // gif
show_Clock(); // Analog clock
show_RTC(); // Digital clock
scroll_text(); // Text scroll1
Display_Curve(); // Curve
show_Count(); // Time counter
Check_Var_Count();
Check_Pointer();
show_gif();
该函数用于显示 GIF 动画。它负责在屏幕上显示一个动画图片,通常用于展示动态图像或动态效果。
show_Clock();
show_Clock()
是一个模拟时钟的显示函数。它会在屏幕上绘制一个模拟时钟,显示类似于传统指针式时钟的界面。
show_RTC();
该函数用于显示数字时钟,通常基于 RTC(实时时钟)模块读取当前时间并以数字形式显示,通常表现为类似于 "12:34:56" 这样的时间格式。
scroll_text();
scroll_text()
函数用于实现滚动文本的效果。通常,它会将一段文字从屏幕的一侧滚动到另一侧,常用于显示新闻、通知或者长文本信息。
Display_Curve();
Display_Curve()
函数显示一条曲线,可能是在屏幕上绘制数据曲线(如实时数据的变化、传感器读数等)或者其他图形曲线。
show_Count();
show_Count()
函数是一个时间计数器的显示功能。它会在屏幕上显示一个计数器,可能用于倒计时、计时器功能或者显示其他计数类信息。
Check_Var_Count();
Check_Var_Count()
函数看起来是一个检查变量计数的函数。它可能会对某个或某些计数变量进行检查和更新,确保数据的正确性。
Check_Pointer();
Check_Pointer()
函数是用来检查指针状态或位置的。它可能涉及触摸屏的触摸点、鼠标指针的位置,或者某些指针数据结构的状态检查。
Basic_touch(); // Basic touch control
Adj_touch(); // Variable adjustment
Progress_bar_sliding(); // Sliding progress bar
data_input(); // Data input
slideMune(); // Slide menu
RingSld_touch(); // Ring progress bar with touch
Ascii_input(); // ASCII keyboard
GBK_input(); // GBK keyboard
VarKey_touch(); // Multivariable adjustment
pop_up_touch(); // Pop-up window
Basic_touch();
该函数是基本的触摸控制功能,用于检测用户的触摸输入并响应基础的交互操作,比如触摸屏的点击、滑动等。
Adj_touch();
Adj_touch()
函数用于调整某些变量或界面元素,例如调整亮度、音量、颜色等。它可能允许用户通过触摸界面上的滑块或按钮来调整设置。
Progress_bar_sliding();
该函数用于显示和控制滑动进度条。用户通过触摸屏滑动进度条来调整某个进度或者参数的值,例如音量、进度等。
data_input();
data_input()
函数涉及通过触摸屏进行数据输入,例如用户输入数字或文本,可能用于输入设置值、数字、日期等。
slideMune();
slideMune()
函数是用于滑动菜单的控制。当用户通过滑动屏幕来导航菜单时,这个函数会处理菜单的显示和隐藏操作。
RingSld_touch();
RingSld_touch()
函数控制一个环形的进度条或滑动条,用户通过触摸屏控制进度条的位置或状态,通常用于显示某个量的进度,类似于音量调节、亮度调节等。
Ascii_input();
Ascii_input()
函数用于显示和处理 ASCII 键盘输入,允许用户通过触摸界面输入英文字符、数字或其他 ASCII 字符。
GBK_input();
GBK_input()
函数用于支持 GBK 编码的输入,通常是中文输入法的实现,用户可以通过触摸屏输入中文字符。这可能是通过选择拼音或者字形的方式来进行。
VarKey_touch();
VarKey_touch()
函数用于多变量调整功能,用户可以通过触摸屏来调整多个参数值。这可能是一个综合调节界面,用户可以控制多个滑块或旋钮来调整多个变量。
pop_up_touch();
pop_up_touch()
函数显示和控制弹出窗口(Pop-up Window)。当用户执行某个操作时,这个函数会负责显示一个弹出窗口,用于提示信息、确认操作或者进行额外的设置。
/**** Screen test ****/
if (scr_flag == 1 && scr_time > 100)
{
scr_time = 0;
Detection_screen(scr_flag) ;
}
else if (scr_flag == 2)
{
if (gTpInfo.sta) // press down
{
scr_key = 1;
}
if (gTpInfo.sta == 0 &&scr_key == 1)
{
scr_key = 0;
Detection_screen(scr_flag) ;
}
}
/****Keyboard cursor display****/
if (Cusor_time > 60)
{
Cusor_time = 0;
if (DioKb_flag == 1)
{
if (Screen_DIR == 0)
{
if (gDio_Info[Dio_num].Alig == 0)
cx = cur_x + input_w;
else
cx = cur_x;
cy = cur_y;
w_temp = cur_w;
h_temp = gDio_Info[Dio_num].zk_h;
}
else if (Screen_DIR == 1)
{
if (gDio_Info[Dio_num].Alig == 0)
cy = cur_y + input_w;
else
cy = cur_y;
cx = cur_x;
w_temp = gDio_Info[Dio_num].zk_h;
h_temp = cur_w;
}
else if (Screen_DIR == 2)
{
if (gDio_Info[Dio_num].Alig == 0)
cx = cur_x - input_w;
else
cx = cur_x;
cy = cur_y;
w_temp = cur_w;
h_temp = gDio_Info[Dio_num].zk_h;
}
else if (Screen_DIR == 3)
{
if (gDio_Info[Dio_num].Alig == 0)
cy = cur_y - input_w;
else
cy = cur_y;
cx = cur_x;
w_temp = gDio_Info[Dio_num].zk_h;
h_temp = cur_w;
}
}
这段代码的核心功能是处理触摸屏输入与光标显示,并通过不同的键盘输入标志(如 DioKb_flag
、AioKb_flag
、GBKioKb_flag
)来决定光标的显示与位置更新。每当满足一定条件时(如每 60 次 Cusor_time
),程序会定期刷新光标的位置并显示在屏幕上。通过屏幕方向(Screen_DIR
)、对齐方式(gDio_Info[Dio_num].Alig
)等因素的综合判断,程序确保光标能够正确地显示在屏幕的不同位置。此外,Detection_screen(scr_flag)
的调用用于屏幕检测或触摸按键的响应,确保用户与设备的交互能够顺利进行。