- 博客(124)
- 收藏
- 关注
原创 FreeRTOS引入篇
本文主要介绍了单片机程序与RTOS的区别、CPU架构的概念及其重要性,以及堆和栈在程序中的使用。单片机程序类似于单任务服务员,一次只能处理一个任务,而RTOS则像多任务服务员,能够同时处理多个任务,提高系统效率。理解CPU架构对于RTOS的移植、性能优化和驱动开发至关重要。堆是动态分配内存的数据结构,由程序员手动管理,而栈是后进先出的数据结构,由操作系统自动管理,用于存储任务的局部变量和函数参数。堆和栈在内存分配和管理上有不同的特点和用途。
2025-05-19 01:00:00
890
原创 stm32之FLASH
本文系统梳理了STM32F1系列微控制器中的FLASH存储器结构及其工作机制,重点介绍了程序存储器、系统存储器和选项字节的布局与作用。结合官方手册,详细解析了FPEC(FLASH程序/擦除控制器)的寄存器配置,阐述了写保护机制、页擦除流程和编程操作的具体步骤。通过图示与流程讲解,帮助读者深入理解FLASH的擦写原理及其在嵌入式开发中的实际应用
2025-05-14 21:19:56
1457
原创 stm32之PWR、WDG
这篇文档系统介绍了 STM32 的 PWR(电源控制)模块,内容涵盖电源框图、PVD(可编程电压检测器)配置、中断处理流程,以及睡眠、停止、待机三种低功耗模式的原理与实现方法。通过图文并茂的方式,详细讲解了各模式下的寄存器配置要点,并配有完整的示例代码,便于读者快速上手与应用。适用于需要优化系统功耗管理的 STM32 嵌入式开发者,具有较强的实用价值与参考意义。
2025-05-13 21:13:40
1173
1
原创 stm32之BKP备份寄存器和RTC时钟
讲解Unix时间戳、UTC/GMT的概念,以及时间戳转换的相关函数;讲解BKP使用的注意事项和功能;讲解RTC时钟的主要特性、访问流程、典型应用、详细结构、基本结构以及硬件电路涉及还有使用注意事项。通过实验代码来理解BKP和RTC。
2025-05-12 20:39:21
1155
原创 stm32之SPI
详细讲解SPI通信协议:硬件电路、移位、时序基本单位;同时讲解W25Q64的硬件电路、结构,包括写操作和读操作的注意时间。讲解stm32f103的SPI外设:基本结构、传输时序图(主模式全双工连续传输和非连续传输),与软件模拟SPI的波形对比,还有介绍SPI的相关结构体和API函数,带你学会SPI。
2025-05-11 20:41:00
1232
17
原创 stm32之IIC
万字讲解关于stm32f103的IIC,包括I2C的硬件电路、时序基本单位、时序实例。讲解IIC通信外设的框图、基本结构、主机发送和接收。同时讲解IIC相关的结构体和API函数,并采用硬件方式去使用MPU6050
2025-05-10 22:46:37
1349
2
原创 stm32之USART
万文讲解stm32f103串口,讲解USART的基本结构体、数据帧、波特率发上去、数据包(包括数据模式、HEX数据包、文本数据包、以及数据包的接收),同时讲解USART的相关结构体和API函数,实现串口发送+接收吗,HEX数据包收发以及文本数据包收发。此外还涉及FLYMcu串口下载和SRLINK Utility。
2025-05-09 22:24:28
1235
13
原创 stm32之DMA
详细讲解关于stm32f103的DMA直接存储器存取,包括存储器映射、DMA框图、基本结构体介绍、DMA请求内容、数据宽度与对齐、DMA如何进行工作(数据转运和ADC扫描模式)。以及介绍DMA相关的结构体和api函数,包括DMA转运和AD多通道讲解。
2025-05-08 21:36:11
1808
10
原创 stm32之ADC
对ADC模拟-数字转换器进行详细讲解,包括逐次逼近型ADC、ADC基本结构、输入通道、转化模式、触发控制、数据对齐、转换时间、校准、ADC外围电路。同时对ADC的相关结构体和API函数进行介绍,以及ADC单通道和多通道实验
2025-05-07 20:44:30
1754
15
原创 stm32之输出比较OC和输入捕获IC
2万字带你学习stm32输出比较OC、输入捕获IC以及其相关的结构体和API介绍。详细讲解PWM的基本结构体以及易混淆点,同时包括呼吸灯、舵机、直流电机、TIM编码器接口的实验,文章附带相关的实验代码下载。
2025-05-06 21:38:26
1130
18
原创 stm32之TIM定时中断详解
万文带你认识stm32f103的TIM定时器,涵盖通用、普通、高级定时器各部分介绍(触发控制单位、输入捕获单元、输出比较单元、CNT计数器、ARR、PSC灯),并讲解基本使用:包括结构体介绍和基本常用函数介绍。
2025-05-05 15:58:40
1855
24
原创 no source: Error: command-line: #564: cannot open embedded assembler output file
Keil出现“no source“: Error: command-line: #564: cannot open
2025-04-28 23:49:15
316
2
原创 stm32之EXIT外部中断详解
一文带你详细认识中断的处理流程和如何编写中断代码。从stm32f103入手详细讲解中断路径上的3个部件以及中断的流程(AFIO、EXIT、NVIC、CPU)。通过旋转编码器的代码来进一步认识exit外部中断,同时对exit的相关结构体和函数进行讲解。
2025-04-26 23:07:08
1850
16
原创 stm32之GPIO函数详解和上机实验
stm32标准库中,关于GPIO全部函数的介绍以及GPIO结构的讲解。全文提供源代码下载:LED和蜂鸣器介绍和上机实验;光敏传感器的使用介绍:如何通过光敏传感器去控制蜂鸣器;OLED的使用。
2025-04-24 00:14:08
1367
14
原创 stm32之GPIO输入输出讲解
GPIO引脚可配置为数字输入或输出,也支持模拟信号输入。其工作模式包括浮空输入、上拉输入、下拉输入、模拟输入以及不同的输出模式,如开漏输出、推挽输出等。GPIO通过内置的寄存器控制引脚状态,提供了高效的电平控制功能。对于输入模式,GPIO能读取外部信号的电平,用于按钮、传感器等的状态监测;而在输出模式下,GPIO可以驱动LED、蜂鸣器等外部设备。
2025-04-23 03:15:00
1055
10
原创 SPI_Master驱动框架深入分析和实现
本文详细探讨了SPI(Serial Peripheral Interface)传输过程中的数据流动,从基本的SPI传输结构体到实际的传输过程。首先,回顾了SPI传输流程,并以写操作为例,详细介绍了在Linux内核中如何通过SPI控制器进行数据传输。接着,文章分析了SPI控制器驱动中的两种传输方法:旧的transfer方法和新的transfer_one方法,重点剖析了内核中如何利用spi_message和spi_transfer完成数据传输。通过对spidev_write、spidev_sync_write等
2025-04-21 07:00:00
859
原创 SPI接口DAC设备驱动与应用程序开发
本文介绍了基于SPI接口与DAC设备进行通信的驱动与应用程序开发。首先,详细阐述了SPI通信协议在DAC(数字-模拟转换器)中的应用,涉及了SPI设备的基本配置与测试方法。通过内核提供的spidev驱动程序,开发者能够与SPI设备交互,实现数据读取与发送功能。文章深入解析了代码实现,包括如何通过ioctl命令读取设备状态、发送消息和读取数据等操作。同时,还介绍了如何为DAC设备编写驱动程序和设备树配置,确保系统能够与硬件正确通信。
2025-04-14 22:36:04
1269
1
原创 spidev.c:SPI设备驱动的核心实现逻辑
本文以Linux内核的spidev驱动为例,解析SPI设备驱动实现逻辑。spidev_probe通过动态分配spidev_data结构体管理设备号、锁及SPI设备实例,利用device_create创建设备节点。数据传输通过spi_sync同步接口实现用户态与内核缓冲区的交互,spidev_ioctl支持模式、速率等参数的动态配置。
2025-04-09 10:06:31
1057
原创 SPI传输与驱动框架的实现
本文详细介绍了SPI(Serial Peripheral Interface)通信的基本概念、接口函数和驱动框架的实现方法。通过分析内核中spi.h头文件中的简易函数与复杂函数,展示了如何实现同步、异步的SPI数据传输,包括常用的spi_write、spi_read、spi_sync等函数的使用。同时,讲解了spi_transfer结构体在传输中的作用,以及如何通过多个传输任务构建一个完整的SPI事务。通过示例代码,展示了如何在Linux驱动中实现SPI设备的数据传输和如何根据设备树配置SPI控制器与设备。
2025-04-08 00:39:39
1193
原创 SPI通信协议与Linux设备驱动框架解析
SPI是一种高速全双工的同步串行通信协议,采用主从架构,通过MOSI、MISO、SCK和CS四线实现设备间数据交互。其核心特性由时钟极性(CPOL)和相位(CPHA)定义四种工作模式,模式0(上升沿采样)和模式3(高电平初始+上升沿采样)最为常用。在Linux驱动框架中,SPI子系统由控制器(spi_master)和设备(spi_device)构成,驱动层通过spi_driver实现设备绑定与数据传输,关键函数包括旧版transfer(消息队列)和新版transfer_one(单次传输优化)
2025-03-24 08:00:00
1107
原创 24年总结 -- 共赴心中所向往的未来
我又回来了,前阵子忙着期末考试的东西,也是快半个月没更新了,刚好前几天报名了博客之星的评选,也很幸运的入围了,也借此机会来回顾一下关于2024年的个人成长、创作经历等。
2025-01-20 10:46:49
2113
43
原创 PCIe设备MSI/MSI-X中断源码分析与驱动编写
本文详细分析了PCIe设备中断分配过程,特别是如何通过内核代码启用MSI-X和MSI中断。介绍了如何在设备驱动程序中使用pci_alloc_irq_vectors分配中断向量,包括MSI-X、MSI和传统的INTx中断机制。探讨了如何通过__pci_enable_msix_range和__pci_enable_msi_range为设备分配中断向量,处理中断亲和性设置,并确保设备没有重复的中断请求。通过描述如何通过msi_domain_alloc_irqs和irq_domain分配硬件IRQ以及如何激活IRQ
2025-01-06 00:09:36
1244
4
原创 GICv2与GICv3中断架构对比与LPI中断机制分析
本文章深入分析了ARM架构中通用中断控制器(GIC)的两种版本:GICv2与GICv3,重点讨论了其在中断管理方面的不同特点和进化。首先介绍了GICv2中断类型,包括软件触发中断(SGI)、私有外设中断(PPI)和共享外设中断(SPI),并讨论了传统的物理信号线路传递方式。接着,详细分析了GICv3的创新,尤其是如何通过MSI(方式触发SPI中断,并引入了LPI机制,显著提高了虚拟化环境中的中断处理能力。文中还阐述了LPI的触发方式及其在GICv3中如何通过寄存器与表格查找机制实现低延迟的中断传递。
2025-01-02 00:17:21
2458
26
原创 RK3399 PCIe 中断处理与映射分析(INTx中断机制源码分析)
本篇文章深入分析了 RK3399 平台上 PCIe 中断处理与映射的全过程,结合相关文档和开发板资料,详细介绍了 PCIe 设备、控制器和中断管理系统的工作机制。文从 PCIe 设备发生中断的流程入手,逐步分析了 PCIe 控制器如何将中断信号传递到 GIC(通用中断控制器)以及最终处理的过程。探讨了设备树中中断定义与映射的作用,特别是如何通过 interrupt-map 和 interrupt-map-mask 在设备树中为 PCIe 设备分配中断号。此外,还分析了如何通过创建 IRQ 域以及相应的中断控
2024-12-30 13:53:51
1531
30
原创 MSI-X中断机制、MSI/MSI-X操作流程详解
MSI和MSI-X是PCI/PCIe设备中用于替代传统中断机制(INTx)的两种高效中断机制。与传统方法依赖物理引脚不同,MSI/MSI-X通过发送消息触发中断,具备更高的灵活性和性能。MSI支持最多32个中断向量,适用于一般设备;而MSI-X支持多达2048个中断向量,适合复杂、高性能设备。MSI-X将中断信息存储在设备内存空间中的MSI-X Table和Pending Bit Array中,并允许每个中断向量拥有独立的地址和数据,显著提升并行处理能力。
2024-12-29 00:22:23
1826
34
原创 PCI/PCIe设备INTx中断机制和MSI中断机制
本文档详细解析了PCI/PCIe设备的中断机制及其实现原理,重点阐述了INTx、MSI和MSI-X三种中断方式的差异及特性。通过结合硬件示意图和寄存器配置,对INTx传统中断的物理引脚通信、PCIe通过TLP模拟INTx的兼容方式、以及MSI基于消息传递机制的高效中断实现进行了深入剖析。此外,还详解了MSI/MSI-X中断在PCI配置空间中Capability结构的作用及具体配置方法,解释了中断地址与数据的分配、控制寄存器的意义、以及中断向量的扩展功能。
2024-12-26 00:08:47
2063
36
原创 PCIe_Host驱动分析_设备枚举
本文通过深入分析 pcie-rockchip.c 文件,详细解读了 Rockchip PCIe 驱动中关键的资源管理与设备配置过程。文章首先回顾了 PCIe 控制器的资源解析机制,包括设备树中地址资源的解析与映射,将资源信息记录到链表中的具体实现。接着,对 PCIe 配置空间的基本概念和 BAR(Base Address Register)的结构与用途进行了说明,分析了如何通过配置空间确定设备所需的内存或 I/O 地址范围及分配策略。此外,文章重点剖析了 PCIe 总线扫描和设备初始化的核心代码
2024-12-23 22:48:37
1491
33
原创 PCIe_Host驱动分析_地址映射
本文针对RK3399开发板的PCIe控制器驱动程序,解析了其实现原理和流程。首先,通过设备树文件获取控制器寄存器和Region 0的配置空间地址,确保CPU能够访问PCIe设备的配置空间。随后,从设备树中解析ranges属性,获取Region 1~32的CPU和PCIe地址空间基地址,用于内存和I/O资源的映射。驱动程序通过配置寄存器,实现CPU地址空间与PCIe地址空间的映射关系,确保CPU能够通过转换后的PCIe地址(addr_pcie)直接与外设交互。
2024-12-21 22:15:37
1427
34
原创 深入解析PCIe地址空间与寄存器机制:从地址映射到TLP生成的完整流程
本文详细解析了PCIe控制器的地址空间划分、寄存器配置及其在主机与PCIe设备之间通信中的核心作用。从两个主要的地址空间(内部寄存器和远程设备)入手,分析了其地址映射机制和分区设计,并解释了如何通过Region映射访问外部设备的配置空间和内存空间。结合寄存器功能,本文介绍了如何通过地址转换寄存器和描述符寄存器生成TLP,实现主机对PCIe设备的精确操作。此外,还通过具体示例演示了配置空间和内存/IO空间的读写流程,以及如何通过寄存器配置实现对PCIe设备的访问和控制,帮助读者全面理解PCIe通信的底层实现。
2024-12-19 00:02:39
2644
35
原创 PCI驱动与AXI总线框架解析(RK3399)
本文介绍了PCI驱动框架和AXI总线在嵌入式系统中的应用。PCI驱动分为PCI Host(Root Complex, RC)和PCIe设备两个部分,RC通过设备树和平台总线完成初始化,扫描挂载的PCIe设备,生成pci_dev结构体;PCIe设备通过匹配pci_driver完成初始化,使其正常工作并与RC通信。此外,文章详细描述了PCIe设备资源分配中BAR寄存器的配置过程。对于AXI总线,以RK3399为例,解析了CPU与外设之间的通信,通过五大通道和丰富的信号集实现高效的数据传输。
2024-12-16 00:10:10
1593
45
原创 PCIe的三种路由方式
PCIe协议定义了三种路由方式:基于ID的路由、基于地址的路由和隐式路由,用于实现设备间高效的数据传输。基于ID的路由通过设备的Bus、Device、Function号标识目标,用于设备配置和响应。基于地址的路由依赖分配的内存或I/O地址,用于数据读写。隐式路由则无需明确目标设备,通过消息类型或特定字段确定传输路径。PCIe桥和设备根据配置阶段的分配信息决定报文的转发或接收,确保网络的高效通信。这些路由方式相辅相成,构建了灵活的PCIe通信机制,支持多设备协同与高性能数据交互。
2024-12-13 00:00:33
1563
44
原创 深入解析PCIe设备事务层与配置过程
本文通过剖析PCI Express(PCIe)协议的事务层(TLP)结构和配置过程,详细阐述了PCIe系统硬件结构及数据传输的关键机制。重点关注Posted与Non-Posted事务的差异、TLP格式中各字段的功能,以及PCIe设备的配置空间访问逻辑。文章介绍了设备地址映射机制及BAR寄存器在PCIe地址解析中的作用,并通过具体示例解析了多级桥接设备的枚举和配置过程。这一系统性探讨有助于理解PCIe数据传输效率优化及复杂网络架构的实现方法,为从事硬件设计和系统集成的专业人士提供了实用参考。
2024-12-11 00:07:08
1288
35
原创 PCI桥设备的访问方法、软件角度讲解PCIe设备的硬件结构
介绍了PCI桥设备如何在PCI总线中传递配置命令,涉及设备地址空间的管理与配置过程。详细讲解了PCIe的硬件接口,强调了差分信号在高速数据传输中的重要性,及其在传输过程中如何减少噪声干扰、保证信号完整性。不同于传统的并行PCI接口,PCIe采用串行通信方式,通过点对点链路提升带宽与扩展性。从软件层面分析了PCIe协议的三层结构(事务层、数据链路层、物理层),逐步解构了PCIe数据传输的封装与传输机制,包括事务层的TLP封装、数据链路层的错误校验与确认机制、以及物理层的信号传输与编码方式。
2024-12-09 00:24:34
1801
31
原创 深入解析非桥PCI设备的访问和配置方法
本文详细解析了PCI/PCIe设备的访问与配置流程,分步骤讲解了如何通过主机读取设备配置信息、分配地址空间,以及实现CPU地址空间与PCI/PCIe地址空间的转换。重点剖析了PCI/PCIe设备的硬件结构、配置空间的组织及功能,介绍了配置事务的实现方式和具体的配置过程。此外,文中通过对PCI本地总线信号分类及其功能的分析,阐明了PCI设备在访问内存空间和I/O空间时的核心机制。最后,通过配置PCI Agent设备的示例,直观展示了如何为设备分配资源并完成数据传输。
2024-12-07 00:09:15
2270
32
原创 嵌入式系统的内存访问和总线通信机制解析、PCI/PCIe引入
本文探讨了嵌入式系统中内存与外设通信的基础原理,涵盖从简单的“ram-like”设备读写操作到复杂的外设控制器工作机制。文章首先分析了内存控制器如何通过地址范围映射与片选信号实现对多种设备的高效管理,接着以 eMMC 和 PCI/PCIe 为例,详细说明控制器的功能及其对协议转换、数据管理和传输优化的关键作用。同时,通过形象的类比展示了不同设备间地址空间的分层结构,并对 PCI 和 PCIe 接口的信号定义及差异进行了比较。
2024-12-06 00:20:54
1566
40
原创 Linux内核早期打印机制与RS485通信技术
本文围绕Linux内核早期打印机制和RS485通信技术展开,详细解析了early_printk和earlycon的实现与使用场景,以及RS485的基础原理和应用实践。在早期打印部分,阐明了early_printk和earlycon的区别:前者通过手动实现打印函数实现早期日志输出,后者则结合设备树实现灵活硬件映射,适用于现代系统。在RS485部分,介绍了其差分信号传输、抗干扰能力强等技术特点,并结合SP3485芯片说明了发送与接收的硬件原理,同时提供了Linux环境下的标准驱动编程示例.
2024-12-05 00:01:19
1737
38
原创 深入解析Linux内核Console框架及虚拟UART控制台的实现
本文深入探讨Linux内核的Console框架,解析其设计思路及作用,特别是在TTY框架基础上构建Console接口的意义。从内核日志输出与人机交互需求出发,剖析Console结构体的关键字段和功能。同时,结合具体代码实例,展示如何编写虚拟UART控制台驱动,包括控制台的初始化、日志写入、与TTY设备的绑定等过程。通过对驱动注册、命令行参数解析及设备关联的详细介绍。
2024-12-04 00:01:59
1791
66
原创 Linux 内核日志系统—printk的机制与应用
在 Linux 内核开发中,printk 是最常用的调试工具之一,主要用于输出内核日志信息。printk 不仅类似用户空间的 printf,还提供了日志级别管理功能。本文系统梳理了 printk 的使用方法、日志级别管理、日志信息的存储位置,以及输出过程的核心机制。通过解析源码和示例,详细展示了如何利用 console_loglevel 等宏调控日志输出行为,并剖析了内核是如何通过call_console_drivers 将日志发送到不同设备。
2024-12-01 07:30:00
3435
82
原创 深入浅出UART驱动开发与调试:从基础调试到虚拟驱动实现
本文全面介绍了UART驱动开发与调试的关键技术和方法。首先,通过分析UART驱动中接收和发送数据的流程,展示了如何在中断函数中捕获数据,以及利用proc和sys文件系统获取串口信息。接着,深入探讨了如何实现虚拟UART驱动,包括核心数据结构、环形缓冲区设计、中断处理机制、文件操作接口以及设备树的集成方式。文章还包含详细的代码解析,展示了虚拟串口与用户空间的交互实现。
2024-11-28 10:17:10
6500
82
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人