自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 嵌入式基础知识复习(C语言)

C语言作为计算机科学领域最具影响力的编程语言之一,自1972年诞生以来,一直是系统编程和底层开发的首选工具。本文将全面介绍C语言的发展历程、语言特点、标准演进以及广泛的应用领域。

2025-07-28 22:21:05 861

原创 uart通信

用户程序操作UART仅需文件接口,内核驱动和设备树已完成底层硬件抽象。特殊场景(如自定义协议)才需扩展内核驱动,多数情况下直接调用。

2025-07-27 22:20:32 591

原创 spi通信

spi协议一般有这几根线有:cs(片选线使能,选择设备)、mosi(主出从入)、miso(主入从出)、scl。另外实际电路连接还需要vcc、gnd 具体细节见前瞻结束spi是全双工同步串行通信,速度快,达几十mb,适合屏幕通信。i2c速度在100k到几mb直接、但是传输比spi稳定,适合传感器采集。spi采用边沿采样,这也是其采样速率高的原因。spi不同模式下采样方式有所不同,有四种模式:spi缺点就是接线麻烦一些,每个设备一根cs线。在内核驱动

2025-07-27 18:19:31 772

原创 bmp280的压力数据采集(i2c设备驱动+设备树编写)

计算温度值(单位:0.01°C):计算压力值(单位:Pa,Q24.8格式)

2025-07-26 16:19:40 1000

原创 platform平台驱动、gpio单总线通信

不需要总线的:led灯控制、beep、按键需要总线通信的:基于gpio的单总线通信的传感器:ds18b20、dht11、超声波测距基于i2c总线:LM75基于spi总线:ADXL345总线通信需要总线控制器总线协议在软件代码的体现其实就是按照传感器时序图进行复位、读写操作。所以单总线协议就是指按照传感器手册的复位时序图进行复位,然后用读写时序图读写,就算是单总线协议了吗是的,。单总线协议是一种。

2025-07-23 20:33:39 753

原创 定时器、延时

(在等待期间):定时器基于内核的机制,由系统时钟中断(tick)驱动。在定时器到期前,,定时器只是挂载在队列中。到期时通过触发回调函数(如timer_fun),此时会短暂占用 CPU。:依赖jiffies(通常 1ms~10ms 精度)。:适合延迟执行非实时任务(如你的 LED 控制示例)。ndelayudelay通过空循环消耗 CPU 周期实现精确短延时(见前文分析)。,期间不能调度其他任务。(纳秒/微秒级)。(如中断、自旋锁内)。

2025-07-22 15:19:49 826

原创 按键驱动(非阻塞)、中断、等待队列、按键(阻塞)

调用read()write()时,进程会一直阻塞,直到数据就绪或超时。// 阻塞直到数据到达:简单直接。:无法同时处理多个 I/O 操作。:通过O_NONBLOCK标志设置,read()write()立即返回,如果没有数据就返回EAGAIN。// 设为非阻塞// 忙等待(不推荐,仅示例):避免进程阻塞。:需要轮询检查状态,浪费 CPU。:通过selectpollepoll同时监控多个文件描述符,当任意一个就绪时返回。epoll):// 注册 fd// 阻塞等待。

2025-07-22 12:02:23 723

原创 单向链表、双向链表、栈、队列复习(7.14)

1、数据结构:相互之间存在一种或多种特定关系的数据元素的集合。逻辑结构:集合,所有数据在同一个集合中,关系平等。线性,数据和数据之间是一对一的关系树, 一对多图,多对多物理结构(在内存当中的存储关系)顺序存储,数据存放在连续的存储单位中。逻辑关系和物理关系一致。需预先分配空间,大小固定。插入删除需移动大量数据。可以通过下标直接访问指定数据链式,数据存放的存储单位是随机或任意的,可以连续也可以不连续。不需要预先分配,大学可变,动态分配。新节点插入删除容易。

2025-07-15 00:08:05 349

原创 触控屏gt1947

比较器判断是否翻转,周期控制器负责控制周期(period)。sample采器有多个影子,每次采样查看是否到了翻转的时候。

2025-07-11 21:48:22 222

原创 I2C集成电路总线

设备之间的通信都是由主设备发起的,从设备被动应答主设备。设备地址类似一个人的名字,因为在I2C总线通信过程中,无论哪个设备发送数据,其他所有设备都能够监听得到,所以每次通信时,主设备先发送要访问的子设备地址,每个子设备都把监听到的这个地址拿来跟自己进行匹配,只有匹配成功的子设备才是真正需要操作的设备。最后一个寄存器就是 I2Cx_I2DR,这是 I2C 的数据寄存器,此寄存器只有低 8 位有效,当要发送数据的时候将要发送的数据写入到此寄存器,注意此时LSB代表的是数据流向,需要按照实际情况设置为1或者0;

2025-07-11 21:47:44 652

原创 线程邮箱(线程间通信的异步缓存机制)

1、避免网络异常引起数据丢失,利用队列缓存。2、降低线程间耦合度。

2025-07-11 21:46:55 235

原创 【无标题】

2、阻塞io wait_event + 中断(wake_up)4、多路复用io poll事件加入等待队列,中断(唤醒等待队列)platform_device设备,自己注册平台信息 / 设备树文件直接转换为平台信息。platform_bus_type总线(linux内核写好了,我们写另两个)1、中断顶半部:完成基本中断响应。总线通信:串口、usb、i2c、spi、pcie。一、内核定时器(依赖于中断底半部,软中断机制)2、中断底半部:完成耗时操作。

2025-07-10 17:21:44 227

原创 嵌入式自学(7.9)

misc_register:注册混杂设备,主设备号10,次设备号每增加一个设备加一。驱动分层:misc混杂设备:如led、beep就可以放进去,不需要自己构建设备。​​​​​​ device_create_file创建设备调试节点。5、进程状态:运行态、睡眠态(可中断、不可中断)、僵尸态、暂停态。alloc_chrdev_region//构建设备号范围。cdev_add//添加到cdev内核结构。device_create_file 创建调试节点。cdev_alloc//申请cdev。

2025-07-10 09:14:19 382

原创 linux内核两大思想:驱动和设备分离思想、分层思想

由于Linux系统设计的初衷是在不同的平台上都能运行Linux系统,如果按照之前的驱动写法,每个硬件平台由于寄存器不同,我们需要编写不同的驱动代码以适配对应的硬件平台,这个对我们来说过于麻烦,所以我们想把适用于所有平台的通用代码与只能运行在专一平台的专用代码进行分离。不同硬件平台最大的区别在于寄存器,而每个硬件平台都需要完成对LED灯的点亮和熄灭操作,所以每次最好将硬件平台的寄存器信息传递驱动,然后驱动拿到硬件平台的设备信息,再针对此设备进行操作,即设备与驱动分离思想。

2025-07-08 17:53:09 882

原创 字符设备驱动框架和sys文件----led灯驱动(7.5-7.7)

它提供了一种统一的接口,用于查看和操作设备、驱动程序、文件系统等内核对象。sysfs存放在内存中,挂载在/sys目录下,文件系统中的文件不对应硬盘上任何文件。1. 设备信息显示:将内核对象(设备、驱动、总线等)的属性以文件形式展示在/sys目录下,例如设备状态、配置参数、硬件拓扑等。2. 动态设备管理:实时反映系统设备变化(如热插拔),目录结构随设备增删动态更新支持设备分类。*字符设备驱动加载到Linux内核方式:静态加载和动态加载。,编译到内核中, Linux内核启动后直接拥有了该内核模块。

2025-07-08 00:18:16 1549

原创 u-boot编译及源码分析、linux内核编译及裁剪

bootcmd保存着uboot默认命令, uboot倒计时结束以后就会执行bootcmd中的命令。uboot是bootloader的一种,主要作用是在内核加载前对硬件设备初始化,并为内核的运行提供引导功能。V=0:控制编译输出的详细程度, 0表示启动静默/精简输出模式, 1表示完整的编译命令,便于调试。2. uboot图形界面是基于ncurses库编写的,所以需要先安装该库。生成的结果文件主要是位于uboot顶层目录的: u-boot.imx文件。1. 解压uboot压缩包,并进入uboot源码目录。

2025-07-06 17:32:09 692

原创 Linux系统移植(7.4)

昨日回顾:系统移植一、linux系统:1、u-boot 引导加载内核 2、zImage 内核镜像 3、.dbt设备树文件 4、rootfs 文件系统二、硬件资源:im6xull 芯片内部:96k rom(原厂启动代码)、 128k ram(在DDR初始化前为系统提供运行空间) cache(i、d、L2) 芯片外部

2025-07-06 15:54:50 697

原创 Linux内核驱动(前言、工程环境搭建及linux系统移植)(7.3)

驱动开发难点:1、c语言基础 2、工程环境搭建(脚本、makefile、apt-get软件下载工具、网络配置) 3、编程思想(多年优化后的源代码可能难理解,一些编程框架理解起来困难) 4、数据结构(内核链表高集成度不熟悉) 5、硬件操作、通信调试方法(逻辑分析仪使用、芯片手册阅读、内存泄漏调试、栈崩溃调试)可以把bootloader看作一个软件、代码等,即uboot.bin,完成硬件初始化、引导内核启动、给内核传参(比如各种需要的文件在哪)。

2025-07-03 23:39:35 1325

原创 时钟(6.25-26)

1、PLL1的设置, PLL1又称ARM_PLL,这个PLL的设置是通过寄存器CCM_ANALOG_PLL_ARMn来设置的(第714页)下图。我们之所以要设置AHB_CLK_ROOT 、 IPG_CLK_ROOT和PERCLK_CLK_ROOT的时钟,是因为我们之后的外设实验需要使用这三个时钟,从时钟树图中可以看出: IPG_CLK_ROOT和PERCLK_CLK_ROOT分别给ADC和I2C外设提供时钟,这两个外设是我们之后要学习的重点,而这两个根时钟又是由AHB_CLK_ROOT 提供时钟的。

2025-07-02 23:16:40 1087

原创 imx6ull芯片中断机制6.24-6.25

此外GIC还有一个GICC_EOIR寄存器,当我们处理完中断之后,要通知GIC我们已经处理好中断了,否则, GIC会认为中断未处理,还会再次触发中断处理,我们通常把这个过程称为清除中断标记,只不过这里清除的是GIC的中断标志。由于不同的中断源对应不同的中断处理函数, I.MX6U 有 160 个中断源,所以需要 160 个中断处理函数,我们可以将这些中断处理函数放到一个数组里面,中断处理函数在数组中的标号就是其对应的中断号。6、当多个中断到来的时候,选择优先级最高的中断通知给 CPU Core。

2025-07-01 23:41:04 984

原创 adc模数转换器

一般采用逐次逼近法的ADC会先拿采用电压Vadc跟基准电压Vref的1/2进行比较,如果Vadc>Vref,则结果为1,否则结果为0。比如一个比较了8次的ADC外设,它就称为8位ADC,其结果是0~255之间的一个数值,设该数值为n,那么实际电压就是Vref * (n/255)。➢ I.MX6ULL的时钟源可以是igpclk、 igpclk/2和ADACK,其中ADACK是I.MX6ULL内部提供的时钟源,只能提供给ADC外设使用,这样做的目的是保证系统处于低功耗状态时, ADC依旧能够运行。

2025-07-01 17:06:27 753

原创 LCD驱动编写

LCD 显示器都是由一个一个的像素点组成,像素点就类似一个灯(在 OLED 显示器中,像素点就是一个小灯),这个小灯是 RGB 灯,也就是由 R(红色)、 G(绿色)和 B(蓝色)这三种颜色组成的,而 RGB 就是光的三原色。我们的计划是这样的:选通PLL5作为时钟源是肯定的,这里先把PLL5的倍频因子设置为42,那么从PLL5输出的频率就是1008MHz,之后在2这个位置4分频,再在3这个位置8分频,那么结果为1008/4/8=31.5MHz,最后再把4这个位置选通就OK了。

2025-06-30 20:25:24 904

原创 uart串口通信(6.26)

CCM_CSCDR1 的 UART_CLK_SEL(bit)位来选择的,当为 0 的时候UART 的时钟源为 pll3_80m(80MHz),如果为 1 的时候 UART 的时钟源为 osc_clk(24M),一般选择pll3_80m 作为 UART 的时钟源。寄存器 CCM_CSCDR1 的 UART_CLK_PODF(bit5:0)位是 UART 的时钟分频值,可设置 0~63,分别对应 1~64 分频,一般设置为 1 分频,因此最终进入 UART 的时钟为80MHz。我们需要1分频,即为b101。

2025-06-29 22:08:18 793

原创 利用imx6ull板学习裸机arm板开发(6.22-6.24)

一、代码编写编译环境:代码编写:在windows下载一个vs code编写源码,通过FiliZilla软件上传到ubantu,编译:在linux的ubantu终端编译。具体步骤: 1、在https://www.filezilla.cn/download下载FileZilla,FileZilla作为客户端, Ubuntu作为服务端。此外还需要在Ubuntu下安装SSH服务器: sudo apt-get install vsftpd ,并配置文件: sudo vi /etc/vsftpd.conf

2025-06-29 18:08:39 1601

原创 spi `

mosi主出从入 miso主入从出 sclk时钟同步 cs片选信号:低电平有效。分辨率+-1024 量程 +-16g 速率1000`数据流结构体:设备地址、寄存器地址、寄存器长度、数据、总长度。cpha:时钟相位,0第一个边缘到来采样,1第二个边缘采样。cpol:时钟极性,当spi空闲时的电位0低电平,spi:同步串行全双工通信。spi速率:400mb。

2025-06-28 15:58:11 204

原创 利用汇编代码编写启动文件,实现main.c文件跳转(6.19-6.21)

8bit 常数范围(0~255),位移的步进值是以2为单位(即实际位移 2 * rotate 位),可以表示循环有以(0~30)偶数位: 0、2、4、6、8、10、12、14、16、18、20、22、24、26、28、30。事实上,程序跳转工作更多的是为了实现类似函数的功能,此时lable就是函数的函数名,其实lable本身代表的就是待跳转那一行指令的地址,b指令本质上就是把待跳转那行的地址装入pc寄存器,但是函数在调用完毕之后要回到调用处的下一行指令处执行,为了能够回到调用的下一行,需要使用bl指令。

2025-06-27 11:04:43 1348

原创 嵌入式自学四十八天

Prescale: 预分频器 降频 Fin/m = Fout。时钟开了后,先到时钟根产生器,对时钟频率更改,用于不同外设。PLL:锁相环电路 倍频功能:Fin*n = Fout。PFD:相位分子分频器 Fin *n/m = Fout。/n 表示分频因子二进制位数。0表示原样,1表示二分频。

2025-06-25 21:50:08 195

原创 嵌入式自学第四十七天

gic:通用中断控制,最多连8个内核,每个内核最多对应1020个中断源,12-31PPI:私有中断。0-15 SGI:软件产生中断 32 - 1019 SPI:共享中断,外设中断。[13] v:保存异常向量表基地址0,可通过VBAR寄存器修改基地址。组优先级:x xxxx,最高位是组优先级,后面是选择优先级,0最高。arm设计:gic控制器:屏蔽中断、检测中断优先级。中断在0x87800000,_get_协处理器:cp0-cp15用于协助内核工作,中断处理函数需要参数,代表中断源编号。

2025-06-25 09:56:31 176

原创 嵌入式自学第四十六天(6.24)

bss ALIGN(4) : {*(.bss) *(COMMON)} // 未初始化数据段。.data ALIGN(4) : {*(.data)} // 已初始化数据段。// 显式初始化为0的全局变量。// 未初始化的非静态全局变量。.rodata ALIGN(4) : {*(.rodata*)} // 只读数据段。.text : { ... } // 代码段。// 初始化为非零值。- `.rodata.cst4`:4字节常量(如float类型的常量)

2025-06-23 17:30:34 444

原创 嵌入式自学四十五天

空增(Empty Increment)和空减(Empty Decrement)通常指在栈或队列操作中,指针先移动再执行读写操作。mrs:MRS指令用于将特殊寄存器(如CPSR或SPSR)的值读取到通用寄存器中,常用于状态检查或模式切换前的备份。msr:MSR指令与MRS相反,用于将通用寄存器的值写入特殊寄存器(CPSR/SPSR),通常用于修改处理器状态。stmfd指令:保存多个寄存器用满减,不加!,{r0 - r12,lr}CPSR是ARM架构中的当前程序状态寄存器,用于存储处理器的状态和控制信息。

2025-06-23 08:58:58 312

原创 嵌入式自学第四十四天

1、RAM分类:sram(static ram)用晶体管存储0、1。速度快,成本高,存储密度低。dram(dynamic ram)动态存储,用电容充放电存储0,1。功耗大,需要外接刷新电路,读写速度低于sram。成本低,存储密度大。sdram(synchronous dram)增加了同步电路,提高dram的数据读写速度。ddr ram(全称ddr sdram即double data rate sdram),为sdram的下一代。目前已发展到ddr5。

2025-06-20 17:27:19 476

原创 嵌入式自学第四十三天

ds18b20温度传感器:半双工串行通信。

2025-06-20 09:21:02 92

原创 【无标题】

8051架构、x架构(CISC复杂指令集计算机)、arm架构(RISC:简单指令集计算机)。CPSR:当前程序状态寄存器:描述当前内核状态。cisc机器指令复杂:桌面、大型、费电,80%情况下只能用到20%功能。M 单片机。MMU:内存管理单元。内存映射:虚拟地址,提高物理内存使用效率。寄存器、缓存、主存、磁性缓存、磁盘、磁带、光盘。LR:链接寄存器 保存函数返回地址等。SPSR:保存SPSR状态信息。冯诺依曼架构:数据指令存一块。打开指令缓存,关闭数据缓存。dram动态,,,,,电容。

2025-06-20 09:20:45 305

原创 【无标题】

51单片机拉高电压,释放总线,总线的电压就由18b20的电压决定。开始处于释放状态,主机低电位一段时间,ds一段时间后释放。读暂存存储器,温度转换(44h)、读暂存(BEh),当电流不足时,减小电阻,增加电流,保证双方。上拉电阻保证双方释放总线后,电平是高电平。上拉电阻:在总线接上一个电阻。

2025-06-19 15:08:01 177

原创 嵌入式自学第四十二天

在嵌入式系统中,xdata是Keil C51编译器中的一个存储类型修饰符,用于指定变量存储在外部RAM(Extended Data Memory)而非内部RAM中。内部RAM容量有限(通常为256字节),而外部RAM可扩展至64KB。通过xdata声明变量,可以避免内部RAM空间耗尽。在嵌入式系统中,xdata是Keil C51编译器中的一个存储类型修饰符,用于指定变量存储在外部RAM(Extended Data Memory)而非内部RAM中。

2025-06-18 21:26:03 785

原创 嵌入式自学第四十一天

定时器中断高于外部中断。最大65535,溢出后中断。中断处理:当cpu处理程序时,有另一个任务到来,cpu立刻运行另一个。定时器:里面有自增型计数器。给计数器一个初值,来达到定时中断的作用。为了消影,可以加个初始化,为了完全导通二极管,可以加个延时。中断向量表vector,一个指针数组,保存中断函数地址。51单片机晶振主频:12MHz 、11.0592MHz。中断允许IE:TCON ET0:1 EX0:1。2、cpu检测是否响应中断及中断源是否被屏蔽。每个寄存器有一个地址,可通过地址访问。

2025-06-17 19:10:34 168

原创 嵌入式自学第四十天

:按位与,用途:指定位清零,其他位不变。可以看到四组这个,对应32个引脚,这就是芯片内部四个八位寄存器:p0,p1,p2,p3。reg |= (1 << n) | (1 << m)p2:10010010八位,1为高电平,0为低电平,最低位是21号引脚。st89c51单片机。st89c52:半圆朝上,左上角是1号引脚,右下角是21号引脚。二极管单向导电,竖线一边是负极,当负极是低电平,就导通。

2025-06-16 19:30:21 406

原创 网页设计第二天(6.12)

【代码】网页设计第二天(6.12)

2025-06-12 16:38:31 151

原创 嵌入式自学之网络编程汇总(6.3-6.6 ,6.9)

②监听性能不随着监听描述 符数的增加而增加,是O(1)的,不再是轮询描述符来探测事件,而是由描述符主动上报事件;④ select返回-1表示错误,返回0表示超时时间到没有监听到的事件发生,返回正数表示监听到的所有事件数(包括可读,可 写,异常),通常在处理事件时 会利用这个返回值来提高效率,避免不必要的事件触发检查。*2、作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标的输入、中断信号等等事件,再比如web服务器如nginx,需要同时处理来来自N个客户端的事件。

2025-06-12 16:06:45 1612

原创 本地网页制作第一天(6.11)

二姐 <rt>(er) (jie)<rt>

2025-06-11 17:32:22 488

空空如也

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

TA关注的人

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