本文基于i.MX6ULL平台,梳理UART串口通信、GPS、RS485+Modbus、GT9147电容触摸屏、TSlib校准以及IIO子系统ADC驱动的完整开发要点,同时包含开机自启动配置、AI辅助嵌入式开发的实战经验。
一、UART串口通信体系与GPS模块开发
串口是跨设备通信最常用的接口,和并行、I2C、SPI有着明确分工。并行通信单次传输多位,带宽高但引脚占用多;I2C适合板内低速外设,节省引脚;SPI适合板内高速外设;UART主打不同硬件之间的远距离通信。
电平标准分为TTL、RS232、RS485。TTL为3.3V/5V板间短距离通信;RS232单端信号,抗干扰弱;RS485差分信号,抗干扰能力强,适合工业场景,属于半双工通信。UART帧结构包含起始位、数据位、校验位、停止位,由片上UART控制器自动生成时序。
GPS模块(ATGM336H)使用UART输出NMEA协议文本,硬件交叉接线:模块TX接开发板RX、模块RX接开发板TX。常用参数9600N81,需要在室外才能正常搜星定位,解析GNGGA报文即可提取经纬度。Linux内核自带UART驱动,设备树节点设置status = "okay"后生成ttymxc系列设备节点,应用层直接按文件读写操作串口。
RS485一般跑Modbus RTU主从协议,数据包包含从站地址、功能码、数据区、CRC校验;03、04功能码用于读寄存器,10功能码用于批量写寄存器,一条总线最多挂载32个从设备。
二、AI辅助嵌入式开发与项目扩展
Cursor是嵌入式开发高效工具,支持直接操作工程文件、运行代码调试。使用时提示词要写清三点:需求、接口参数、当前项目上下文,内置多款国产大模型可按需切换。
项目拓展思路:读取GPS经纬度之后,可以通过Socket把坐标上传,调用地图API回显图片,在LCD屏幕上展示定位画面。
三、驱动模块开机自启动
简单的开机自动加载驱动方案:在/etc/profile脚本中添加insmod命令。系统启动过程会自动执行该脚本,上电即可加载指定.ko驱动,适合触摸屏这类必须开机生效的驱动。
注意:该方式简单直接,适合调试阶段使用。
四、GT9147 I2C电容触摸屏驱动与TSlib校准
GT9147是I2C接口电容触摸芯片,依托Linux I2C子系统+Input输入子系统开发。
设备树配置要点:挂载到对应I2C总线,配置中断引脚INT、复位引脚RST为GPIO,填写compatible = "goodix,gt9147"和正确从机地址。驱动基于i2c_driver框架,probe函数完成资源申请、硬件复位、中断注册;触摸触发中断后,在底半部读取坐标,调用input_report_abs上报X/Y坐标与触摸按键事件,内核生成/dev/input/eventX事件节点。
原始触摸坐标存在偏移,需要移植TSlib库做五点校准。交叉编译TSlib源码,部署库文件,在/etc/profile配置TSlib相关环境变量,指定设备节点和校准文件。校准后的坐标可以直接供给LVGL图形库使用,是GUI界面的基础。
五、ADC模数转换驱动(IIO子系统)
ADC实现模拟量转数字量,DAC反之。传感器链路:物理量→模拟电信号→调理电路→ADC→数字数据。
ADC三大核心指标:
- 量程:i.MX6ULL内置ADC量程0~3.3V,超量程需要电阻分压;
- 分辨率:12位ADC输出范围0~4095,3.3V下单步约0.8mV;高精度场景选用ADS1115等16位外部ADC;
- 采样速率:遵循奈奎斯特采样定理,采样频率至少为信号最高频率2倍。
Linux中ADC归类为IIO(Industrial I/O)工业IO子系统,采用Platform总线。内核打开Industrial I/O support配置项,设备树把引脚复用为ADC功能,配置通道。驱动加载后在/sys/bus/iio/devices/iio:device0提供文件接口:读取in_voltage0_raw得到原始值,读取scale,实际电压 = 原始值 × scale。
ADC采集容易受噪声干扰,常用中值滤波、低通滤波、卡尔曼滤波等算法稳定数据;高速变化信号单纯Linux内核驱动难以满足,可考虑FPGA方案。
六、后续学习路线
ADC之后将进入LVGL图形界面开发,结合Framebuffer显示、TSlib触摸校准,把之前调试完成的各类传感器数据、GPS定位信息整合到GUI界面,完成整套嵌入式综合项目。