- 博客(63)
- 收藏
- 关注
原创 Linux驱动:UART串口通信、GT9147触摸屏与IIO-ADC驱动开发
本文基于i.MX6ULL平台,梳理UART串口通信、GPS、RS485+Modbus、GT9147电容触摸屏、TSlib校准以及IIO子系统ADC驱动的完整开发要点,同时包含开机自启动配置、AI辅助嵌入式开发的实战经验。
2026-10-20 18:22:37
194
原创 Linux驱动:Framebuffer显示与多传感器综合驱动开发
在嵌入式Linux项目中,显示驱动和各类外设传感器驱动是项目的重要组成部分。本文基于i.MX6ULL平台,讲解Framebuffer LCD显示框架、图形文字绘制,以及DS18B20、HC-SR04等传感器驱动开发、调试思路,同时梳理多线程采集方案与项目、面试要点。
2026-10-20 18:15:55
128
原创 Linux驱动:SPI子系统与ADXL345三轴加速度传感器驱动开发
SPI是嵌入式里常用的高速同步串行总线,和I2C形成很好的互补。本文基于i.MX6ULL平台,梳理SPI子系统架构、通信特点,并完整讲解ADXL345三轴加速度传感器从硬件、设备树配置到内核驱动、上层测试的开发流程。
2026-10-20 18:08:46
184
原创 Linux驱动开发:DHT11与I2C子系统传感器驱动
本次直播先完成DHT11单总线温湿度传感器驱动编写、并发保护优化,随后系统学习I2C协议原理、Linux内核I2C子系统分层架构,以LM75温度传感器作为实战案例,覆盖用户态I2C访问、内核I2C设备驱动开发、通信调试,同时拓展各类I2C传感器的应用场景。
2026-10-19 19:48:38
147
原创 Linux驱动开发:中断、资源保护与Input输入子系统实战
本次直播围绕按键驱动项目,依次讲解阻塞IO与等待队列、中断顶底半部、并发资源保护、内核定时器延时,最后学习Input输入子系统,结合Platform总线、设备树完成整套输入设备驱动开发。
2026-10-19 19:40:23
376
原创 Linux驱动开发:Pinctrl、GPIO子系统与Platform总线实战
本次直播从pinctrl、GPIO内核子系统入手,讲解如何替代底层寄存器硬编码简化驱动,逐步过渡到Platform虚拟总线架构,结合LED、蜂鸣器、按键实例,梳理驱动开发演进路线、常见调试问题与整体学习规划。
2026-10-19 09:19:23
284
原创 Linux驱动开发:Misc混杂设备与设备树实战
本次直播从蜂鸣器misc驱动入手,讲解混杂设备简化字符设备驱动的实现方式,引出Linux驱动最核心的设备与驱动分离思想,最后系统学习设备树语法、文件结构、OF接口与完整开发流程。
2026-10-19 09:10:43
623
原创 Linux 驱动开发实战:从手写 LED 字符设备驱动到设备树
学习Linux驱动,LED是经典入门案例。本文从最基础的硬编码寄存器字符设备驱动,过渡到设备树+platform平台驱动,完整梳理IMX6ULL上的实现思路,理解软硬件解耦思想。
2026-10-13 21:03:56
240
原创 Linux字符设备驱动:LED驱动实战开发
本次课程从硬件电路分析出发,完成LED字符设备驱动完整开发,讲解寄存器配置、内核地址映射、设备树冲突处理等实战要点。
2026-10-13 20:33:22
346
原创 i.MX6ULL嵌入式Linux系统移植实战博客
Linux移植的核心就是四大文件:U-Boot、zImage、DTB、rootfs;记住完整的从上电BootROM→U-Boot→内核→根文件系统启动流程。虚拟机双网卡是网络启动的基础,NAT负责上网,桥接网卡和开发板组网。U-Boot环境变量是移植调试的核心,bootcmd和bootargs是网络启动的关键。TFTP下载内核设备树 + NFS挂载根文件系统的模式三,是Linux驱动开发阶段最高效的调试方案,免去反复烧录SD卡。
2026-10-07 18:51:26
442
原创 i.MX6ULL 裸机开发|GT9147 触控 + SPI 与 ADXL345 加速度传感器驱动
本篇继续 i.MX6ULL 裸机外设驱动学习,从电容多点触控芯片 GT9147/GT9151,再到 SPI 通信协议、ECSPI 控制器配置、ADXL345 三轴加速度传感器完整驱动,覆盖硬件原理、引脚配置、寄存器操作、代码实现与调试踩坑,打通 I2C 触控与 SPI 高速外设开发两条链路。ADXL345 是三轴加速度计,测量 X/Y/Z 三个方向加速度,可以检测姿态、震动、自由落体;支持量程:±2g、±4g、±8g、±16g;内置 ADC,13 位分辨率;开发板使用 ECSPI3 总线通信。
2026-10-07 14:06:46
301
1
原创 i.MX6ULL 裸机开发|PWM 背光、ADC 模数采集
ADC 全称模数转换器(Analog-to-Digital Converter),作用是把连续变化的模拟信号(电压)转换成离散的数字信号。现实世界的物理量(光照、温度)是模拟量,传感器先把物理量转换成模拟电压;单片机 / SoC 只能识别数字 0、1,需要 ADC 完成转换,软件才能读取、计算该物理量。基准电压((V_{ref}))是 ADC 转换的参考标尺,ADC 所有电压计算都以这个电压作为上限。ADC 能够测量的输入电压范围一般是0 ~ Vref。
2026-09-28 18:23:32
492
原创 i.MX6ULL 裸机开发|LCD (eLCDIF) 显示驱动
RGB LCD 裸机开发分为三层:时钟层(Video PLL + 多级分频)、eLCDIF 控制器寄存器层、显存 / 图形应用层。时序参数(前后肩、同步脉冲)、信号极性是 LCD 驱动最容易出错的地方。乒乓缓存双缓冲是图形显示常用优化手段,解决画面撕裂问题。另外区分开 LCD 显示驱动和 I2C 触摸驱动,二者硬件相互独立,不要混淆。
2026-09-27 20:23:16
194
原创 i.MX6ULL 裸机开发|I2C(2)
I2C 开发不只是看懂时序波形,更要关注工程上的各种边界场景:跨页写、NACK 应答时机、总线死锁、多字节地址兼容。驱动分层封装是嵌入式工程规范:底层 I2C 只负责总线收发;AT24C02、LM75 这类外设单独写应用驱动。同时要留意 Cortex-A7 的 FPU,裸机开发做浮点计算必须手动开启,否则程序直接崩溃。
2026-09-27 20:15:41
181
原创 i.MX6ULL 裸机开发 — I2C (IIC) 通信与 AT24C02 驱动
I2C 是嵌入式里非常经典的同步串行总线,大量用于 EEPROM、传感器等芯片间低速通信。本次课程从协议底层原理、GPIO 电气模式,再到 AT24C02 硬件接线、寄存器配置、驱动代码编写、调试手段完整串联,打通 I2C 从理论到裸机代码实现的全链路。AT24C02 是常用 I2C 接口掉电保存存储器容量:2Kbit,换算为 256 字节;存储芯片标注容量单位常为 bit。页写机制:一页 8 字节,连续写入如果跨页,数据会循环覆盖丢失;写数据时要注意页边界限制。
2026-09-23 17:32:23
437
原创 i.MX6ULL 裸机开发|UART 串口通信
IOMUX 引脚复用 → UART 模块时钟配置 → 寄存器初始化、波特率配置 → 封装底层字符收发接口 → 移植 stdio 标准库,支持 printf 格式化打印 → Makefile 编译 → SD 卡烧录 → 串口助手上位机交互。整套流程完整覆盖硬件引脚、时钟、寄存器、裸机 C 代码、工程编译链接,是 i.MX6ULL 裸机开发中非常经典的外设实践项目,面试高频考点。
2026-09-22 18:23:52
593
1
原创 i.MX6ULL 裸机开发:时钟树与定时器
时钟树是所有外设运行的根基,i.MX6ULL 裸机开发必须先完成 CCM、PLL、PFD、时钟根的配置,再使用定时器外设验证时序。EPIT 侧重周期性中断,GPT 侧重精准延时与信号采集 / PWM 输出,二者应用场景不同,是嵌入式时序开发中最常用的两个定时器。
2026-09-21 18:14:58
516
原创 ARM Cortex-A7 中断系统|GIC、中断底层原理与代码
在嵌入式开发中,按键检测是入门外设,但很多人只会写轮询代码,很难理解为什么轮询会丢按键、中断到底解决了什么问题。本次直播从按键轮询的缺陷入手,完整梳理了 ARM Cortex-A7 平台中断整套体系:从 GIC 通用中断控制器、CP15 协处理器、异常向量表,到中断嵌套、模块化代码封装、按键抖动处理,同时涉及 C 语言底层特性和内嵌汇编,是嵌入式底层非常核心的知识模块。
2026-09-20 19:04:32
484
1
原创 i.MX6ULL 裸机开发进阶|C 驱动、SDK、BSP 工程、链接脚本
承接上一篇 ARM 汇编点灯,本篇从 C 语言寄存器操作,进阶到结构体寄存器映射、NXP SDK、蜂鸣器驱动、BSP 工程管理、Makefile 高级用法与链接脚本,适合期末复习与面试。学习主线:C 直接操作寄存器 → 结构体封装寄存器 → SDK 库简化开发 → 外设驱动实战 (LED + 蜂鸣器) → BSP 工程规范 + Makefile 优化 + 链接脚本与 BSS 段处理。
2026-09-20 19:02:55
502
1
原创 # ARM 裸机开发|ARM 汇编 + C 混合编程 + i.MX6ULL 点灯实验
本章节从 ARM 汇编基础、汇编 C 混合编程机制,过渡到 i.MX6ULL Cortex-A7 裸机环境搭建,最后完成裸机点灯完整工程。内容覆盖寄存器、指令集、异常向量表、启动代码、GPIO 硬件配置、交叉编译、烧录调试,是嵌入式 ARM 裸机入门核心内容。ARM 汇编基础 → 汇编 C 混合编程规范 → 启动代码与异常向量 → i.MX6ULL 硬件架构 → 裸机点灯实验(汇编实现 + 编译烧录)
2026-09-20 18:53:35
280
1
原创 ARMv7A汇编学习笔记|写裸机启动代码到底学什么
ARM 芯片上电复位,CPU 最先跑汇编启动代码。C 语言不能直接裸机跑,汇编要把 C 运行需要的基础环境全部搭好:伪操作是指导汇编器如何组织程序,不会生成机器码。表格:加 s 会更新 cpsr 状态标志位 (n/z/c/v)移位:逻辑左移,逻辑右移,算术右移,循环右移,扩展右移(无移位数量)移位量立即数范围 0‑31示例:2、add 加法示例3、sub 减法语法格式和 add 完全一致,做减法运算。arm32 位指令编码空间有限,算术指令里面的立即数不是随便写。12 位立即数判
2026-09-18 09:25:42
418
1
原创 嵌入式系统核心基础:从处理器到内存布局的全面梳理
嵌入式:以应用为中心,以计算机技术为基础,软硬件可裁剪的专用计算机系统。按需定制:功耗、体积、环境、稳定性、可靠性,都是设计指标。表格缩写全称定位特点CPU中央处理器通用计算通用强大处理器GPU图形处理器图形渲染并行图像处理FPU浮点运算单元浮点计算专门处理小数运算NPU神经网络处理器AI 计算深度学习专用MPU微处理器通用型偏向复杂处理(跑 Linux)MCU微控制器集成度高偏向控制(51、STM32)DSP数字信号处理器信号处理。
2026-09-17 09:39:51
634
原创 DS18B20 单总线数字温度传感器
DS18B20 是单总线(1-Wire)数字温度传感器。只需要一根数据线就完成通信,可以配置 9-12bit 分辨率,还可以在芯片内部设置温度上下阈值。💡 单总线特点:一根 DQ 信号线,既做输入,又做输出。GND:电源地,接单片机 GNDDQ:单总线通信引脚,本案例接单片机 P37VCC:电源引脚。
2026-09-16 18:44:44
417
原创 C52 单片机 UART 串口
我发 (TXD) 给你收 (RXD),我收 (RXD) 听你发 (TXD)。51 常用 11.0592 晶振!专门为串口,算出来 TH1 是整数,没有误差。SBUF:发送接收共用同一个名字寄存器,写 SBUF=xxx 代表发送;发送完 8 个数据,拉高是停止位,代表一帧结束。通信传的是电压差值,如果 GND 不共地,两边基准电压不一样,直接乱码。6T 模式:定时器溢出率 = SYSclk /6 / (256‑TH1)模式 1:8 位数据,无奇偶校验,依靠定时器 1 充当波特率发生器。代表读取收到的数据。
2026-09-14 09:20:14
260
原创 中断与定时器中断
上一篇的轮询模式,CPU 被绑在while(1)里不停查询。本篇引入中断,让硬件主动通知 CPU;再重点讲最常用的内部中断——定时器中断,实现非阻塞的精准定时。CPU 正在执行主程序,某个紧急事件向 CPU 发来请求信号。CPU 立刻暂停当前代码、保存现场,跳转到专门写好的中断服务函数处理;处理完恢复现场,回到刚才的位置继续执行。类比:你在看书(while(1)),手机响了(中断)。放下书,标记读到第几页(保护现场)接电话处理(中断服务函数)挂断,翻回标记继续看(恢复现场)核心优势。
2026-09-11 18:05:32
319
原创 单片机基础:LED、数码管、按键(轮询版)
在学习中断之前,我们先要掌握单片机最基础外设,全部用轮询方式实现。轮询:CPU 在while (1)循环里不停主动查询引脚状态,没有中断,所有任务排队执行。这是中断学习前必须吃透的基础。上面 LED、数码管、按键全部是轮询,这是中断之前的编程思想:✅ 优点:逻辑简单,上手快,容易理解硬件 IO 操作阻塞延时会占用 CPU,CPU 空等,利用率极低CPU 必须不停主动查询外设,事件响应受循环代码影响任务一多,数码管刷新、按键扫描、LED 闪烁互相干扰,容易卡顿。
2026-09-11 18:04:22
200
原创 Linux 系统编程 :select/epoll 多路复用与 SQLite 数据库实战
select 实现简单但有 fd 数量上限、需用户态遍历;epoll 由内核维护事件表、支持 ET 模式,是高并发场景的首选。SQLite:轻量级关系型数据库,支持标准 SQL 语法,通过三个核心 API 即可在 C 语言中完成大部分数据库操作。回调机制的查询回调是理解 SQLite C 接口的关键,每行数据触发一次回调,通过value[]和name[]获取列值与列名。掌握这两块内容,你就具备了编写高并发网络服务和本地数据持久化程序的基础能力,继续加油!
2026-09-04 19:18:58
995
原创 Linux 网络编程:IO 多路复用
集合中只要至少一个 fd 产生事件,select 就解除阻塞。多线程可以实现 TCP 并发:每来一个客户端,就创建一个子线程专门处理该客户端通信。epoll 把事件表放在内核,不需要每次调用都拷贝全部 fd,适合高并发海量连接。没有数据的时候,CPU 把任务挂起,任务不占用 CPU,等待数据就绪后再返回。缺点:一个线程只能处理一个 IO,无法同时处理多个连接。,预先创建一批线程,复用线程,避免频繁创建销毁线程。缺点:信号处理框架不好控制,实际网络开发很少用。缺点:CPU 空转,消耗大量 CPU 资源。
2026-09-03 18:58:32
517
原创 网络基础复盘:TCP 粘包、TCP/UDP 对比与 HTTP 协议
没有天然的数据边界。发送方多次 send 的数据,内核缓冲区会把数据合并,接收方 recv 的时候,一次读到多段数据,这就是粘包。不用安装客户端,只要浏览器;HTTP:超文本传输协议,规定浏览器和服务器之间数据传输格式。⚠️ 只有 TCP 有粘包,UDP 自带报文边界,不会粘包。特殊情况:被动方没有剩余数据,2、3 步合并,四次挥手变成。TCP 头部默认 20 字节,选项部分会变长。目的:协商双方收发序列号,确认收发能力正常。❌ 缺点:全部依赖网络,断网无法使用。✅ 优点:本地资源,加载快,离线可用。
2026-09-02 18:15:16
581
原创 TCP/UDP 网络编程笔记
TCP 客户端流程socket() 创建套接字connect() 连接服务器send()/recv() 收发数据close() 关闭TCP 服务端流程socket() 创建套接字bind() 绑定本机 IP 端口listen() 开启监听accept() 阻塞等待,拿到客户端通信 fdsend()/recv() 使用新 fd 收发数据close()
2026-09-01 21:00:39
457
原创 网络基础与 UDP 套接字编程
UDP 服务器创建 udp 套接字填充本机 IP 端口bind()绑定端口recvfrom()等待接收客户端消息sendto()回复消息close 关闭 fdUDP 客户端socket()创建套接字填充目标服务器sendto()发送数据(客户端不用 bind,操作系统自动分配端口)recvfrom()接收服务器应答closeUDP 没有 listen、accept、connect。
2026-08-31 18:49:01
535
原创 Linux 进程间通信(IPC):信号、消息队列、共享内存与信号量详解
机制核心 API特点典型用途信号alarmkill异步通知,非数据传输定时、进程控制消息队列msggetmsgsndmsgrcvmsgctl按类型收发,有格式要求结构化消息传递共享内存shmgetshmatshmdtshmctl速度最快,无同步机制大数据量高频读写信号量semgetsemctlsemop计数器,做锁互斥与同步理解这些 IPC 机制,是掌握 Linux 多进程协作的关键。建议结合代码练习,重点体会共享内存与信号量的配合使用。
2026-08-30 22:26:30
702
原创 Linux 进程间通信学习笔记
无名管道只能亲缘进程;有名管道 FIFO 任意进程都能用。写管道,但是所有读端全部关闭 → SIGPIPE 信号,进程直接死掉。写代码必须注意。信号是异步!进程不知道信号什么时候来。9、19 号信号不受程序控制。pipe 创建出来两个 fd,fork 之后子进程会复制文件描述符,父子各持有读写两端,记得不用的一端 close 关闭。pause 会一直睡,只有信号到来才会解除阻塞。
2026-08-29 08:58:21
626
原创 Linux 多线程:互斥锁 &; 信号量
保证同一时间只有一个线程进入临界区。把 “读‑改‑写” 这种非原子操作包装成整体,防止并发修改把共享数据改乱;同时保证本线程修改后,其他线程可以看见最新数据,解决并发下数据一致性问题。,CPU、内存、缓冲区都可以当作资源。资源有限,信号量只支持:初始化、销毁、申请资源、释放资源;可以用来控制线程执行先后顺序,也可以实现互斥。死锁:多线程使用多把锁,所有线程互相等待对方持有的锁,全部卡住,程序不再往下运行。✅好处:把非线程安全代码变成线程安全,避免脏读、更新丢失;一个进程可以定义任意多把互斥锁。
2026-08-27 18:33:59
392
原创 Linux 系统编程 - 线程基础
attr 只是模板,创建线程之后再修改 attr,对已经运行的线程无效;destroy 销毁属性对象,不影响已经创建好的线程。主线程 scanf 接收键盘输入,修改全局变量;子线程循环检测状态,状态改变只打印一次。overwrite:非 0 覆盖旧值;等于 0,已经存在就不修改。,线程没结束,main 就卡在这一行不动。注意:在线程中不要使用。
2026-08-26 19:05:11
635
原创 Linux 进程管理详解:从概念到实战
进程是程序动态执行的过程,拥有独立的虚拟地址空间。Linux 通过时间片轮转实现宏观并行、微观串行。fork()创建子进程时采用写时复制技术,兼顾效率与隔离。掌握pstopkill等命令是日常进程管理的基础。
2026-08-25 18:44:12
426
原创 深入理解 Linux 文件 IO 与目录 IO:系统调用与库函数的本质区别
文件 IO是底层系统调用,直接与内核交互,适合需要精细控制的场景标准 IO是高层库函数,提供缓冲和便捷接口,适合普通应用开发目录 IO提供了遍历文件系统的标准方法,是许多工具和应用程序的基础掌握这些系统调用,不仅能编写更高效的程序,还能深入理解 Linux 系统的工作机制。
2026-08-23 23:15:34
395
原创 C语言文件操作函数详解:fputs/fgets/fprintf/fread/fwrite/fseek
每次读最多 1024 字节,读到多少就写多少,直到。获取当前文件指针相对于文件开头的字节偏移。把格式化后的字符串写入文件流。,直接把文件指针回到文件开头。修改文件读写指针偏移量。从流读取一行字符串。
2026-08-21 18:56:03
598
原创 Linux 基础与 Shell + 标准 IO
今天是第25天,接上一部分 Linux Shell 基础,补充 shell 循环、数组、函数,然后进入 C 语言标准 IO 文件操作,fopen/fclose、缓冲区、字符读写接口,这是 Linux C 开发文件操作的基础。
2026-08-20 18:44:56
418
原创 Linux 基础与 Shell 命令
今天是第24天,前面一直在写 C 语言和数据结构,今天转回 Linux 系统编程基础。Linux 是嵌入式 C 开发的主战场,内核、shell、常用命令、简单 shell 脚本,都是日常写代码、调试、编译必不可少的基本功。shell 脚本语法对空格极其敏感,if[]条件前后必须留空格。脚本写完一定要加执行权限chmod +x,否则不能./运行。重定向和>>不要搞混,会直接清空原有文件。rm -rf谨慎使用,没有回收站,删除无法恢复。
2026-08-19 18:52:06
648
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅