自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(65)
  • 收藏
  • 关注

原创 嵌入式学习 day69-70:Framebuffer 显示、DS18B20 温度传感器与 HC-SR04 超声波测距

Framebuffer 是 Linux 提供的图形显示接口,内核把屏幕显存映射到用户空间,应用程序直接写显存就能显示图像。/dev/fb0原理:写显存 → 屏幕显示模块核心映射显存,写像素显示图像DS18B20单总线协议,自旋锁保护时序,温度 =HC-SR04GPIO 触发 + 双边沿中断计时,距离 =时间 / 58三者结合,可以做出一个带显示的温度/距离测量仪。Framebuffer 负责显示,传感器驱动负责采集数据,应用层负责整合。

2026-10-16 16:41:18 228

原创 嵌入式学习:Linux驱动开发总结

xxx_read 里 wait_event_interruptible → 进程睡眠。#include <linux/xxx.h> // 总线头文件。9. 写匹配表(of_device_id + xxx_device_id)匹配表(of_device_id + xxx_device_id)2. 选框架(platform / i2c / spi)1. 确定总线类型(GPIO / I2C / SPI)操作函数(read / write / ioctl)应用层:open("/dev/xxx")

2026-10-15 16:45:00 291

原创 嵌入式学习 day68:驱动——SPI总线

前面已经学习过SPI了。SPI(Serial Peripheral Interface)是一种高速串行通信总线,和 I2C 类似,但速度更快,适合 Flash、屏幕、传感器等设备。部分作用spi_device描述 SPI 从设备描述一次 SPI 传输描述一次完整的 SPI 消息简单读写spi_sync同步执行复杂传输注册 SPI 驱动compatible设备树匹配SPI 驱动的框架和 platform、I2C 一样,只是总线 API 不同。掌握一种,其他就是换 API。

2026-10-14 15:39:03 211

原创 嵌入式学习 day67:DHT11 温湿度传感器和 LM75 温度传感器

DHT11 是一个温湿度传感器,用单根数据线通信(单总线协议)。测量范围:温度 0~50°C,湿度 20~90%RH。数据格式:一次传输 40 位(5 字节)。第 1 字节:湿度整数。第 2 字节:湿度小数(DHT11 恒为 0)。第 3 字节:温度整数。第 4 字节:温度小数(DHT11 恒为 0)。第 5 字节:校验和(前 4 字节之和)。LM75 是一个I2C 接口的温度传感器。接口:I2C(两线:SCL、SDA)。从机地址:0x48~0x4F(可配置)。温度寄存器。

2026-10-13 17:46:30 128

原创 嵌入式学习 day66:中断下半部、工作队列与内核定时器

Linux 把输入设备(键盘、鼠标、触摸屏、按键)统一管理,称为input 子系统。应用程序通过读取输入事件,不用自己写驱动接口。知识点内容上下半部上半部快,下半部慢tasklet中断上下文,不能睡眠工作队列进程上下文,可以睡眠input 子系统统一管理输入设备,上报事件内核定时器延时执行函数核心思想:中断处理函数要快,耗时操作放到下半部。tasklet 用于短小操作,工作队列用于耗时操作,input 子系统用于输入设备,内核定时器用于延时执行。

2026-10-13 09:37:08 177

原创 嵌入式学习 day65:Linux驱动进阶——pinctrl 子系统和 platform 驱动框架

要点说明位置&iomuxc节点内部引脚宏定义在设备节点引用作用自动配置复用寄存器和电气属性寄存器驱动里只配 GPIO 方向和数据。

2026-10-10 17:53:13 222

原创 嵌入式学习 day64:字符设备驱动

/ 点亮// 熄灭misc是简化版的字符设备驱动主设备号固定为 10。不需要cdev_alloccdev_add。不需要。用一步完成注册。实验核心内容GPIO 操作ioremapreadlwritel数据拷贝自动创建设备节点并发控制mutexsysfs 调试__ATTR结构体封装kmalloc+ 结构体设备树of_iomapmisc 设备一步注册蜂鸣器和 LED 框架一样,换 GPIO。

2026-10-09 18:39:24 305

原创 嵌入式学习 day63:字符设备驱动

驱动分类:字符设备、块设备、网络设备编译方式:编译进内核或编译成模块(.ko)核心概念:设备号、cdev、file_operations、设备文件四个函数led_openled_readled_write入口四步:申请设备号 → 申请 cdev → 填充 fops → 添加 cdev出口调试pr_infodmesg使用insmod加载、mknod创建设备文件、rmmod卸载。

2026-10-08 18:27:13 179

原创 嵌入式学习 day61-62:IMX6ULL驱动——系统移植

双网卡配置:Ubuntu 需要同时满足上外网和与开发板通信两个需求。NAT 模式负责上外网,桥接模式负责与开发板连接,桥接必须桥接到有线网卡。tftp 服务器:用于开发板从 Ubuntu 下载内核镜像和设备树文件,管理目录为。nfs 服务器:用于开发板挂载 Ubuntu 的根文件系统,共享目录为,实现 Ubuntu 与开发板之间的文件实时同步。交叉工具链:PDF 指定的是 gcc-linaro-4.9.4,用于在 x86 平台上编译能在 ARM 平台运行的代码,是驱动开发和应用程序编译的基础。四个核心文件。

2026-10-07 17:29:59 200

原创 嵌入式学习 day60:ARM汇编——触摸屏与SPI

GT9147电容触摸屏控制器,通过 I2C 通信引脚:I2C2(SDA、SCL)、GPIO1_IO09(中断)、GPIO5_IO09(复位)初始化:复位 → 读设备 ID → 配中断 → 进入读坐标模式中断处理:读触摸点数量 → 读坐标 → 清中断标志坐标格式:每点 4 字节,X 低、X 高、Y 低、Y 高SPI同步串行通信,四根线(SCLK、MOSI、MISO、SS)全双工:收发同时进行寄存器。

2026-09-29 16:47:52 290

原创 嵌入式学习 day59:ARM汇编——PWM与ADC

PWM周期 + 占空比:用数字信号模拟模拟量寄存器:PWMCR(控制)、PWMPR(周期)、PWMSAR(占空比)占空比公式占空比 = PWMSAR / PWMPRFIFO:4 个 FIFO,中断里填充,保证 PWM 连续输出用途:调光、调速、舵机ADC模数转换:把模拟电压转成数字量寄存器:HC(控制)、HS(状态)、R(结果)、CFG(配置)、GC(通用)12 位分辨率:0~4095 对应 0~3.3V电压公式电压 = 数字值 / 4096 × 3.3校准:上电后要校准。

2026-09-28 18:20:07 197

原创 嵌入式学习 day58:ARM汇编——LCD显示

LCDIF 控制器:自动从显存读数据,输出到屏幕显存:一块内存,每个像素 4 字节(ARGB8888)时序参数:VSPW、VFP、VBP、HSPW、HFP、HBP,要和屏幕匹配初始化流程:引脚 → 时钟 → 复位 → 配参数 → 使能 → 填显存显存访问:数组指针pF[i][j]或手动算偏移背光:GPIO1_IO08 控制。

2026-09-27 18:36:07 189

原创 嵌入式学习 day57:I2C读操作与LM75BD温度采集

I2C 读要先写后读:先写寄存器地址,重发起始信号,再读数据RSTA位,不用发停止信号,直接再发起始信号应答控制:主机发 ACK 表示继续,NACK 表示结束伪读:读第一个字节前先读一次 I2DR,清空旧数据LM75BD:设备地址 0x48,温度寄存器 0x00,分辨率 0.5°C温度格式:16 位,高 9 位有效,有符号补码温度计算:先转有符号,再右移 7 位,乘以 0.5。

2026-09-24 17:07:59 218

原创 嵌入式学习 day56:ARM汇编——I2C通信

I2C 是同步通信:SCL 时钟线、SDA 数据线,一主多从通信流程:START → 地址+方向 → ACK → 寄存器地址 → ACK → 数据 → ACK → STOP地址格式:7位设备地址 + 1位方向(0=写,1=读)关键寄存器:I2CR(控制)、I2SR(状态)、I2DR(数据)、IFDR(分频)关键标志位:IIF(发送完成,写0清零)、RXAK(应答,0=ACK)、IBB(总线忙)写操作四步:发地址、发寄存器、发数据、发停止。

2026-09-23 18:50:06 140

原创 嵌入式学习 day55:ARM汇编——串口通信

UART 是异步串行全双工通信:TX、RX 两根线,双方波特率必须一致初始化流程:引脚复用 → 软件复位 → 配 UCR2(数据格式)→ 配 UCR3(RXDMUXSEL)→ 配波特率 → 使能 UARTUCR2 配置:8位、1停止、无校验、收发使能、忽略 RTSUCR3 配置:RXDMUXSEL = 1,必须波特率公式波特率 = 参考时钟 / (16 × (UBMR+1) / (UBIR+1))发送:轮询 USR2 的 TXDC 位,就绪后写 UTXD接收。

2026-09-22 17:52:49 171

原创 嵌入式学习 day54:时钟系统与定时器

PLL:倍频,把低频晶振倍频到高频Prescaler:分频,把 PLL 输出降到外设能用的频率PFD:小数分频,比 Prescaler 更灵活I.MX6ULL 的 PLL:7 个 PLL,8 个 PFD(PLL2 和 PLL3 各 4 个)ARM PLL 配置:先切备用时钟、配置倍频、等锁定、切回 PLLEPIT:增强型周期中断定时器,自动重装载,适合做周期中断GPT:通用定时器,可增可减,适合做延时、PWM。

2026-09-21 18:40:29 254

原创 嵌入式学习 day53:ARM汇编——中断

中断流程:外设 → GIC → CPU → 异常向量表 → 中断处理函数GIC 初始化GIC_InitGPIO 中断配置ICR2设触发方式、IMR使能、ISR查状态和清标志IRQ 异常处理函数:保存现场、调用 C 函数、恢复现场返回中断服务函数:判断中断号、检查 ISR、执行操作、清标志VBAR:指定异常向量表基地址。

2026-09-20 17:25:23 98

原创 嵌入式学习 day52:模块化编程

蜂鸣器初始化:引脚复用、电气特性、方向,三步和 LED 一样蜂鸣器控制beep_onbeep_offbeep_nor,操作 GPIO5 的第 1 位模块化:LED 和蜂鸣器各自独立成.c和.h,main 里调用时钟:用打开所有外设时钟,保证 GPIO5 能用。

2026-09-18 19:41:53 224 1

原创 嵌入式学习 day51:启动代码与裸机环境搭建

LED引脚配置:复用、电气特性、方向编译工具链:编译器生成目标文件,连接器合并成可执行文件,格式转换器转成烧录格式,反汇编器用于调试汇编与C互相调用:参数放r0~r3,返回值放r0,被调用者保存r4~r11启动代码:向量表、关中断、切换模式、设置栈、开中断、跳转到硬件初始化。

2026-09-17 18:56:46 131

原创 嵌入式学习 day50:ARM汇编

基本框架area定义段、code32指定指令集、entry指定入口、end结束MOV:赋值,右边可以是立即数或寄存器移位LSLLSR可以作为其他指令的附属操作位操作mvn取反、bic清位、orr置位条件执行subs更新标志位,movgtmovle等条件后缀决定是否执行。有符号用,无符号用循环cmp比较 +b跳转 + 标号函数调用bl跳转并保存返回地址到lrbx lr返回;stmfdldmfd保存和恢复现场;设置栈指针今日感悟:今天开始学ARM汇编,最大的感受是它和C语言的差距。C语言里一句。

2026-09-16 18:00:51 175

原创 嵌入式学习 day49:ARM基础

ARM(Advanced RISC Machine)是一种精简指令集(RISC)架构。对比项51单片机ARM位数8位32位指令集CISC风格RISC精简指令集寄存器数量少多(通用寄存器+状态寄存器)工作模式单一多种模式异常处理简单规范的异常向量表ARM主要用于手机、平板、嵌入式设备,是当前最主流的嵌入式架构之一。异常是打断正常程序执行的事件,包括:中断(IRQ/FIQ)、软中断(SWI)、复位、取指/取数出错、未定义指令等。

2026-09-15 17:32:09 120

原创 嵌入式学习 day48:51单片机——DS18B20温度传感器

今天学了DS18B20温度传感器,核心要点如下:DS18B20是单总线数字温度传感器,一根数据线完成双向通信三种时序:复位、写、读,每个时序都有严格的微秒级要求通信流程:复位 → 0xCC → 0x44 → 等待 → 复位 → 0xCC → 0xBE → 读2字节温度 = 读到的16位数值 × 0.062512位分辨率下转换需要750ms,所以等待时间要够。

2026-09-14 19:02:07 155

原创 嵌入式学习 day47:串口通信

UART(Universal Asynchronous Receiver/Transmitter),即通用异步收发器。它的作用是让单片机和单片机之间、或者单片机和电脑之间进行通信。关键特性特性含义串行数据逐位发送,先发最低位(LSB)再发最高位(MSB)异步通信双方没有共享时钟,靠约定好的波特率来同步全双工有TX和RX两根线,收发可以同时进行今天学了串口通信UART是异步串行全双工通信:3根线(RXD、TXD、GND),双方波特率必须一致串口时序:起始位 + 8位数据位 + 停止位串口配置。

2026-09-12 19:01:15 276

原创 嵌入式学习 day46:51单片机基础——定时器

今天学了定时器定时器是硬件计数器:每经过一个机器周期自动加1,溢出时产生中断定时时间 = (65536 - 初值) × 机器周期:11.0592MHz晶振下,一个机器周期约1.085μs配置步骤:设置TMOD模式 → 赋初值 → 开中断 → 启动定时器必须重新赋初值:否则下次定时的时间会不对中断改状态,主循环做处理:分工明确,各司其职。

2026-09-11 19:03:08 232 1

原创 嵌入式学习 day45:51单片机基础

中断是单片机处理突发事件的一种机制。当某个事件发生时(比如按键按下、定时器溢出),CPU暂停当前正在执行的程序,转去执行对应的处理函数(中断服务函数),处理完之后再回到原来的位置继续执行。今天学了数码管显示、按键输入和外部中断数码管段码表把数字转换成段选信号多位显示靠动态扫描——轮流点亮每一位,利用视觉暂留显示多位数字用%10和/10循环拆位按键按键就是开关,按下为低电平,松开为高电平通过检测引脚电平判断哪个按键按下实际项目需要按键消抖中断中断是CPU响应突发事件的机制。

2026-09-10 18:04:54 131

原创 嵌入式学习 day44:51单片机入门

51单片机是Intel 8051系列的统称,是一种经典的8位微控制器(MCU)。它内部集成了CPU、RAM、ROM、定时器、I/O接口等功能,适合用于嵌入式控制场景。虽然性能不如ARM,但胜在结构简单、资料丰富,是学习硬件开发的绝佳入门选择。学习方法:通过C语言编写程序,控制单片机的I/O口输出高低电平,从而驱动LED灯、蜂鸣器、数码管等外设。今天学了51单片机LED控制单片机编程本质:通过C语言操作寄存器控制硬件引脚的电平状态位运算是硬件控制的基石\|置1、& ~清0、翻转、<<移位P2端口控制。

2026-09-09 18:37:25 190

原创 嵌入式学习 day40:数据库

数据库是对大批量数据进行增删改查管理的软件。它把数据持久化存储在文件中,程序结束后数据依然保留。今天学了数据库基础和SQLite数据库分类关系型(MySQL、SQLite):数据持久化,支持SQL非关系型(Redis):内存存储,速度快SQL语句创建表插入数据查询数据更新数据删除数据ORDER BY排序(ASC升序/DESC降序)LIKE模糊查询(匹配任意字符)SQLite C接口打开数据库执行SQL语句(非查询无需回调,查询需回调函数)关闭数据库回调函数每查一行调用一次,返回0继续、非0终止。

2026-09-04 18:59:02 155

原创 嵌入式学习 day39:TCP并发服务器模型

今天学了TCP并发服务器和IO模型TCP并发服务器多线程模型:主线程accept,子线程处理每个客户端并发量大时可用线程池管理IO模型阻塞IO:效率高,但单线程无法处理多路IO非阻塞IO:不阻塞但轮询浪费CPU信号驱动IO:内核信号通知selectepollselect简单但效率低(O(n)),有数量限制epoll高效(O(1)),无数量限制,支持边沿触发今日感悟多线程模型的好处是每个客户端互不干扰,一个客户端卡住不会影响其他。

2026-09-03 18:39:08 192

原创 嵌入式学习 day38:TCP通信及HTTP协议

TCP是流式协议,数据没有边界。发送端调用多次send(),接收端一次recv()可能收到多包数据,这就是粘包。举个具体例子:c// 发送端连续发送3次// 接收端一次recv,可能收到 "helloworld12345" 全部15个字节// 也可能收到 "hellowor"(10字节),下一次再收 "ld12345"今天学了TCP粘包和HTTP协议TCP粘包TCP是流式协议,数据无边界长度+数据最可靠UDP没有粘包问题HTTP协议基于TCP的应用层协议。

2026-09-02 18:00:28 175

原创 嵌入式学习 day37:TCP通信

今天学了TCP通信TCP特点面向连接(三次握手)可靠传输(确认重传)基于字节流有连接状态管理(四次挥手)服务端流程socket()→bind()→listen()→accept()→recv()send()→close()客户端流程socket()→connect()→send()recv()→close()函数要点listen()将套接字设为监听模式accept()阻塞等待客户端连接,返回新套接字connect()发起连接recv()返回0表示对方已断开。

2026-09-01 19:01:40 194

原创 嵌入式学习 day36:网络基础与UDP通信

协议是通信双方约定的一套标准,比如我们说话用中文,对方也懂中文,才能沟通。网络协议规定了数据怎么打包、怎么传输、怎么解析。今天学了网络基础和UDP通信网络基础TCP/IP四层模型:应用层、传输层、网络层、网络接口层TCP可靠有连接,适合文件传输;UDP快速无连接,适合实时通信IP地址分网络位和主机位,子网掩码区分私有IP不能直接上网(如192.168.x.x)UDP通信创建UDP套接字收端必须bind()绑定端口和IPsendto()发送,recvfrom()接收(可获取发送方地址)htons()

2026-08-31 18:34:13 196

原创 嵌入式学习 day35:进程间通信-消息队列、共享空间及有名信号量

消息队列是有格式的消息传递机制,数据按消息块发送和接收,每个消息可以指定类型。共享内存是进程间通信最快的方式,多个进程直接映射同一块物理内存,数据不需要在内核和用户空间之间复制。信号量本质上是一个计数器,用于控制同时访问共享资源的进程数量。在进程间通信中,信号量通常配合共享内存使用,用来解决多个进程同时读写共享数据的同步问题。今天学了消息队列、共享内存、信号量消息队列ftok()生成键值,msgget()创建队列msgsnd()发送消息,msgrcv()按类型接收消息消息结构体第一个成员必须是。

2026-08-29 18:03:36 201

原创 嵌入式学习 day34:进程间通信

今天学了进程间通信无名管道pipe(fd)创建,fd[0]读、fd[1]写只能用于父子进程等亲缘关系读写端要正确关闭,否则容易阻塞或管道破裂有名管道mkfifo()创建,可用于任意进程必须读写两端同时打开才能继续信号内核发信号给进程,进程可以缺省/忽略/捕捉signal()注册信号处理函数alarm()定时发信号,pause()等待信号今日感悟无名管道只能在父子进程之间通信,因为它依赖fork()复制文件描述符。如果想在两个不相关的进程间传数据,就得用有名管道或消息队列。

2026-08-28 17:38:22 200

原创 嵌入式学习 day33:线程进阶

之前学的线程需要用回收,否则会变成僵尸线程。如果不需要等待线程的返回值,可以把它设为线程结束后系统自动回收资源,不用手动join。属性特点加入(默认)需要回收分离线程结束自动回收,无需join信号量是一种资源计数器,用来控制同时访问共享资源的线程数量。比如限制最多3个线程同时访问某资源。线程分离设置分离属性分离线程结束自动回收,无需join互斥锁加锁,解锁保护临界区,防止资源竞争死锁:多锁加锁顺序不一致导致信号量sem_wait()申请资源,sem_post()释放资源。

2026-08-27 17:58:43 168

原创 嵌入式学习 day32:进程与线程

今天学了waitpidexec函数族和线程waitpid:阻塞等待指定子进程:非阻塞,子进程没结束返回0exec函数族用当前进程执行另一段代码,成功不返回l(列表参数)、v(数组参数)、p(PATH查找)、e(更新环境变量)shell 执行命令就是线程进程是资源分配最小单元,线程是任务调度最小单元线程共享进程的数据区和堆区,只有独立的栈创建,回收编译需加-pthread今日感悟我在写代码时发现,线程的共享数据带来了同步问题,多个线程同时改同一个变量,数据会很混乱。

2026-08-26 18:43:09 175

原创 嵌入式学习 day31:进程与线程

今天学了进程程序 vs 进程:程序是静态文件,进程是动态执行实例PIDgetpid()获取当前进程ID,getppid()获取父进程IDfork():创建子进程,返回0表示子进程,>0表示父进程exit():结束进程,刷新缓冲区、关闭文件wait():父进程等待子进程结束,回收资源,防止僵尸进程孤儿进程:父进程先结束,子进程被 init 收养僵尸进程:子进程先结束,父进程未回收,占用进程表资源今日感悟今天第一次感受到"一个程序可以分成多个进程同时执行"。fork()

2026-08-25 18:40:13 165

原创 嵌入式学习 day30:minilog

MiniLog是一个运行在Linux终端的轻量级日志记录与查询工具,使用C语言和POSIX文件I/O实现。支持写入不同等级日志、查看全部日志、按等级查询、统计数量等功能。lseek()从文件末尾向前移动,统计换行符个数,找到第N个换行符的位置后从那里开始读取并输出。cint i = 0;int fp = 0;return -1;//移动光标至倒数第n行开头break;i++;//防止越界break;//越界判断\n");return -1;

2026-08-24 17:52:19 226

原创 嵌入式学习 day29:文件IO与目录IO

今天学了文件IO和目录IO文件IOopen()打开文件,返回文件描述符(int),失败返回 -1close()关闭文件write()写入数据read()读取数据,返回实际读取字节数,读到末尾返回0lseek()定位偏移量文件描述符0:标准输入、1:标准输出、2:标准错误分配规律:总是取当前最小可用的非负整数目录IOopendir()打开目录,返回DIR *readdir()读取目录项,返回closedir()关闭目录mkdir()rmdir()getcwd()chdir()今日感悟。

2026-08-22 18:26:16 219

原创 嵌入式学习 day28:标准IO进阶

今天学了标准IO的进阶函数字符串读写fputs写字符串(不加换行)、fgets读字符串(保留换行符)格式化读写fprintffscanf,和 printf/scanf 用法一样,多一个文件指针二进制读写fwritefread,需要指定每个对象的大小和个数,打开方式加b文件定位fseek移动偏移量、ftell获取当前位置、rewind回到开头今日感悟今天这几个函数其实只是把之前学的输入输出搬到文件里,fprintf就是文件版的printffscanf就是文件版的scanf。学会了标准IO,二进制读写也顺手了。

2026-08-21 19:18:26 184

原创 嵌入式学习 day27:标准IO

今天学了标准IO文件操作三步走:打开(fopen)→ 读写 → 关闭(fclose)打开方式r(读)、w(写)、a(追加),加表示读写,加b表示二进制缓存机制:全缓存(普通文件)、行缓存(终端)、不缓存(stderr)字符读写:fputc 写入单个字符,fgetc 读取单个字符,配合循环可遍历整个文件其他读写:字符串(fputs/fgets)、格式化(fprintf/fscanf)、二进制(fwrite/fread)三个默认流今日感悟文件操作和printf/scanf很像,理解起来基本不费力。

2026-08-20 18:24:05 233

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除