硬件设备基础
一、ARM9 内核中有多少个通用寄存器?其中 sp、lr、pc、cpsr、spsr 的作用是什么?
在 ARM9 内核中,寄存器组织包含 37 个 通用寄存器,其中,有 13 个通用目的寄存器(R0 - R12)。
S3C2440 是 ARM 架构的,型号为 ARM920T,指令集采用 armv5TE版本。
1.特殊功能寄存器(R13 - R15、CPSR、SPSR)
(1)SP(R13)
作用:堆栈指针,指向当前栈顶地址。(堆栈管理)
功能:函数调用、中断处理。管理栈空间,确保数据临时存储和上下文包含。
(2)LR(R14)
作用:链接寄存器,保存子程序返回地址。(保存返回地址)
功能:当执行 BL (带链接的跳转指令)时,LR 自动保存当前子程序的返回地址(即下一条指令的地址)。
在异常处理中,LR 保存异常发生时的程序计数器(PC),用于异常返回。
(3)PC(R15)
作用:程序计数器,指向当前正在执行指令的下一条指令地址。(控制程序流程)
功能:CPU 根据 PC 的值从内存中取指令执行,修改 PC 的值可实现程序跳转(分支、循环等)
(4)CPSR
作用:当前程序状态寄存器,保存处理器状态和控制标志。(记录当前状态和控制标志)
功能:
状态标志位:N(负数)、Z(零)、C(进位/错位)、V(溢出)。
模式控制位:定义处理器运行模式(用户模式、中断模式)
中断使能位:控制 IRQ(普通中断)和 FIQ(快速中断)的使能标志。
(5)SPSR
作用:备份程序状态寄存器,用于异常处理时保存 CPSR 的值。(异常时备份 CPSR,用于状态恢复)
功能:当异常发生时,处理器自动将当前 CPSR 的值复制到对应异常模式的 SPSR 中,异常返回时,通过 MSR 指令将 SPSR 的值恢复到 CPSR,恢复异常前的处理器状态。
二、ARM9 共有多少种工作模式?
1.用户模式(USR)
非特权模式,应用程序的默认运行模式,对系统资源的访问受限。
2.快速中断模式(FIQ)
特权模式,用于处理高速中断(如硬件实时中断),拥有独立的寄存器以加速中断处理。
3.外部中断模式(IRQ)
特权模式,处理普通外部中断,优先级低于 FIQ。
4.管理模式(SVC)
特权模式,操作系统内核的默认运行模式,由复位或软件中断进入,用于管理系统资源。
5.数据访问终止模式(ABT)
特权模式,当数据访问异常(如地址无效、权限错误)时进入,用于处理内存访问故障。
6.未定义指令终止模式(UND)
特权模式,当处理器遇到无法识别的指令时进入,用于支持软件仿真或扩展指令集。
7.系统模式
特权模式,与用户模式共享寄存器组,但具备特权级,用户运行操作系统任务,可直接切换到其他特权模式。
三、什么是异常向量表?
首先 ARM 架构支持 7 种类型的异常,分别是:
1.Reset:复位异常,系统重启或开机时会产生此异常。
2.Undefined instructions :处理器无法识别指令的异常,处理器执行的指令是有规范的,如果尝试执行不符合要求的指令,就会产生此异常。
3.Software interrupt :软中断,软件中需要去打断处理器工作,可以使用软中断来执行,当执行 SWI 指令时就会产生此异常。
4.Prefetch Abort :预取指令失败,ARM 在执行指令的过程中,要先去预取指令准备执行,如果预取指令失败,就会产生该异常。
5.Data Abort :读取数据失败。
6.IRQ :普通中断。
7.FIQ :快速中断。
异常发生时,ARM 处理器会跳转到对应该异常的固定地址去执行异常处理程序,这个固定的地址就是异常向量。七种异常对应的固定地址是存放在一段连续的内存空间中的,被称为异常向量表。
四、什么是中断?什么是中断源?S3C2440 上有多少种中断源?
中断是指 Soc 能够打断当前正在执行的操作,转而去处理更为紧急的任务,当紧急任务处理完毕之后,还能够回到原来被打断的地方继续执行的机制。
能够产生中断操作的事件称为中断源。
S3C2440 一共有 60 个中断源。
五、中断的执行流程是什么?
1.中断源发出中断请求。
2.Soc 检查该中断是否被屏蔽,处理器内核是否运行处理中断。
3.查询中断优先级。
4.保护现场。
5.执行中断服务函数。
6.恢复现场。
六、什么是 GPIO?
GPIO 是通用输入输出端口的简称,就是控制 Soc 引脚输出高低电平或者读取某个引脚的电平状态。
我用 GPIO 做过 led 灯、蜂鸣器、按键等实验。
七、什么是 UART?
UART 是统一异步接收器和发送器的简称,其实就是串口。
用 UART 做过开发板通过串口与电脑进行数据收发的实验。
八、简述串口操作的时序
(1)在空闲时,TXD 信号线为高电平,当发送方发送一个字节时先发送一个低电平作为起始位。
(2)之后按照 低位先行 原则发送数据的每一个比特。
(3)发送完 8 个比特之后,可选择地发送一个校验位,校验位可以是奇校验、偶校验、无校验。
(4)之后跟停止位,停止位是高电平,用于表达数据发生的间隔,停止位可以是 1 位,1.5 位或者 2 位。
(5)停止位之后,总线保持高电平,直到下一个数据帧的起始位到来。
九、什么是串口的波特率?常用的波特率有哪些?
波特率是指串口通信时的传输速率,单位为 波特(baud),意思是每秒传输的符号数。
在二进制通信(如串口 UART、USB)中,一个符号通常对应 1 个比特,此时 波特率 约等于 比特率(bps)。bps 表示每秒传输的比特数。
二者常被混用(如串口设置 115200 波特 等同于 115200 bps),但在多电平调制(4G、WiFi)中,二者需要区分。
常见的波特率有 1200、2400、4800、9600、115200。
十、什么是 TTL、RS232、RS485?相同点和不同点?
1.TTL
本质:一种数字电路的电平标准,定义了数字信号 0 和 1 的电压范围。
电平特性:
逻辑 1 :高电平,通常为 +3.3V 或 +5V。
逻辑 0 :低电平,通常 0V。
应用:短距离、低速的板级通信(UART 模块的 TTL 接口)。
2.RS232
本质:IEEE 指定的串口通信接口标准,用于设备间的异步串行通信。
电平特性:
逻辑 1 :-3V ~ -15V (高电平)。
逻辑 0 :+3V ~ +15V(低电平)。
传输方式:单端信号。
3.RS485
本质:IEEE 指定的差分平衡串行通信标准,用于多设备组网的远距离通信。
电平特性:差分信号,使用两根信号线(A 和 B)的电压差表示逻辑状态。
电压范围:+7V ~ +12V 和 -7V ~ - 12V
正电压表示高电平,负电压表示低电平。
相同点:
(1)都是串行数据传输,逐位传输数据,适用于低速或远距离通信。
(2)都规定了信号的电平特性。
(3)都支持异步通信模式。
十一、什么是串行通信?什么是并行通信?
1.串行通信
定义:数据按 一位接一位(逐位)的方式在一条传输线上一次传输的通信方式。
特点:
仅需一条(或一对)传输线。
传输速度较慢。
适合长距离传输。
需额外的时钟信号(同步串行)或通过约定波特率(异步串行)实现收发端同步。
2.并行通信
定义:数据按 多个数据位同时(并行) 通过多条传输线进行传输的通信方式。
特点:
需多条传输线。
理论上是串行的 n 倍(n为数据位数),
适合短距离。
依赖统一的时钟信号协调各数据位的传输。
十二、什么是单工、半双工、全双工通信?
单工:只能发或者只能收,收发角色固定,方向固定,单向传输。
半双工:数据可以双向传输,但不能同时收发,需要切换方向实现双向通信。如对讲机。
全双工:双向同时传输。电话、以太网。
十三、什么是异步通信?什么是同步通信?
异步通信:
不依赖统一时钟信号的通信方式。
发送方和接收方使用各自的时钟,无需共享同步时钟信号。
适合低速、短距离。如串口通信、键盘、鼠标。
同步通信:
依赖统一的时钟信号来协调发送方和接收方的时序。
双方共享时钟信号来保持同步。
高速、大数据量传输。如 SPI、I2C、USB、以太网。
十四、S3C2440 的时钟如何配置?
通过配置 S3C2440 的 PLL 和预分频器最终得到三个时钟:
FCLK(主时钟) = 400 MHz
HCLK(系统总线时钟) = 100 MHz
PCLK(外设时钟) = 50 MHz。
十五、S3C2440 的定时器是怎么工作的?
S3C2440 中有 5 个定时器,都是 16 位减定时器。
首先向某个定时器设置工作频率。
然后向该定时器设置一个初值。
启动定时器后定时器会按照之前设定好的频率减这个数。
直到减到0,再减 1 就会发送一个中断请求。
十六、S3C2440 有 PWM 吗?什么是 PWM?
有,PWM 即脉冲宽度调制,是一种通过调节脉冲信号的 “占空比”(高电平持续时间与周期的比值)来实现模拟信号等效控制的技术。
S3C2440 上可以通过 PWM 控制蜂鸣器输出指定频率的声音。
十七、PWM 的应用场合有哪些?
比如 led 亮度控制,电机转速控制,变频空调等。
十八、简述 I2C 的通信时序
I2C 是由飞利浦开发的一种串行通信总线,是半双工同步串行通信方式。参与通信的主机需要两根信号线,分别是 SDA(数据线)和 SCL(时钟线)。硬件上要求两根线都安装有上拉电阻。
I2C 总线上采用 主从应答 机制,主机一般只有一个,空闲时两根线都是高电平。
主机在时钟线高电平时将数据线拉低表示发送一个起始信号,之后按照时钟线高电平时数据线保持稳定,时钟线低电平允许数据线变化的原则以高位先行的方式发送一个字节。
当发送完最后一个比特后接收方回应一个 ACK 或 NACK ,ACK 为低电平,NACK 为高电平。
若还有后续数据则继续按照高位先行原则发送下一个字节。
如果主机要停止通信,则在时钟线为高电平时将数据线从低电平拉回高电平表示发送一个停止位。
十九、为保证 I2C 通信的可靠性,在硬件设计方面有什么需要注意的吗?
最主要的就是数据线和时钟线都安装上拉电阻。
二十、除了 I2C、UART,你还知道那种通信方式?
1.SPI
特点:全双工同步串行,主从架构(1 主多从),高速率。
应用:陀螺仪传感器,ADC,显示屏,adxl345加速度传感器。
2.CAN
特点:多主架构,带错误检测和仲裁机制,抗干扰强。
应用:车载设备通信,机器人。
二十一、什么是 ADC?ADC 转换需要哪些步骤?ADC 的工作原理?
ADC 即模拟数字转换器,是一种将连续变化的模拟信号(电压、电流、温度)转换为离散的数字信号(二进制代码)的电子器件。实现模拟信号到数字信号的转换。
步骤:
(1)采样:在时间上对模拟信号进行离散化。
(2)保持:确保采用期间信号稳定,避免转换过程中信号变化导致误差。
(3)量化:在幅度上对采样信号进行离散化。
(4)编码:将量化后的电平转换为对应的二进制数字代码。
工作原理:
大多数 ADC 采用的是 逐次逼近法 的方式将模拟信号转换为数字信息。ADC 对待测电压进行多次比较,每次比较时都会按照参考电压(量程)的值计算出一个对比值,继而得到一组连续的
0 和 1 序列。
二十二、什么是 ADC 的分辨率?S3C2440 上的 ADC 分辨率是多少?
ADC 的分辨率指 ADC 能够分辨量化的最小信号的能力,用 2 的 n 次方表示,通常把这个 n 成为分辨率。
S3C2440 上的 ADC 分辨率为 10 位,表明它可以将基准电压分割成 2 的10 次方分。
二十三、S3C2440 的ADC 转换速率是多少?
S3C2440 的 ADC 在 2.5 MHz 的工作频率下的转换速率为 500k SPS。
二十四、S3C2440 采用哪种栈?
默认采用 满递减栈。
满栈:栈指针始终指向栈顶元素。
递减栈:栈向低地址方向增长,压栈时栈指针先减小(指向新位置),再存入数据。出栈时先读取数据,在增大栈指针。
二十五、简述字符设备驱动程序框架
(1)在模块加载函数中使用 alloc_chr_dev 申请一个设备号
(2)定义一个 c_dev 结构体变量和一个 file_operation 变量,并实现 file_operation 中的 open、release、read、write 函数。
(2)使用 cdev_init 关联 c_dev 和 file_operation ,再用 cdev_add 关联 c_dev 和设备号。
(3)在模块退出函数中使用 cdev_del 删除设备,unregister_chrdev_region 注销设备号。
(4)使用该设备需要 mknod 命令创建设备节点。
用于 LED 等简单外设。
二十六、杂项设备驱动和字符设备驱动有区别吗?为什么要使用杂项设备驱动?
杂项设备驱动是一种特殊的字符设备驱动,主设备号为 10,。
调试驱动的时候使用混杂设备框架比较方便,调试完毕之后再改为标准字符设备驱动框架。
二十七、除了 I2C 子系统,简要介绍 GPIO 子系统、pinctrl 子系统、input 子系统
GPIO 子系统:
输出模式:通过数据寄存器(GPXDAT)设置引脚电平(高 / 低)。
输入模式:读取 GPXDAT 获取引脚状态,支持上拉 / 下拉电阻配置。
pinctrl 子系统:
用于管理引脚的 复用功能 和 电气特性,解决多外设对引脚的共享需求。
input 子系统:
是 linux 内核中处理输入设备(按键、触摸屏、鼠标)的统一框架。
二十八、简述 I2C 子系统驱动程序框架
依照设备、驱动分离分层原则,I2C 子系统需要编写两个模块,一个是 device(设备),另一个是 driver(驱动)。
device:
主要是获取 I2C 的配置,提供 I2C 设备地址,I2C 设备的名字等操作。
之后使用 i2c_new_device 函数将该设备注册进 linux 的 I2C 虚拟总线上。
driver:
主要完成具体 I2C 设备的操作逻辑,同样需要一个 file_operation 结构体来表达。
i2c_add_driver 函数 将 driver 注册进 I2C 虚拟总线时,一旦设备名和驱动名匹配就会自动执行
i2c_driver 中的 probe 函数,在 probe 函数中注册一个字符设备,通过该字符设备就可以实现与应用层的交互了。
二十九、简述 DS18B20 单总线传感器的操作时序
(1)初始化时序
1.主设备发送复位脉冲:主设备拉低总线(至逻辑 0),持续时间 >= 480us,随后释放总线,由上拉电阻拉高至逻辑 1。
2.从设备响应存在脉冲:
DS18B20 检测到复位脉冲后,在总线释放后的 15 ~ 60us 内拉低总线,发送存在脉冲(持续 60 ~ 240us),表示设备就绪。
主设备通过检测存在脉冲确认传感器在线。
(2)写时序
分为 写0 和 写1,每个写周期长度 >= 60us,相邻周期间隔 >= 1us
(1)写 0 时序
主设备拉低总线,保持 >= 60us(确保 DS18B20 采样到逻辑 0),随后释放总线。
(2)写 1 时序
主设备拉低总线后,在 15us 内释放总线,由上拉电阻拉高至逻辑 1,保持剩余时间(>= 45us)。
(3)读时序
读周期长度 >= 60us,相邻周期间隔 >= 1us,主设备需在总线拉低后 15us 内完成采样。
1.主设备发起读周期:
主设备拉低总线 1 ~ 15us 后释放,DS18B20 在接下来的 15us 内输出数据:
若数据为 1,总线保持高电平;若数据为 0,总线拉低至低电平;
2.主设备采样总线状态
在释放总线后的 15us 内,主设备读取总线电平,获取有效数据。
三十、简述 DHT11 单总线传感器的操作时序
主要包括主机发送启动信号、传感器响应信号以及数据传输三个阶段。
1.主机发送启动信号(初始化)
主机拉低总线:主机先将数据总线(单总线)拉低 >= 18us,用于唤醒传感器。
主机释放总线:拉低后,主机释放总线,进入接收模式,总线由上拉电阻拉高至高电平,等待传感器响应。
2.传感器响应信号
传感器拉低总线:传感器检测到启动信号后,先拉低总线 80us,表示应答信号的开始(低电平响应)。
传感器释放总线:随后传感器将总线拉高 80us,进入数据发生状态(高电平为数据传输前的准备阶段)。
3.数据传输(40 位数据,高位先行)
湿度整数(8位)---湿度小数(8位)---温度整数(8位)---温度小数(8位)---校验位(8位)
数据位 “0”:总线先拉低 50us,然后拉高 26 ~ 28us(高电平持续时间短)。
数据位 “1”:总线先拉低 50us,然后拉高 116 ~ 118us(高电平持续时间长)
三十一、简述什么是中断顶半部和中断底半部?
顶半部:
快速响应:顶半部是中断发生时立即执行的代码,必须在极短时间内完成,通常以屏蔽其他中断的方式运行,避免干扰关键操作。
核心任务:主要负责保存现场、识别中断源、标记设备状态等紧急操作,例如将硬件寄存器的值读取并暂存,或设置中断处理的标志位,=。
底半部:
延迟处理:顶半部完成后,底半部在中断开放的状态下执行,允许其他中断打断,保证系统的响应性。
耗时任务:处理可稍作延迟的操作,如数据解析、内存分配等。
三十二、linux 下的软件中断和硬件中断有区别吗?
软件中断:
定义:由软件通过指令或机制触发的 “中断”,无需硬件信号。
包含类型:异常、软中断、任务队列、系统调用等。
硬件中断:
定义:由外部硬件设备(键盘、鼠标、硬盘、网卡、定时器等)通过物理信号(如 IRQ 线)向 CPU 发起的中断请求。
特点:
异步性:硬件中断的发生与 CPU 当前执行的指令无关,完全由外部设备触发。
硬件依赖:需要通过中断控制器管理中断信号。
主要区别:
特征 | 硬件中断 | 软件中断 |
触发源 | 外部邮件设备 | 软件指令 |
异步性 | 与 CPU 当前指令无关 | 与 CPU 当前指令有关 |
硬件依赖 | 需要 IRQ 线、中断控制器、设备驱动支持 | 无需硬件信号 |
处理优先级 | 较高(上半部需快速处理) | 软中断优先级低于硬件中断,异常和系统调用优先级视情况而定 |
场景 | 设备数据就绪 | 硬件中断下半部处理(软中断) |