自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 项目(3) - LVGL 图形用户界面(GUI)库

CC = arm-linux-gnueabihf-gcc # 指定交叉编译器:用于在x86主机编译ARM架构的程序= lvgl # LVGL库的目录名(默认lvgl)LVGL_DIR?= ${shell pwd} # LVGL库的根路径(默认当前目录,可通过外部传入覆盖)CFLAGS?= -O3 -g0 -I$(LVGL_DIR)/ -std=gnu99 # 编译选项LDFLAGS?= -lm -lpthread # 链接选项BIN = demo # 最终生成的可执行文件名CC。

2025-10-09 23:49:45 1989

原创 项目(2)- framebuffer

什么是帧缓存?writewrite帧缓存应该申请多大?帧缓存中的数据格式?framebuffer 具体操作方法和步骤?如何封装绘点、绘线、绘图、绘 ASCII、绘汉字方法?

2025-10-09 00:20:03 739

原创 项目(1) - 线程邮箱

这段代码实现了一个简单的 "线程邮箱" 模型,通过名字标识线程,用队列缓存消息,实现了多线程间的异步通信。核心思想是 "每个线程一个专属消息队列,发送者往目标队列放消息,接收者从自己队列取消息",是多线程通信中常用的 "生产者 - 消费者" 模型的典型应用。

2025-10-08 00:21:08 818

原创 RAM(16) - SPI

SPI使用的线:串行时钟线(SCK)、主机输入/ 从机输出数据线MISO、主机输出/从机输入数据线MOSI 、低电平有效的从机选择线SS。一般使能需要在最后单独配置,但这里说明了(0位 EN)需要在配置其他寄存器(CONFIGREG)之前置1,所以放在同一句实现。配置为0x0B -- 1011 -- 200速率。),节约了芯片的管脚,同时为PCB 的 布局上节省空间,提供方便。速率快就功耗高,默认值0x0A -- 1010 -- 100速率。,工作模式:空闲时为低电平0 / 空闲时为高电平1。

2025-09-23 22:54:57 223

原创 ARM(15) - LCD(2)显示字母数字+touch

主函数是触屏功能的 “应用入口”,负责初始化所有外设,然后循环读取触摸数据并在 LCD 上显示。获取触摸数据 —— 该函数是 “中断层” 与 “应用层” 的隔离接口,降低耦合。当有触摸时,触摸芯片拉低 GPIO1_IO09,触发中断,中断处理函数负责。功能:向触摸芯片的指定寄存器写入数据(如配置寄存器、清除标志)。功能:从触摸芯片的指定寄存器读取数据(如触摸点数量、坐标)。是封装好的 I2C 读写接口,负责与触摸芯片的寄存器交互。是触屏功能的 “启动入口”,负责完成。,是触屏功能的 “数据采集核心”。

2025-09-20 21:32:21 1153

原创 ARM(14) - LCD(1)清屏和画图形

在总位深有限(16 位)的情况下,给绿色分配更多位数,能让颜色过渡更自然,视觉上减少 “色阶断层”(颜色突变的卡顿感),比平均分配(如 RGB555)的效果更好。:配置 LCDIF 的时钟源(PLL_VIDEO)及分频系数,确保 LCD 像素时钟(DOTCLK)符合 LCD 屏的时序要求(如 800x480@60Hz 需~27MHz 时钟)。:整合 IO、时钟初始化,配置 LCD 核心参数(分辨率、时序)和 LCDIF 控制器,是 LCD 驱动的入口函数。之所以给绿色多 1 位(6 位),是因为。

2025-09-20 20:57:33 985

原创 ARM(13) - PWM控制LCD

定义:脉冲宽度调制(Pulse Width Modulation,PWM),通过周期性的高低电平信号,利用 “高电平占空比” 模拟输出等效电压 / 功率,实现 “数字信号控制模拟量” 的效果。(周期计数值 = 1000-2,实际周期 = (计数值+2)*时钟周期):I.MX6ULL 的 PWM 中断标志需 “写 1 清除”

2025-09-18 21:45:24 955

原创 ARM(12) - ADC 检测光照强度

ADC 校准:通过函数消除硬件偏移误差,是高精度采样的必要步骤。引脚配置:通过和将 GPIO 复用为 ADC 输入,并配置电气属性(如禁用上拉、使能拉电路)。寄存器操作GS:状态寄存器,用于判断校准状态GC:全局控制寄存器,用于使能 ADC 和启动校准HC[0]:通道 0 控制寄存器,用于启动转换和配置中断HS:转换状态寄存器,用于判断转换是否完成R[0]:通道 0 数据寄存器,存储转换结果数据转换:12 位 ADC 的采样值(0~4095)通过比例计算转换为实际电压(0~3.3V)。

2025-09-18 21:01:23 1129

原创 ARM(11) - LM75

start.S 添加enable_fpu函数的执行流程遵循lm75.cmain.c。

2025-09-17 20:09:50 400

原创 ARM(10) - I2C

MSB高位先行发送数据:SCL 高电平不能切换----真正在通信start和stop:在时钟SDL高电平时,产生一个下降沿或一个上升沿在时钟线为高电平时,数据线产生一个下降沿(2)总线规定(0)IIC数据发送MSB先行;(1)当时线为低电平时,数据线允许发送方改变,不允许接收方采样。(2)当时钟线为高电平时,数据线不允许发送方改变,允许接收方采样。(1)ACK应答:低电平(2)NACK非应答:高电平(4)stop信号:在时钟线为高电平时,数据线产生一个上升沿。

2025-09-17 19:57:43 1087

原创 ARM(9) - UART

这三种方式描述了通信中数据传输的方向性。​单工通信​​:​数据只能单向传输,一端固定为发送端,另一端固定为接收端。例如:广播(收音机)、遥控器、传统的电视信号。​半双工通信​​:​数据可以双向传输,但不能同时进行,需要轮流交替。某一时刻,一方发送,另一方接收。例如:对讲机、某些无线电设备。​全双工通信​​:​数据可以同时进行双向传输。通信双方都拥有独立的发送器和接收器,可以同时发送和接收数据。例如:电话通话、手机通话、现代网络通信。这两者描述了数据位的传输方式。​串行通信​​:​。

2025-09-16 22:55:38 1185

原创 ARM(7)IMX6ULL 按键控制(轮询 + 中断)优化工程

GIC 是 ARM 系统中中断管理的 “中枢”,通过标准化的架构支持多核、虚拟化等复杂场景,确保中断高效、有序地被处理,是嵌入式系统、服务器等 ARM 设备正常运行的核心组件之一。

2025-09-12 23:53:38 743

原创 ARM (6) - I.MX6ULL 汇编点灯迁移至 C 语言 + SDK 移植与 BSP 工程搭建

两种常见方式:直接宏定义、结构体封装(推荐后者,更易维护)。// I.MX6ULL 关键寄存器(引脚复用、GPIO控制)//int 指令/寄存器是四个字节#define IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 *((volatile unsigned int *)0x020E0068) // 引脚复用控制。

2025-09-11 21:38:39 773

原创 ARM(5)-IMX6ULL 裸机开发入门:从启动到点亮第一盏 LED 灯

ARM 异常处理:异常向量表是入口,复位异常是程序启动点,其他异常需后续扩展实际处理逻辑(如 IRQ 中断服务函数)。工作模式与栈:不同模式独立栈空间,SYS 模式适合主程序,IRQ 模式用于中断处理。GPIO 控制流程:复用配置→电气特性→方向设置→数据操作,需结合芯片手册和硬件原理图。交叉编译流程:汇编→编译(.o)→链接(.elf)→格式转换(.bin)→烧录,Makefile 自动化管理流程。

2025-09-10 22:20:47 970

原创 ARM(4) 硬件介绍与开发环境搭建

IMX6ULL-Mini 开发板是正点原子推出的基于 NXP i.MX6ULL SOC 的嵌入式开发板,主打,适合物联网、工业控制等场景,硬件结构分为核心板与底板两部分,核心板通过双列直插方式与底板连接。

2025-09-09 21:16:43 1112

原创 ARM(3)从基础调用到 C / 汇编互调

函数名:;函数体指令序列bx lr;函数返回其中,bx lr是函数返回的关键指令,lr(Link Register) 寄存器存储了函数调用后的返回地址,通过该指令可将程序执行流切回到调用处。

2025-09-09 21:08:55 762

原创 ARM(1):ARM体系结构

异常向量表是 ARM 内核中固定地址的内存区域,存储各类 “异常处理程序的入口地址”,是内核响应异常的 “导航表”。

2025-09-08 22:30:32 1445 1

原创 ARM(2)汇编

函数是代码复用和模块化的基础,ARM 汇编通过特殊寄存器实现函数调用与返回,理解这一机制对掌握汇编编程至关重要。

2025-09-08 21:39:16 734

原创 硬件:51单片机(3)uart串口

51 单片机有和UART:通用异步收发器,2个串口(1个串口被用于ISP下载程序,1个串口被用于和主机之间的通信),RXD(接收信号线) TXD(发送信号线)

2025-09-04 23:41:56 1060

原创 硬件:51单片机(2)

1. GPIO输入模式、输出模式2. 按键工作原理(GPIO输入)3. 中断概念4. 中断源概念、中断源个数、哪几个中断源5. 外部中断、定时器中断概念6. 中断处理流程:7. 51单片机中定时器的个数?类型8. 16位定时器和8位自动重装载定时器的区别9. PWM的概念、PWM周期、PWM占空比10、有源蜂鸣器和无源蜂鸣器的区别11、51单片机蜂鸣器实现原理。

2025-09-03 21:09:48 1105

原创 硬件:51单片机(1)

概念辨析:MCU(集成度高、简单控制)vs MPU(需外接外设、复杂应用);存储区别:RAM(临时变量、掉电丢失)vs ROM(程序指令、掉电不丢);三大总线:地址总线(单向、寻址)、数据总线(双向、传数据)、控制总线(时序控制);LED 导通:共阳极需阴极接低电平,共阴极需阳极接高电平;位运算应用置 1、清 0、翻转;程序流程:Keil 编译生成 HEX,STC-ISP 下载,复位单片机生效。

2025-09-02 21:49:19 1076 1

原创 网络(4):数据库

/让变量的 “生命周期延长到整个程序运行期间”,且 “初始化仅执行一次”int i = 0;for(i = 0;i < n_col;flag++;for(i = 0;i < n_col;// //只打印前20行 //select * from dict limit 20;自己会看多少行// {// }return 0;//修改回调函数打印格式每次会刷新。

2025-09-01 00:40:06 1149

原创 Linux软件编程:消息队列、共享内存、信号灯

(2)msgget(3)msgsnd(4)msgrcv(5)msgctl6. 共享内存1. 概念 进程空间独立,共享内存是开辟一段内核空间,进程映射到该空间实现共享。 进程间通信最高效形式。2. 操作方法 创建 IPC 对象名称 创建共享内存 将进程空间地址映射到共享内存空间 读写共享内存实现进程间通信 解除共享内存映射 删除共享内存3. 函数接口(1)ftok(同 “消息队列” 模块的,功

2025-08-19 20:27:52 879

原创 Linux软件编程:进程间通信

在 Linux 系统中,进程是资源分配的最小单元,每个进程都拥有独立的地址空间(包括文本段、数据段和系统数据段)。这就是进程间通信(IPC,Inter-Process Communication)需要解决的问题。本文将详细解析 Linux 中常见的进程间通信方式,包括其原理、接口及使用场景。

2025-08-18 20:29:22 1084

原创 Linux软件编程:线程2

进程是操作系统资源分配的基本单位,拥有独立的内存空间和完整的生命周期;线程是轻量级的执行单元,共享进程资源,适合高并发场景。理解进程的内存布局、调度机制和状态流转,掌握线程的同步方法,是编写高效 Linux 多任务程序的基础。

2025-08-16 21:47:11 847

原创 Linux软件编程:线程

进程是操作系统资源分配的基本单位,拥有独立的内存空间和完整的生命周期;线程是轻量级的执行单元,共享进程资源,适合高并发场景。理解进程的内存布局、调度机制和状态流转,掌握线程的同步方法,是编写高效 Linux 多任务程序的基础。

2025-08-15 21:17:26 855

原创 Linux软件编程:进程

进程是操作系统资源分配的基本单位,拥有独立的内存空间和完整的生命周期;线程是轻量级的执行单元,共享进程资源,适合高并发场景。理解进程的内存布局、调度机制和状态流转,掌握线程的同步方法,是编写高效 Linux 多任务程序的基础。

2025-08-14 22:21:18 844

原创 linux软件编程: 目录 IO及时间相关的函数接口

【代码】嵌入式 - linux软件编程: 目录 IO及时间相关的函数接口。

2025-08-13 22:30:44 450

原创 Linux软件编程:文件IO

标准IO是有缓存的IO,文件IO没有缓存,适合于通信、硬件设备操作标准IO是库函数,文件IO是系统调用。

2025-08-12 21:02:49 617

原创 Linux软件编程:标准IO

在 Linux 系统编程中,IO 操作是与外部设备交互的核心环节。其中,标准 IO 作为 C 语言库提供的高级 IO 接口,凭借其缓存机制和简洁的接口设计,成为处理文件和设备交互的常用选择。本文将从标准 IO 的基础概念出发,详细解析其核心接口、缓存机制,并结合实践任务帮助理解与应用。

2025-08-11 22:15:58 1027

原创 Linux软件编程

操作系统的本质是 "硬件与应用程序的桥梁"—— 它屏蔽了底层不同硬件平台的差异,为上层应用提供统一的接口,让开发者无需关注硬件细节即可编写程序。这种抽象能力,是现代计算机系统高效运行的基础。

2025-08-09 18:50:21 939

原创 数据结构:哈希表和排序与查找算法

哈希表通过键值映射实现高效存取,是解决快速查找问题的核心结构;排序算法则通过不同策略将数据有序化,为高效查找(如二分查找)奠定基础。理解这些数据结构与算法的原理、实现及适用场景,能帮助我们在实际开发中选择最优方案,提升程序性能。

2025-08-08 21:16:27 701

原创 数据结构:二叉树

int no;// 节点编号(数据域)// 左子节点指针// 右子节点指针} treenode;二叉树作为一种灵活的非线性结构,通过层次化的存储方式平衡了数据的访问效率和扩展性。从基础概念到遍历操作,再到实际应用,二叉树的每一个特性都为解决复杂问题提供了思路。掌握二叉树不仅是数据结构学习的关键,更是深入理解算法设计的基础 —— 无论是递归思想的运用,还是栈、队列等辅助结构的配合,都为后续学习更复杂的树结构(如红黑树、B 树)奠定了坚实的基础。

2025-08-07 19:11:07 948

原创 数据结构:栈和队列

栈和队列作为两种基础的线性数据结构,虽然简单却蕴含着深刻的设计思想。它们通过限制数据操作的方式,为特定问题提供了高效的解决方案。理解栈和队列的工作原理及其实现方式,是每个程序员必备的基础知识。在实际开发中,选择栈还是队列,取决于具体问题的需求:当需要 "回溯" 功能时选择栈,当需要 "公平处理" 时选择队列。而顺序实现与链式实现的选择,则需要在效率和灵活性之间做出权衡。

2025-08-06 22:34:50 854

原创 数据结构:循环链表和内核链表

/ 数据域// 前驱指针// 后继指针} linknode;// 首尾自环Linux 内核中通过// 后继指针// 前驱指针初始化初始化头节点,使其首尾自环;插入(头插)、(尾插);删除从链表中移除节点;遍历遍历数据元素,其中member为数据结构中成员的名称;数据定位通过节点指针ptr找到数据结构的首地址(核心宏,通过指针运算实现)。使用内核链表时,需在自定义数据结构中嵌入// 示例:定义一个包含内核链表节点的进程结构int pid;// 进程ID// 进程名。

2025-08-05 20:53:10 591

原创 数据结构:查找至双向链表

双向链表是一种每个节点除了存储数据外,还包含两个指针的线性数据结构:一个指针(ppre)指向前一个节点,另一个指针(pnext)指向后一个节点。这种结构允许我们从任意节点出发,既可以向前遍历,也可以向后遍历,弥补了单向链表只能单向访问的局限性。与单向链表相比,双向链表的核心差异在于多了一个前驱指针,这使得它在插入、删除操作中不需要像单向链表那样依赖前驱节点的跟踪,从而提升了操作效率。/* 节点存放数据的类型 *//* 节点类型 */// 存放数据的空间// 指向当前节点的前一个节点。

2025-08-04 22:16:34 769

原创 数据结构:数据结构基础与链表

单向链表节点通常包含数据域和指针域/* 链表存放数据的类型 *//* 链表节点类型 */// 存放数据的空间// 存放下一个节点的地址} linknode;//struct node 是结构体名称 是类型//linknode 等价于上方 是类型(link-链 node-节点)这种结构设计使得每个节点既可以存储数据,又能指向链表中的下一个节点。

2025-08-02 21:25:54 747

原创 C语言:构造数据类型、位运算与内存管理

定义形式结构体类型 数组名[元素个数];,其中元素个数必须是常量。// 姓名char sex;// 性别('m'/'f')int age;// 年龄int score;// 成绩// 包含3个学生的数组初始化方式全部初始化:按顺序为每个元素的成员赋值。指定元素初始化:通过[索引]指定特定元素的成员,未指定的元素默认初始化为 0。[1] = {.name = "zhangsan", .score = 90} // 仅初始化第2个元素定义形式union 共用体名 {数据类型1 成员1。

2025-07-30 22:08:12 1616

原创 C语言:指针与构造数据类型

定义:使用struct// 姓名char sex;// 性别('m'/'f')int age;// 年龄int score;// 成绩初始化;局部初始化(指定成员):// 未指定的成员自动初始化为0。

2025-07-29 22:40:12 968

原创 C语言:指针数组、数组指针与复杂指针应用

二级指针是指向一级指针变量的指针。如果说一级指针存储的是普通变量的地址,那么二级指针存储的就是一级指针变量的地址。int **q;// 定义一个二级指针q在 64 位操作系统中,二级指针与所有指针变量一样,占用 8 个字节的内存空间,其指向的是一个一级指针变量的内存地址。指针数组是数组,其每个元素都是指针。数据类型 *数组名[元素个数];例如int *a[5];表示定义一个包含 5 个元素的数组a,每个元素都是int *类型的指针。

2025-07-28 21:40:47 963

空空如也

空空如也

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

TA关注的人

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