- 博客(40)
- 收藏
- 关注
原创 stm32开发 -- RC522模块与AS608模块相关
模块芯片地址在没有生成之前为缺省的 0xFFFFFFFF,一旦MCU通过指令配置了新的芯片地址,则所有的数据包都必须按照生成的地址收发,模块将拒绝地址错误的数据包,一般我们都是以默认0xFFFFFFFF为地址,不需要配置地址。RC552采用模式3,上图为模式3的时序图,根据时序图写发送数据,共有8个时钟周期,所以循环8次, 按位查询需要发送的数据的高低电平,0将MOSI引输出低电平,1将MOSI输出高电平,然后调SCK时钟引脚,使时钟引脚输出低电平(默认状态高电平),延时一会,输出高电平。
2025-07-29 17:04:45
1483
1
原创 stm32开发 -- TFTLCD相关
ALIENTEK 2.4/2.8/3.5 寸 TFTLCD 模块自带的触摸屏都属于电阻式触摸屏,下面简单介绍 下电阻式触摸屏的原理。当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,电阻发生变化,在X和Y两个方向上产生 信号,然后送触摸屏控制器。控制器侦测到这一接触并计算出(X,Y)的位置,再根据获得的 位置模拟鼠标的方式运作。这就是电阻技术触摸屏的最基本的原理。电阻触摸屏的优点:精度高、价格便宜、抗干扰能力强、稳定性好。电阻触摸屏的缺点:容易被划伤、透光性不太好、不支持多点触摸。
2025-07-28 20:57:20
1581
4
原创 详细FreeRTOS开发过程(九)-- 内存管理
接着判断待插入空闲内存块的起始地址或结束地址是否分别与该位置前面内存块的结束地址或该位置后面内存块的起始地址相同,如果相同侧表示待插入的空闲内存块在物理地址上与该位置前面的内存块或该位置后面的内存块相邻,那么就将响铃的两个空闲内存块合并成一个大的内存块,再将这个大的内存块插入到空闲块链表中,这个操作的示意图如下所示(以待插入空闲内存块与找到位置的上一个内存块相邻为例)。初始化后的内存堆将被作为空闲内存块链接到空闲块链表中,再接下来的内存申请与释放就和 heap_4 内存管理算法一致了。
2025-07-26 22:27:39
1201
4
原创 详解FreeRTOS开发过程(八)-- 时间标志
信号量可以来完成同步,但是使用信号量来同步的话任务只能与单个的事件或任务进行同步。但是有时候某个任务可能会需要与多个事件或任务进行同步,此时信号量就无能为力了。FreeRTOS 为此提供了一个解决方法,就是事件标志组。
2025-07-25 15:42:55
1592
4
原创 详解FreeRTOS开发过程(七)-- 信号量
计数型信号量有时也被称为数值信号量,二值信号量相当于长度为 1 的队列,那么计数型信号量就是长度大于 1 的队列。同二值信号量一样,用户不需要关心队列中存储了什么数据,只需要关心队列是否为空即可。在这个场合中,每次事件发生的时候就在事件处理函数中释放信号量(增加信号量的计数值),其他任务会获取信号量(信号量计数值减一,信号量就是队列结构体成员变量 uxMessagesWaiting)来处理事件。在这种场合中创建的计数型信号量初始计数值为 0。
2025-07-25 15:42:17
1525
原创 详解FreeRTOS开发过程(六)-- 队列
在实际的应用中,常常会遇到一个任务或者中断服务需要和另外一个任务进行 “沟通交流”,这个 “沟通交流” 的过程其实就是消息传递的过程。在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式,但是如果在使用操作系统的应用中用全局变量来传递消息就会涉及到 “资源管理” 的问题。对此 FreeRTOS 提供了一个叫做 “队列” 的机制来完成任务与任务、任务与中断之间的消息传递。
2025-07-24 22:16:38
1618
2
原创 详解FreeRTOS开发过程(五)-- 系统内核控制函数及任务相关API函数
我们最初看到的计算机称为裸机,在裸机的基础上我们看到最外围的是操作系统,操作系统中的程序主要分为两部分:一是系统系统内核函数,另一个是用户自编程序;其中系统内核函数只供系统内核使用,用户应用程序一般不允许使用,这些 API 函数就是系统内核控制函数;
2025-07-24 22:16:00
1489
原创 详解FreeRTOS开发过程(四)-- 任务切换
PendSV(可挂起的系统调用)异常对 OS 操作非常重要,其优先级可以通过编程设置。可以通过将中断控制和状态寄存器ICSR的bit28,也就是PendSV的挂起位置1来触发PendSV中断。与SVC异常不同,它是不精确的,因此它的挂起状态可在更高优先级异常处理内设置,且会在高优先级处理完成后执行。利用该特性,若将PendSV设置为最低的异常优先级,可以让PendSV异常处理在所有其他中断处理完成后执行,这对于上下文切换非常有用,也是各种OS设计中的关键。
2025-07-23 21:41:33
1448
原创 详解FreeRTOS开发过程(三)-- 调度器和任务相关函数
任务恢复函数有两个vTaskResume()和xTaskResumeFromISR(),一个是用在任务中的,一 个是用在中断中的,但是基本的处理过程都是一样的,以函数vTaskResume()为例来讲解 一下任务恢复详细过程。空闲任务是FreeRTOS 系统自动创建的,不需要用户手动创建。1.判断系统是否有任务删除,如果有的话就在空闲任务中释放被删除任务的任务堆栈和任务控制块的内存。空闲任务的任务优先级是最低的,为0,任务函数为prvIdleTask()。2.运行用户设置的空闲任务钩子函数。
2025-07-23 21:40:43
1225
原创 详解FreeRTOS开发过程(二)-- 列表和列表项
列表是FreeRTOS中的一个数据结构,概念上和链表有点类似,列表被用来跟踪FreeRTOS中的任务。与列表相关的全部东西都在文件list.c和list.h中。列表项就是存放在列表中的项目,FreeRTOS提供了两种列表项:列表项和迷你列表项。
2025-07-22 10:31:07
1377
1
原创 详解FreeRTOS开发过程(一)-- 任务
FreeRtos是一个迷你的实时操作系统内核,作为一个轻量的操作系统,功能包括:任务管理,时间管理,消息队列,内存管理,记录功能,软件定时器,协程等,可以基本满足较小系统的需要,有以下特点:1.FreeRTOS是免费的。2.许多其他半导体厂商产品的 SDK 包就使用 FreeRTOS 作为其操作系统,尤其是 WIFI、蓝牙这些带协议栈的芯片或模块。3.FreeRTOS 被移植到了很多不同的微处理器上。4.FreeRTOS 的内核支持抢占式,合作式和时间片调度。
2025-07-22 10:30:46
1897
原创 Linux下i2c设备驱动开发
在 Linux 内核中 I2C 的体系结构分为 3 个部分: I2C 核心: I2C 核心提供了 I2C 总线驱动和设备驱动的注册、 注销方法。 I2C 总线驱动: I2C 总线驱动是对 I2C 硬件体系结构中适配器端的实现, 适配器可由CPU 控制, 甚至可以直接集成在 CPU 内部。I2C 总线驱动就是 SOC 的 I2C 控制器驱动,也叫做 I2C 适配器驱动。 I2C 设备驱动: I2C 设备驱动是对 I2C 硬件体系结构中设备端的实现, 设备一般挂接在受
2025-07-21 14:40:08
1548
原创 Linux下SPI设备驱动开发
引脚含义: DO(MOSI):Master Output, Slave Input,SPI主控用来发出数据,SPI从设备用来接收数据。 DI(MISO):Master Input, Slave Output,SPI主控用来发出数据,SPI从设备用来接收数据。 SCK:Serial Clock,时钟。 CS:Chip Select,芯片选择引脚。 设现在主控芯片要传输一个0x56数据给SPI FLASH,时序如下: 首先我们要
2025-07-21 14:39:48
1498
2
原创 Linux下platform设备驱动开发
第一种是采用设备树的匹配方式,of_driver_match_device 函数定义在文件 include/linux/of_device.h 中,此函数会比较device_driver中的变量的of_match_table成员变量,里面保存着驱动的compatible属性,与设备树中的compatible属性做对比,如果有的话设备与驱动会进行匹配,驱动的probe函数会执行。同样的,当向系统中注册一个设备的时候,总线就会在左侧的驱动中查找看有没有与之匹配的设备,有的话也联系起来。
2025-07-17 14:45:53
1570
原创 Linux字符设备驱动开发
字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、IIC、SPI,LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。Linux 应用程序对驱动程序的调用如下图所示:在 Linux 中一切皆为文件,驱动加载成功以后会在“/dev”目录下生成一个相应的文件,应用程序通过对这个名为“/dev/xxx”(xxx 是具体的驱动文件名字)的文件进行相应的操作即可实现对硬件的操作。
2025-07-17 14:45:32
1531
原创 Linux实现进程之间Socket通信详解
上述通信流程总结为以下步骤;首先运行服务器程序,它会:绑定到8080端口等待客户端连接然后运行客户端程序,它会:连接到服务器的8080端口发送消息"Hello, server!
2025-07-16 10:23:30
1289
3
原创 Linux内核启动流程详细分析
分析 Linux 启动流程,和uboot相同需要先编译一下源码,因为有很多文件是需要编译才会生成的。首先分析 Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds,通过链接脚本可以找到 Linux 内核的第一行程序是从哪里执行的。入 口 为 stext , stext 定 义 在 文 件arch/arm/kernel/head.S 中 , 因此需要先 从 文 件arch/arm/kernel/head.S 的 stext 处开始分析。
2025-07-16 10:23:06
1376
原创 Uboot源码超详细分析(1)
硬件设备初始化加载U-Boot第二阶段代码到RAM空间设置堆栈跳转到第二阶段代码入口初始化本阶段使用的硬件设备检测系统内存映射将内核从Flash读取到RAM中为内核设置启动参数调用内核Uboot启动第一阶段流程如下:u-boot编译完成后,根目录下会生成一个链接脚本u-boot.lds,在u-boot中因为有汇编阶段参与,整个程序的入口取决于链接脚本中 ENTRY 声明的地方。因此_start符号所在的文件就是整个程序的起始文件,_start所在处的代码就是整个程序的起始代码。
2025-07-15 15:31:30
1697
原创 详解Linux下多进程与多线程通信(二)
事实上,子进程是父进程的一个副本,譬如子进程拷贝了父进程的数据段、堆、栈以及继承了父进程打开的文件描述符,父进程与子进程并不共享这些存储空间,这是子进程对父进程相应部分存储空间的完全复制,执行 fork()之后,每个进程均可修改各自的栈数据以及堆段中的变量,而并不影响另一个进程。类似于 fork(),vfork()可以为调用该函数的进程创建一个新的子进程,然而,vfork()是为子进程立即执行新的程序而专门设计的,也就是 fork()函数的第二个使用场景。所以,处于等待态的进程是无法参与进程系统调度的。
2025-07-13 23:08:15
1470
2
原创 详解Linux下多进程与多线程通信(一)
多进程和多线程都是多任务处理的方法,它们允许计算机同时执行多个任务。它们在资源分配、通信机制、内存管理等方面有着根本性的区别。多进程指的是操作系统能够同时管理和执行多个进程,每个进程有自己独立的内存空间。这意味着进程之间的通信需要特别的机制,如管道、信号量、共享内存或消息队列等。多进程特点:a.稳定性高:一个进程崩溃通常不会影响其他进程,因为它们的内存空间是隔离的。b.安全性:由于内存是隔离的,所以进程之间的数据不易被未授权访问。
2025-07-13 23:07:50
1375
原创 Linux下LCD驱动-IMX6ULL
LCD 显示器都是由一个一个的像素点组成,像素点就类似一个灯(在 OLED 显示器中,像素点就是一个小灯),这个小灯是 RGB 灯,也就是由 R(红色)、G(绿色)和 B(蓝色)这三种颜色组成的,而 RGB 就是光的三原色。根据上述probe函数中的信息可以得到,Linux 内核将所有的 Framebuffer 抽象为一个叫做 fb_info 的结构体, fb_info 结构体包含了 Framebuffer 设备的完整属性和操作集合,因此每一个 Framebuffer 设备都必须有一个 fb_info。
2025-07-10 14:59:52
1289
原创 基于V4L2框架的ov2640相机驱动(5)
define VIDEO_DEVICE "/dev/video0" // 摄像头设备文件路径#define OUTPUT_FOLDER "./captured_frames/" // 图像保存文件夹路径#define NUM_FRAMES 100 // 要捕获的帧数2.打开摄像头设备// 打开摄像头设备return -1;// 查询摄像头能力close(fd);return -1;3.设置图像帧格式。
2025-07-09 21:07:47
869
1
原创 QT下SQLite应用(一)
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。数据库是存放数据的仓库。
2025-07-09 21:06:48
1183
1
原创 基于V4L2框架的ov2640相机驱动(4)
vb2_buffer是V4L2框架中videobuf2库的核心数据结构,代表了一个视频缓冲区。它的作用是管理视频数据缓冲区的生命周期,包括缓冲区的分配、准备、排队、处理、完成和清理等。vb2_buffer通常与vb2_queue一起使用,后者管理着一个或多个vb2_buffer实例,形成了一个缓冲区队列。以下是。
2025-07-08 22:24:16
1640
原创 基于V4L2框架的ov2640相机驱动(3)
在V4l2框架中提供了一个结构,用于表示一个V4L2设备的文件系统操作,在设计基于V4L2的video驱动程序时,需要创建结构实例,并实现其中的callback。然后将其设置到实列的.fops元素。
2025-07-08 11:43:03
1511
原创 基于V4L2框架的ov2640相机驱动(2)
视频异步子设备注册可以分为两个部分,一部分为notifier管理的v4l2_async_subdev,另外一部分为子设备驱动的v4l2_subdev。notifier中的异步子设备都是根据设备树信息注册的。然后子设备驱动再注册自己对应的子设备。上面所涉及到的主要区别在于v4l2_async_notifier_register()和v4l2_async_register_subdev()函数。这两个函数需要仔细去分析下,原理和linux驱动中的其它总线和设备匹配非常相似。
2025-07-07 20:58:36
1201
原创 基于V4L2框架的ov2640相机驱动(1)
I.MX6U-ALPHA 开发板板载了一个摄像头模块接口,连接在 I.MX6U 的硬件摄像头接口(CSI)上面,其原理图如下图所示:图中 P1 接口可以用来连接正点原子摄像头模块。其中,I2C2_SCL 和 I2C2_SDA 是摄像头的 SCCB 接口,分辨连接在 I.MX6U 的 UART5_TXD 和 UART5_RXD 引脚上。CSI_RESET 和CSI_PWDN 这 2 个信号是不属于 I.MX6U 硬件摄像头接口的信号,通过普通 IO 控制即可,这。
2025-07-07 15:08:41
1343
原创 详解Linux下V4L2驱动框架
Video for Linux 2,简称V4l2,是Linux内核中关于视频设备的内核驱动框架,为上层的访问底层的视频设备提供了统一的接口。凡是内核中的子系统都有抽象底层硬件的差异,为上层提供统一的接口和提取出公共代码避免代码冗余等好处。在linux中,视频设备也是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video0下。V4L2在设计时支持很多设备,其中只有一部分是真正的视频设备,主要有以下几种接口,如:1.视频采集接口:这种应用设备主要为摄像头。
2025-07-06 14:34:23
1377
原创 SARADC
逐次逼近型ADC(Successive Approximation ADC)采用的是一种反馈比较型电路结构。它的原理是:取一个数字量加到DAC上,于是得到一个对应的输出模拟电压。将这个模拟电压和输入的模拟电压信号相比较。如果两者不相等,则调整所取的数字量,直到两个模拟电压相等为止,最后所取的这个数字量就是所求的转换结果。rk1808内置4通道10位SARADC,最高10M/s的采样率。
2025-06-13 11:07:50
645
原创 U-boot添加新命令
在函数cli_loop函数中调用parse_file_outer函数,parse_file_outer函数中调用函数 parse_stream_outer, parse_stream_outer函数负责接收命令行输入,然后解析并调用run_list函数执行相应的命令,函数 run_list 会经过一系列的函数调用,最终通过调用 cmd_process 函数来处理命令。最终定义了一个 cmd_tbl_t 类型的变量,变量名为_u_boot_list_2_cmd_2_dhcp,此变量 4。
2025-06-09 22:35:49
1017
原创 嵌入式网络
另外主控需要配置或读取 PHY 芯片,也就是读写 PHY 的内部寄存器,所以还需要一个控制接口,叫做 MIDO,MDIO 很类似 IIC,也是两根线,一根数据线叫做 MDIO,一根时钟线叫做 MDC。嵌入式网络硬件分为两部分:MAC 和 PHY,如果一款芯片数据手册说自己支持网络,一般都是说的这款 SOC 内置 MAC,MAC 类似 I2C 控制器、SPI 控制器一样的外设。但是光有 MAC还不能直接驱动网络,还需要另外一个芯片:PHY,因此对于内置 MAC 的 SOC,其外部必须搭配一个 PHY 芯片。
2025-06-09 16:41:14
873
原创 git常用基础操作
在执行很多的 Git 操作的时候,是需要保持当前操作的仓库/分支处于 clean 状态,及没有未提交的修改。但是做这些事情的时候,你可能修改了比较多的代码,却又不想丢弃它。git reset会改变提交历史,在共享分支上使用时需要谨慎,已经提交到远程仓库的提交不应该reset撤销。当我们修复完成一个 Bug,或者开发完成一个新特性,我们就会把相关的 Bug 或者 特性的上修改合并回原来的主分支上。当之前创建的分支,完成了它的使命,如 Bug 修复完,分支合并以后,这个分支就不在需要了,就可以删除它。
2025-05-27 20:26:20
917
原创 视觉SLAM CMake练习
iostream>属于C++格式,只需要将文件的后缀改为cpp即可,还有CMakeLists.txt文件中对应的名称也要修改。
2023-07-25 19:01:52
628
原创 CMake practice 操作步骤-初试 cmake
projectname>_BINARY_DIR 和 <projectname>_SOURCE_DIRSET。定义了这个工程会生成一个文件名为 hello 的可执行文件,相关的源文件是 SRC_LIST 中。c.FATAL_ERROR:立即终止所有cmake过程.a.SEND_ERROR:产生错误,生成过程被跳过.a.定义了工程的名称,说明工程支持的语言.b.SATUS.输出前缀位-的信息.
2023-07-22 17:09:52
678
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人