- 博客(39)
- 收藏
- 关注
原创 STM32F407 I²C 总线:以 AT24C02 EEPROM 为例
I²C 负责传输地址和数据,AT24C02 驱动负责组织 EEPROM 的读写操作。使用硬件 I²C 和 HAL 库时,不需要自己逐位读取 SDA,也不需要手动控制 GPIO 产生 ACK。AT24C02 自带通信和存储控制硬件,不需要为它编写接收程序。连续写入时,驱动需要根据页边界拆分,不能仅判断“本次长度不超过 8 字节”。它探测的是已知设备是否就绪,不需要逐位扫描 SDA,也不需要一直在后台运行。收到 STOP 后,EEPROM 开始内部写入,因此。完成这套流程,并把读到的数据放进接收变量。
2026-09-26 21:07:16
154
原创 STM32F407 DMA :从功能设计到 HAL 使用
DMA 有存储器端口和外设端口,读写角色随方向变化。DMA2 的外设端口也能访问内存,所以能参与数组复制;DMA1 的外设端口只通向 APB1 外设,不能完成内存到内存传输。不需要使能对应 DMA 的 NVIC,也不需要 DMA 中断入口。DMA(直接存储器访问)是芯片内部的硬件控制器,可以自行通过总线读写数据,减少 CPU 逐项读写的工作。这次调用将源地址、目标地址、数量写入 DMA 寄存器,并使能数据流。:两端宽度为 32 位,两端地址递增,数量填。,CPU 不必执行复制循环。因此,内存到内存模式中,
2026-09-26 15:03:21
304
原创 STM32F407 USART 功能设计
学习 USART 时,容易记住一堆寄存器和初始化函数,却不知道怎样把它们组合成一个完整功能。这篇笔记以为例,把串口基础和程序设计连接起来。1本文中的寄存器和引脚说明针对 STM32F407。代码用于说明构建思路,采用正常收发路径的骨架形式;接收队列、LED 驱动、系统时钟和错误恢复需要结合工程实现。标准输入输出重定向以 Keil/Arm C 库的 MicroLIB 方案为例。
2026-09-26 11:14:59
384
原创 STM32F407 SysTick 中断设计框架
SysTick 是 Cortex-M 内核提供的。配置好计数周期后,硬件周期性请求中断,CPU 进入,我们在其中实现软件计时。
2026-09-25 19:46:37
315
原创 STM32F407 中断:GPIO、EXTI、NVIC 与中断处理
在检测到外部中断或事件模式时,会自动开启 SYSCFG 时钟,再配置引脚来源。EXTI 检测到触发条件后,会设置相应的挂起位。若处理后没有清除,请求可能一直保持,导致 CPU 反复进入中断。串口、定时器等外设的普通中断请求直接送给 NVIC,无须经过 GPIO 的 EXTI 线路。,用于访问它的配置寄存器,不能直接称为“开启 EXTI 时钟”。进入共享中断函数后,需要检查挂起标志,确定是哪条线触发。时,HAL 已经完成检查和清除,不必在回调里重复清除。抢占优先级相同的中断,不能仅靠更高的子优先级互相抢占。
2026-09-25 16:15:07
653
原创 STM32F407 启动文件:从上电复位到 main()
平时编写 STM32 程序,通常从main()开始。但芯片上电后,需要先设置栈指针、找到程序入口、配置系统时钟,并准备好 C 程序的运行环境,才能执行main()。本文以为例,整理启动文件中的主要知识点。
2026-09-25 12:01:25
349
原创 STM32F407 :RGB 流水灯的原理与实现
它的公共正极接电源,三个颜色通道的负极分别连接 GPIO。当某个 GPIO 输出低电平时,对应通道形成电流路径,LED 点亮。使用 STM32F407 控制板载 RGB LED,让红、绿、蓝三种颜色依次点亮,每种颜色保持 500ms,然后循环。初始化时先预置高电平,再配置为输出模式,可以避免启用输出时 LED 短暂亮起。,不会重新配置系统时钟。告诉编译器:这个变量可能被中断改变,主程序每次读取时都要获取它的当前值。要保证红、绿、蓝轮流单独点亮,需要在打开下一个颜色前关闭上一个颜色。
2026-09-25 01:08:07
362
原创 STM32F407 的HAL初步理解
GPIOF 的基地址是多少?MODER 在 GPIO 寄存器结构中的什么位置?这些信息就在设备头文件中。// 后续成员省略对应基地址偏移0x18处的 BSRR 寄存器。**设备头文件相当于用 C 语言描述了芯片寄存器的地址和布局。**它还包含中断编号、寄存器位定义等内容。ST 的 STM32F407 设备头文件HAL 根据这三个参数,最终向 BSRR 的相应位置写入数据,从而拉低 PF6。HAL 把寄存器操作封装起来,底层仍然通过寄存器控制硬件。ST 的 GPIO HAL 实现。
2026-09-24 12:36:16
188
原创 野火霸天虎 STM32F407初步认识
前面一直在讨论main()中的代码,但 CPU 上电后并不是直接从main()的第一行开始执行。上电或复位↓硬件读取向量表中的初始 MSP 和复位入口↓↓↓Arm C 运行库入口 __main()↓用户编写的 main()↓使能 GPIO 时钟、配置引脚、点亮红灯。
2026-09-23 22:24:35
375
原创 执法仪项目总结
1、项目描述开发一款基于 Linux 平台的智能执法记录仪,实现高清音视频采集、多网络通信传输以及电子防抖等功能,满足执法场景下对设备稳定性、实时性和智能化的需求。2、项目实现功能完成 U-Boot、Linux Kernel 及根文件系统的移植与配置。完成外设驱动开发与适配,包括 5G 模块 USB 通信驱动、WiFi(SDIO)WS73 驱动、MPU6050螺仪(I²C)驱动等,实现设备与各硬件模块稳定通信。
2026-07-18 13:30:59
300
原创 Hi3516 + WS73 SDIO Wi-Fi 适配笔记
一、编译过程WS73 驱动的编译入口一般是执行,它本质上会分别进入 WS73 的 platform 和 wifi 驱动目录,然后借用 Linux 内核的外部模块编译机制,类似执行。这里表示进入内核源码/构建目录,M=...表示当前要编译的是外部模块目录。Linux 顶层 Makefile 发现M参数后,会按外部模块方式处理这个目录,读取该目录下的,再通过根据obj-mxxx-objsobj-y等规则递归编译各个.c文件生成.o,并把多个.o合成为模块主.o。之后。
2026-07-11 21:15:14
426
原创 Hi3516CV610 + MPU6050 DMP 软件 EIS 防抖笔记
1、 vi_cfg是根据摄像头 Sensor 类型生成的一套默认视频采集配置,包含 Sensor 基础信息、MIPI RX、VI Device、Device 与 Pipe 的绑定关系、WDR 融合组、VI Pipe、ISP 和 VI Channel 等配置。MIPI RX 负责接收并解析 Sensor 通过 MIPI CSI-2 发送的 RAW 数据;VI Device 负责把 MIPI RX 的数据接入 VI 系统;VI Pipe 负责建立图像处理通道并决定是否经过 ISP;
2026-07-11 21:10:45
384
原创 V4L2框架的常见的问题
例如设置格式时调用v4l2_subdev_call(sd, pad, set_fmt, ...),开始采集时调用v4l2_subdev_call(sd, video, s_stream, 1)。因为CSI驱动设置了vdev->fops = &mx6s_csi_fops,并且mx6s_csi_fops.unlocked_ioctl = video_ioctl2,所以最终。VB2回调没有file参数,因此通过vb2_get_drv_priv(q)从q->drv_priv = csi_dev找回CSI私有结构。
2026-07-03 16:21:03
389
原创 busybox根文件系统移植
BusyBox 根文件系统移植主要可以分为两个部分:一是 BusyBox 的编译过程,二是 BusyBox 根文件系统的启动流程。1、BusyBox是一个“多调用可执行程序”,编译时会根据.config把lscatmountinitsh等多个applet功能链接进同一个busyboxELF;执行/bin/ls时,内核先沿着软链接加载,BusyBox再从argv[0]取得命令名ls,查找applet表并调用ls_main(),并不是先查表再寻找软链接。2、根文件系统则是Linux挂载为。
2026-07-02 23:17:43
193
原创 i.MX6ULL 的 V4L2 框架原理与应用
V4L2 是 Video for Linux 2 的简称,是 Linux 系统中用于视频设备管理和应用访问的标准框架。它为摄像头、视频采集卡等视频设备提供统一的驱动接口和用户空间访问接口。在 Linux 中,视频设备通常会被抽象为设备文件,应用程序可以像访问普通文件一样,通过openreadwriteioctlmmap等系统调用对其进行操作,从而完成视频采集、格式设置、参数控制和缓冲区管理等功能。:视频设备节点,通常面向应用程序使用,用于完成视频数据采集、输出或处理等操作。
2026-06-25 21:55:05
283
原创 Hi3516cv610的安防摄像头实操
本文基于HI3516CV610 + i.MX6ULL + 阿里云 MediaMTX搭建一套安防摄像头视频转发方案。整体思路是:HI3516CV610 负责本地图像采集和 H.264 编码,i.MX6ULL 作为边缘网关从局域网拉取 RTSP 视频流,并通过 GStreamer 主动推送到阿里云服务器,最后由 MediaMTX 将视频流发布成公网可访问的 RTSP 地址。本文将从架构层面、边缘网关层面、云服务器层面三个角度,介绍该安防摄像头方案的设计思路、数据链路以及各模块之间的分工。
2026-06-23 19:14:09
608
原创 i.MX6ULL USB 4G 模组工作原理与驱动适配流程
i.MX6ULL 通过 USB 控制 4G 模组;4G 模组负责连接运营商基站;Linux 最终通过移动网络上网。真正处理 4G 射频、基带协议、SIM 卡识别、运营商注册以及蜂窝网络连接的,并不是 i.MX6ULL 本身,而是 4G 模组内部的基带芯片和协议栈。i.MX6ULL 这边更多是把 4G 模组当成一个 USB 设备来枚举、识别和驱动。市面上的 USB 4G 模组并不是“完全免驱”。
2026-06-22 22:15:59
783
原创 i.MX6ULL USB WiFi 驱动解析:以 RTL8732bs 为例
RTL8723BU 本质上是一个 USB 接口的 WiFi/蓝牙组合芯片。
2026-06-22 11:19:15
561
原创 Hi3516CV100 RTSP 视频推流实操
RTSP 出流的主要流程如下:第一步,先加载 MPP 相关基础驱动:。该脚本会加载运行 MPP sample 所需的内核模块,例如ot_sys.ko、sensor I2C 驱动等。驱动加载完成后,用户态 sample 才能调用 VI、VPSS、VENC 等 MPI 接口。第二步,运行./。启动后,会先创建RTSP server 和 RTSP session。RTSP server 监听 554 端口,session 对应访问路径/test.264。
2026-06-19 20:38:36
613
原创 Hi3516CV610 sdk 源码学习
1、Hi3516CV610 SDK 顶层目录主要包含 open_source、package、platform、scripts 和 smp 等部分,各目录功能如下:① open_source:第三方开源组件和基础系统组件目录,主要包含 Linux、U-Boot、BusyBox、OP-TEE、mtd-utils 等源码、补丁及相关构建入口。② package:SDK 原始压缩包目录,用于存放 open_source、platform、smp 等模块的压缩包。
2026-06-18 21:40:10
594
原创 HDMI 信号质量对 SoC RX 锁定与出图稳定性的影响
因此,放宽 clock jitter 限制只能提高 SoC RX 对差质量信号的容忍度,并不能从根本上解决信号质量问题。真正要提高稳定性,仍然需要从硬件链路上优化,例如减少中间级联芯片、优化差分阻抗、缩短走线、减少过孔、选择合适带宽的 switch/mux、增加 redriver/retimer,或者降低 HDMI 传输速率。但是,HDMI 输入信号在经过 switch、hub、mux、连接器和 PCB 走线后,时钟和数据波形可能会发生形变,例如边沿变慢、振铃增加、噪声增大、幅度变小以及反射变严重。
2026-06-15 11:38:42
209
原创 i.MX6ULL 平台 TC358743 HDMI 输入驱动流程源码分析
HDMI 是一种可以同时传输视频、音频和控制信息的数字接口。不同 SoC 对 HDMI 输入/输出的处理方式可能不同,有些 SoC 内部集成 HDMI RX/TX 控制器,有些则需要外接桥接芯片,例如 TC358743 将 HDMI 输入转换为 MIPI CSI-2 输出。1、TMDS 差分信号线TMDS 差分线是 HDMI 中真正传输高速数据的通道,主要承载视频像素数据、音频数据以及部分控制信息。
2026-06-12 21:25:31
1141
原创 Hi3516CV610 摄像头从 MIPI 接入到视频采集的流程分析
MIPI 摄像头是一类通过 MIPI CSI 接口与主控芯片连接的摄像头,常见于手机、行车记录仪、IPC 摄像机等场景。与 USB 摄像头不同,MIPI 摄像头不会直接枚举成标准设备,而是需要 Sensor、MIPI RX、VI、ISP 等模块配合完成图像采集。Sensor 负责采集原始图像数据,并通过 MIPI CSI 总线发送给主控,主控再进行接收、处理和输出。MIPI 摄像头的引脚主要分为两类:控制引脚和数据引脚。I2C_SCL / I2C_SDA ---------> 配置 Sensor 寄存器。
2026-06-11 14:18:15
331
原创 i.MX6ULL 平台 V4L2 摄像头驱动框架解析
V4L2 的全称是,它是 Linux 内核中用于管理视频设备的一套统一驱动框架。简单来说,V4L2 为摄像头提供了统一的访问接口。应用程序不需要直接关心底层硬件的具体实现,只需要通过设备节点,就可以完成图像采集、格式设置、缓冲区管理等操作。常见的摄像头主要分为两类:一类是USB 摄像头,通常遵循 UVC 协议,由 Linux 的uvcvideo通用驱动支持;另一类是MIPI 摄像头。
2026-06-09 12:33:44
924
原创 IMX6ULL的SPI架构分析
SPI 是一种全双工串行通信协议,采用主从方式工作。SPI 总线上通常包含一个主设备和一个或多个从设备,主设备通过片选信号选择需要通信的从设备,并通过时钟线控制数据的同步传输。CSSCKMOSI和MISO。① CS是片选线,用于选择要通信的从设备。主机通信前拉低对应从设备的CS,通信结束后释放CS。SPI 不像 I2C 那样通过设备地址选择从机。② SCK是时钟线,由主机产生。SPI 属于同步通信,数据发送和接收都依赖SCK时钟。③ MOSI。
2026-06-04 23:26:13
488
原创 Linux SDIO驱动学习
SDIO 是在 SD 总线基础上扩展出来的外设通信接口,常用于连接 WiFi、蓝牙、GPS 等芯片。主机通过 CLK、CMD、DATA0~DATA3 等信号线与外部设备通信,其中 CLK 提供时钟,CMD 负责命令和响应,DATA0~DATA3 负责数据传输。。这四层从下到上分别负责硬件控制、总线管理、SDIO 设备识别以及具体芯片驱动。本文将围绕这四层,介绍 SDIO 通信的完整流程,并结合型号为的 SDIO WiFi 模块,说明其驱动移植过程。
2026-06-03 21:01:04
850
原创 i.MX6ULL USB 驱动分析——以 RTL8732 USB 设备为例
USB 驱动的作用,是让 Linux 内核能够识别、管理并和 USB 设备通信。以 i.MX6ULL 的 OTG2 接口连接 RTL8723BU USB WiFi 为例,整体流程可以1、usb phy层:首先,设备树中的usbphy2节点会被转换成,并匹配到,用于初始化 USB PHY 相关的硬件功能,例如 D+ / D- 信号、电源、时钟和线状态检测等。2、of platform层 :usbotg2节点会引用usbphy2。
2026-06-01 22:34:19
589
原创 IMX6ULL的Makefile分析
1、顶层 Makefile 首先处理内核配置。执行 make 100ask_imx6ull_defconfig 时,会借助 scripts/Makefile.build 找到 scripts/kconfig/Makefile,然后调用 scripts/kconfig/conf 读取 arch/arm/configs/100ask_imx6ull_defconfig,最终生成 .config 文件。
2026-05-30 15:51:22
414
原创 IMX6ULL的开机动画和U盘自动加载
总的来说,开机动画的实现就是将 psplash 集成到rootfs根文件系统中,并在生成的rcS启动脚本中调用 psplash。系统启动时,rcS脚本会启动 psplash,并通过更新启动进度和提示信息,从而实现开机 Logo 和进度条显示的效果。U 盘插入后,内核会先识别出块设备,例如/dev/sda1。因此,自动挂载的核心就是:在 U 盘插入并生成/dev/sda1后,自动执行上述mount命令。本方案通过udev实现自动挂载。udevd会监听内核产生的 uevent 设备事件,并匹配下的规则。
2026-05-29 01:49:15
699
原创 IMX6ULL的Busybox的根文件系统构建
今天我们来实现 i.MX6ULL 平台的 BusyBox 根文件系统构建。在BusyBox 根文件系统构建之前,先简单了解一下 BusyBox。BusyBox 可以理解为嵌入式 Linux 系统中的基础命令集合。它将 init、sh、ls、cp、mkdir、mount、mdev、ping、ifconfig 等常用工具集成到一个 /bin/busybox 可执行文件中,并通过软链接的方式提供不同命令功能。
2026-05-27 23:54:50
766
原创 IMX6ULL的Linux内核移植
本次工作主要是通过U-Boot 网络启动方式来验证移植后的 Linux 内核。首先,需要调通板卡网口,使开发板能够与 Ubuntu 虚拟机中的 TFTP 服务器正常通信。随后,在 U-Boot 中通过tftp命令,将 Linux 内核镜像zImage下载到内存地址0x80800000,再将与 ANGUS 板硬件匹配的设备树文件下载到0x83000000。启动 Linux 内核。在当前板级默认环境中,image默认设置为zImagefindfdt会根据因此,执行默认网络启动流程时,U-Boot 会加载。
2026-05-26 23:05:56
909
原创 IMX6ULL的Uboot的网卡调试
本篇博客主要介绍的相关内容。在调试网卡时,问题可能出现在多个环节,例如等。因此,本文会结合 i.MX6ULL 的 FEC2 MAC、LAN8720A PHY、设备树配置以及 U-Boot 网络驱动流程,分析网卡从初始化到收发数据的完整过程,并说明不同阶段出现问题时,应该重点排查哪些位置。
2026-05-25 21:13:04
399
原创 IMX6ULL的 Uboot启动流程分析
①进入_start入口U-Boot 镜像加载到内存后,CPU 会从入口符号_start开始执行。_start位于中,复位向量会跳转到里的reset。②执行reset早期初始化reset阶段主要完成 ARM 处理器的早期初始化,例如关闭 IRQ/FIQ、切换到 SVC 模式、设置异常向量地址,以及初始化 CP15、cache、MMU 等相关状态。③进入_main建立早期运行环境随后程序跳转到_main。_main位于,主要负责建立早期栈和gd,也就是。④执行。
2026-05-24 16:22:27
597
原创 Linux-4.9.88编译和启动分析
Linux 内核 zImage 的编译流程,本质上是围绕 vmlinux 的生成展开的。vmlinux 是生成 zImage 的前提,只有先链接生成完整的 vmlinux,后面才能继续生成 Image,并最终压缩成 zImage。vmlinux 主要由三部分组成:1. arch/arm/kernel/vmlinux.lds:链接脚本,决定内核入口地址和段布局;2. KBUILD_VMLINUX_INIT:启动和初始化代码,主要包括 head.o 和 init/built-in.o;
2026-05-24 01:41:47
721
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅