当前位置:首页 > 汽车电子 > 汽车电子
[导读]消费电子里“点了没反应、滑了慢半拍”,通常不是触控IC不灵,而是链路没设计好:中断里直接刷屏、坐标没映射、报点率和刷新率不同步、UI全屏重绘。低延迟联动的本质是——触控事件只做最小处理,画面反馈靠脏区+VSync同帧提交。


消费电子里“点了没反应、滑了慢半拍”,通常不是触控IC不灵,而是链路没设计好:中断里直接刷屏、坐标没映射、报点率和刷新率不同步、UI全屏重绘。低延迟联动的本质是——触控事件只做最小处理,画面反馈靠脏区+VSync同帧提交。

一、架构:触控走独立高优通道

别在main while里轮询触摸脚。正经链路:

手指触碰 → Touch IC中断 → I²C读坐标

  → input线程入队 → 坐标映射

  → GUI事件分发 → 标脏区

  → VSync提交显示

输入线程优先级必须高于UI渲染线程,否则触控事件排队等渲染完,延迟直接上几十ms。

二、触控中断只收点,不画界面

void TP_IRQHandler(void){

   if(tp_irq_active()){

       BaseType_t woken=pdFALSE;

       xQueueSendFromISR(g_tp_q, &tp_raw, &woken);

       tp_clear_irq();

       portYIELD_FROM_ISR(woken);

   }

}


void input_task(void*p){

   tp_point_t p;

   while(1){

       if(xQueueReceive(g_tp_q,&p,portMAX_DELAY)){

           ui_post_touch(tp_map(&p));   // 只投事件

       }

   }

}

中断里别调LVGL、别fillScreen、别sprintf——只把原始坐标扔队列。

三、坐标映射:先校准再进GUI

触控IC返回的是ADC原始值(如0~4095),屏幕是像素坐标,不映射点哪偏哪。

typedef struct{

   int raw_min_x, raw_max_x;

   int raw_min_y, raw_max_y;

   int w, h;

} tp_cal_t;


void tp_map_to_screen(tp_cal_t*c, int rx,int ry,int*px,int*py){

   *px = (rx-c->raw_min_x)*(c->w)/(c->raw_max_x-c->raw_min_x);

   *py = (ry-c->raw_min_y)*(c->h)/(c->raw_max_y-c->raw_min_y);

   *px = clamp(*px,0,c->w-1);

   *py = clamp(*py,0,c->h-1);

}

横竖屏切换X/Y互换,镜像反了查驱动IC的扫描方向位。 出厂做4点/9点校准,存Flash。

四、命中判断交给GUI树,不写死像素

LVGL这类框架自带容器树,触摸坐标转成screen坐标后递归命中:

bool btn_hit(lv_obj_t*btn,int x,int y){

   lv_area_t a; lv_obj_get_coords(btn,&a);

   return x>=a.x1 && x<=a.x2 && y>=a.y1 && y<=a.y2;

}


void ui_post_touch(int x,int y){

   lv_indev_data_t d={0};

   d.point.x=x; d.point.y=y;

   lv_indev_drv_feed(&indev_drv, &d);   // LVGL自己派发事件

}

别在主循环里写一堆if(x>10&&x<150&&y>...),改布局就崩。

五、响应反馈:只刷脏区,绑VSync

点击反馈最忌全屏重绘:

fillScreen()在SPI屏上动辄几十ms

按钮按下只重画按钮矩形

滑块拖动只重画滑块轨道旧位置+新位置

动画走LVGL timer,别在输入回调里循环画

void btn_press_fb(lv_obj_t*btn){

   lv_obj_add_state(btn,LV_STATE_PRESSED);   // 只标脏

}

/* LVGL刷新线程在VSync到来时合成脏区送出 */

显示控制器用VSync统一提交,触控反馈和画面刷新同帧出,才不会“手指动了画面慢半拍”。

六、报点率与刷新率同步

触控采样率和屏刷新率不是一回事,但必须相位对齐:

60Hz屏配120Hz报点:每帧两次采样,滑动更跟手

TDDI芯片在Vblank窗口扫触控,抗显示耦合噪声

Long-H模式可在行消隐里穿插触控扫描,报点率可高于刷新率

两者完全异步不 Sync → 快速滑动断触、轨迹跳点

嵌入式MCU侧没硬件TDDI,也要保证:触控任务周期 ≤ 显示帧周期一半,否则丢点。

七、低延迟几条硬规矩

触控中断只入队,不渲染

输入线程优先级高于GUI主循环

坐标必须校准映射,横竖屏重算

按下/抬起/移动分开事件,滑动才跟手

反馈只标脏区,禁止fillScreen全清

VSync统一提交,别随便自己刷GRAM

动画/去抖放GUI层,别阻塞输入线程

多点触控按slot管理,别只存最后一个点

八、落坑清单

中断里直接画按钮→卡触控采样

原始ADC值当像素用→点哪偏哪

每次响应fillScreen→SPI屏卡成PPT

横屏切换不换X/Y→坐标镜像反

报点80Hz屏刷新120Hz→偶尔断触

输入任务和渲染同优先级→事件排队

滑动只发PRESSED不发MOVE→拖不动

校准值写死不复测→换屏必偏

VSync没接→触控先响画面后到

多点只记单点→双指缩放失效

九、落地顺序

Touch IC中断出队,原始坐标进input线程

线性校准映射成屏幕坐标

GUI框架接管命中分发,业务只写回调

按下/移动/抬起分事件

反馈动作只改控件状态,标脏区

显示层VSync合成提交

报点周期对齐帧周期(60Hz屏配≥120Hz报点)

逻辑示波器抓“触碰→像素变化”时延调优

触控低延迟不是把采样率堆到960Hz就完事,链路每一段都在吃时间:中断处理、坐标映射、事件分发、脏区合成、VSync送显。 工程里最划算的优化通常是三件事——中断里别画界面、坐标先校准、只刷脏区同帧提交。TDDI把触控和显示时序收进一颗芯片只是硬件兜底, 软件侧把“事件”和“渲染”解耦开,消费电子触控跟手感才稳;剩下几毫秒才是采样率和高刷屏的边际收益。



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭