- 博客(83)
- 收藏
- 关注
原创 Linux按键输入实验
在前几章我们都是使用的GPIO输出功能,还没有用过GPIO输入功能,本章我们就来学习一下如果在Linux下编写GPIO输入驱动程序。I.MX6U-ALPHA开发板上有一个按键,我们就使用此按键来完成GPIO输入驱动程序,同时利用第四十七章讲的原子操作来对按键值进行保护。
2025-09-01 22:25:46
694
原创 Linux并发与竞争实验
在上一章中我们学习了Linux下的并发与竞争,并且学习了四种常用的处理并发和竞争的机制:原子操作、自旋锁、信号量和互斥体。本章我们就通过四个实验来学习如何在驱动中使用这四种机制。
2025-09-01 22:00:50
412
原创 Linux并发与竞争
Linux系统是个多任务操作系统,会存在多个任务同时访问同一片内存区域,这些任务可能会相互覆盖这段内存中的数据,造成内存数据混乱。针对这个问题必须要做处理,严重的话可能会导致系统崩溃。现在的Linux系统并发产生的原因很复杂,总结一下有下面几个主要原因:①、多线程并发访问,Linux是多任务(线程)的系统,所以多线程访问是最基本的原因。②、抢占式并发访问,从2.6版本内核开始,Linux内核支持抢占,也就是说调度程序可以在任意时刻抢占正在运行的线程,从而运行其他的线程。
2025-08-28 23:05:26
974
原创 Linux 蜂鸣器实验
上一章实验中我们借助 pinctrl 和 gpio 子系统编写了 LED 灯驱动, I.MX6U-ALPHA 开发板上还有一个蜂鸣器,从软件的角度考虑,蜂鸣器驱动和 LED 灯驱动其实是一摸一样的,都是控制 IO 输出高低电平。本章我们就来学习编写蜂鸣器的 Linux 驱动,也算是对上一章讲解的 pinctrl和 gpio 子系统的巩固。
2025-08-27 18:49:29
872
原创 GPIO子系统自主实现(简单版)
芯片内部有很多引脚,这些引脚可以接到GPIO模块,也可以接到I2C等模块。通过Pinctrl子系统来选择引脚的功能(mux function)、配置引脚:当一个引脚被复用为GPIO功能时,我们可以去设置它的方向、设置/读取它的值。GPIO名为"General Purpose Input/Output",通用目的输入/输出,就是常用的引脚。GPIO可能是芯片自带的,也可能通过I2C、SPI接口扩展:GPIO有一些通用功能、通用属性。
2025-08-25 22:01:21
1190
原创 Pin-Ctrl自主实现版本(简易版)
Pinctrl:Pin Controller,顾名思义,就是用来控制引脚的:引脚枚举与命名(Enumerating and naming)引脚复用(Multiplexing):比如用作GPIO、I2C或其他功能引脚配置(Configuration):比如上拉、下来、open drain、驱动强度等Pinctrl驱动由芯片厂家的BSP工程师提供,一般的驱动工程师只需要在设备树里:指明使用那些引脚复用为哪些功能配置为哪些状态在一般的设备驱动程序里,甚至可以没有pinctrl的代码。
2025-08-24 21:53:47
617
原创 pinctrl和gpio子系统实验
Linux驱动讲究驱动分离与分层,pinctrl和gpio子系统就是驱动分离与分层思想下的产物,驱动分离与分层其实就是按照面向对象编程的设计思想而设计的设备驱动框架,关于驱动的分离与分层我们后面会讲。本来pinctrl和gpio子系统应该放到驱动分离与分层章节后面讲解,但是不管什么外设驱动,GPIO驱动基本都是必须的,而pinctrl和gpio子系统又是GPIO驱动必须使用的,所以就将pintrcl和gpio子系统这一章节提前了。
2025-08-20 22:54:28
587
原创 设备树下的LED驱动实验
上一章我们详细的讲解了设备树语法以及在驱动开发中常用的OF函数,本章我们就开始第一个基于设备树的Linux驱动实验。本章在LED实验的基础上完成,只是将其驱动开发改为设备树形式而已。
2025-08-19 23:06:24
839
原创 Linux设备树简介
设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做DTS(DeviceTree Source),这个DTS文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU数量、 内存基地址、IIC接口上接了哪些设备、SPI接口上接了哪些设备等等。如图:树的主干就是系统总线,IIC控制器、GPIO控制器、SPI控制器等都是接到系统主线上的分支。
2025-08-18 23:48:38
936
原创 新字符设备驱动实验
1.经过前两章实验的实战操作,我们已经掌握了 Linux字符设备驱动开发的基本步骤,字符设备驱动开发重点是使用函数注册字符设备,当不再使用设备的时候就使用函数注销字符设备,驱动模块加载成功以后还需要手动使用mknod命令创建设备节点。和这两个函数是老版本驱动使用的函数,现在新的字符设备驱动已经不再使用这两个函数,而是使用Linux内核推荐的新字符设备驱动API函数。本节我们就来学习一下如何编写新字符设备驱动,并且在驱动模块加载的时候自动创建设备节点文件。1.
2025-08-16 20:39:46
498
原创 嵌入式 Linux LED 驱动开发实验
比 如 I.MX6ULL 的 GPIO1_IO03 引 脚 的 复 用 寄 存 器 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 的地址为。Linux 下的任何外设驱动,最终都是要配置相应的硬件寄存器。址上去,虚拟地址范围比物理地址范围大的问题处理器自会处理,这里我们不要去深究,因为。2.内存保护,设置存储器的访问权限,设置虚拟存储空间的缓冲特性。读取写内存地址,返回值就是读取到的数据。口进行配置,与裸机实验不同的是,在。的 内存就是物理内存,经过 MMU。,也就是内存管理单元。
2025-08-16 20:17:27
891
原创 Linux字符设备驱动开发
本文章的所有驱动开发使用的uboot为上一小节编译生成的uboot,使用的linux内核为正点原子编译好的内核,使用的根文件系统为正点原子搭建的。设备树和镜用TFTP的方式加载(上一小节已做详细说明),根文件系统用NFS挂载方式,在uboot下设置环境变量。(注意第一个ip为服务器的IP,后面是板卡的IP,顺序不要反,之前鄙人在此弄了好几天都没找到解决办法)由于字符驱动比较简单,在此不做过多的概念描述,直接上代码。
2025-08-11 21:55:39
822
原创 uboot使用指南
本节是 uboot的使用,所以就直接使用正点原子已经移植好的uboot,这个已经放到了开发板光盘中了,路径为:开发板光盘->1、程序源码->3、正点原子Uboot和Linux出厂源码。
2025-08-10 13:43:02
818
原创 hell world实验
的各种可配置块,其中灰色部分是固定的,绿色部分是可配置的,按工程实际需求配置。可以直接单击各种可配置块(以绿色突出显示)进入相应的配置页面进行配置,也可以选择左侧的页导航面板进行系统配置。用于设置生成过程中要使用的处理器的线程数,进行多线程处理,保持默认或设置为个人电脑处理器最大可使用线程数都可以,一般选择最大可使用线程数的一般。实际上这两个函数在该工程中并没有启动任何作用,因为这两个函数是针对于特定平台如Microblaze 的,对于我们使用的。这是创建工程的最后一步,显示工程摘要信息,如。
2025-01-15 17:04:44
995
原创 FPGA实战篇(UART通信实验)
另外还应该有一个对数据进行环回控制的模块,它负责把从串口接收模块接收到的数据送给串口发送模块,以实现串口数据的环回。其中,起始位标志着一帧数据的开始,停止位标志着一帧数据的结束,数据位是一帧数据中的有效数据。个停止位拉低,是为了确保发送模块发送数据的时间略小于接收模块接收数据的时间,否则当连续传输大量数据时,发送数据的时间会不断累积,最终导致在做串口环回实验时丢失数据。尽管串口发送数据只是接收数据的反过程,理论上在传输的时间上是一致的,考虑到我们模块里计算波特率会有较小的偏差,并且串口对端的通信设备(
2024-12-29 20:43:39
1108
原创 FPGA实战篇(fifo实验)
这里我们使用“即将写满”和“即将读空”这两个信号,所以我们把它们勾选上,其他保持默认即可,如下图所示。读模块的代码结构与写模块几乎一样,也是使用一个不断进行状态循环的小的状态机来控制操作过程,读者参考着代码应该很容易能够理解,这里就不再赘述。的区别是没有外部读写地址线,采取顺序写入数据,顺序读出数据的方式, 使用起来简单方便,由此带来的缺点就是不能像 RAM。FIFO 时,写端口和读端口分别有独立的时钟,所有与写相关的信号都是同步于写时钟 wr_clk。”一样的位宽,这也是在实际应用中最常用的情况。
2024-12-16 22:27:54
1660
原创 STM32关键字
1.volatile的作用:直接从内存中读取该变量,防止编译器优化。编译器默认用的是3,会优化,如果不想用该关键字,可以该为1,编译器就不会优化。2.何时使用该关键字
2024-12-16 21:21:20
213
原创 STM32调试技巧和嘀嗒定时器
1.在debug时,可以通过以下按钮观察内核的寄存器信息。2.内核架构3.嘀嗒定时器架构。时钟类型可选,中断也可选。
2024-12-15 21:51:26
326
原创 GD32中断
1.什么是中断:打断现在正在做的事,去执行其他事。2.ARM异常中断结构 3.中断向量编号。中断向量是 进行了映射的,直接映射到 flash中的地址。 4.中断执行结构。向量里面保存的是执行函数的地址。(具体可在编译完后的map文件中查看) 5.EXTI硬件结构 5.中断优先级 。(抢占优先级相同不抢占)
2024-12-10 21:42:53
243
原创 STM32F10X与GD32工程创建区别
1.宏定义区别 GD32虽然与STM32F10X的管脚兼容,但是用keil创建工程时,GD32在选择芯片型号的时候就已经自己定义了宏。STM32F10x需要手动定义宏。在以下界面定义用到的单片机。2.时钟区别。GD32最大时钟为120Mhz,所用的hal库里面的系统初始化会初始化时钟。STM32F10x最大时钟为72MHz,系统初始化没有初始化时钟,用的内部默认的低速时钟,需要手动初始化时钟。
2024-12-08 20:32:07
231
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人