Loading

接口技术

【1】点灯(汇编点灯/C语言点灯)

1、分析电路图

image

led灯:RGBLED1
红灯:GPIOA28
绿灯:GPIOE13
蓝灯:GPIOB12

2、分析芯片手册

红灯:GPIOA28
1.设置GPIOALFN1为GPIO功能function0 地址:0xC001A024    GPIOALFN1_28[25:24] = 0b00
2.设置GPIOAOUTENB为输出模式   地址:0xC001A004     GPIOAOUTENB[28]  = 0b1
3.设置GPIOAOUT输出高低电平 地址:0xC001A020        GPIOAOUT[28]=0b0  GPIOAOUT[28]=0b1

绿灯:GPIOE13
1.设置GPIOALFN0为GPIO功能function0    0xC001E020 GPIOALFN1_13[27:26] = 0b00
2.设置GPIOAOUTENB为输出模式    GPIOAOUTENB[13]  = 0b1
3.设置GPIOAOUT输出高低电平 GPIOAOUT[13]=0b0  GPIOAOUT[13]=0b1

蓝灯:GPIOB12
1.设置GPIOALFN0为GPIO功能function0    0xC001B020 GPIOALFN1_12[25:24] = 0b10
2.设置GPIOAOUTENB为输出模式    GPIOAOUTENB[12]  = 0b1
3.设置GPIOAOUT输出高低电平 GPIOAOUT[12]=0b0  GPIOAOUT[12]=0b1

3、编写代码

封装寄存器方法:
1.*(unsigned int *)0xC001A024 = 
	*(unsigned int *)0xC001A024 & (~(0x3 << 24));
2.#define  GPIOALTFN1 (*(volatile unsigned int*)0xC001A024)
	GPIOALTFN1 = GPIOALTFN1 & (~(0x3 << 24));
3.#define  GPIOALTFN1 ((volatile unsigned int*)0xC001A024)
	*GPIOALTFN1 = *GPIOALTFN1 & (~(0x3 << 24));
4.封装结构体
typedef struct{
	volatile unsigned int OUT;
	volatile unsigned int OUTENB;
	volatile unsigned int DETMODE0;   
	volatile unsigned int DETMODE1; 
	volatile unsigned int INTENB;  
	volatile unsigned int DET; 
	volatile unsigned int PAD; 
	volatile unsigned int RSVD;
	volatile unsigned int ALTFN0;
	volatile unsigned int ALTFN1; 
}gpio_t;
#define GPIOA (*(volatile gpio_t *)0xC001A000)

【2】PWM驱动蜂鸣器实验

Pluse Width Modulation(PWM)脉冲宽度调制定时器

1、周期与频率概念

1.周期:完成一个方波的时间
2.频率:1S产生方波的个数
3.周期和频率之间的关系:F = 1 / T
4.占空比:高电平占整个周期的百分比

2、有源蜂鸣器和无源蜂鸣器区别

1.有源蜂鸣器:有源蜂鸣器内部有一个震荡源,当给蜂鸣器供电,震荡源会按照一定的频率震荡,产生高低电平的变化。
2.有源蜂鸣器的驱动给高电平,蜂鸣器响;
给低电平,蜂鸣器不响;
3.无源蜂鸣器:无源蜂鸣器的内部没有震荡源,需要人为的按照一定的频率给蜂鸣器提供高低电平的变化,蜂鸣器可以发声;
4.开发板的蜂鸣器是有源蜂鸣器;

3、PWM应用

它是利用调制的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛的测量,通信,功率控制与变换等许多领域,脉冲宽度调制是一种对模拟信号通过改进的计数器的使用,方波的替代被调制变成对一个具体模拟信号的可以进行编码。
常见应用有:电机控制,DAC输出等

4、分析电路图

蜂鸣器:BUZ1
SOC芯片:GPIOC14---->PWM2

5、分析芯片手册

Register Description
TCFG0 Clock-Prescalar 时钟预分频器
TCFG1 Clock Multiplexers 时钟多路复用器
TCON Timer control register 定时器控制寄存器
TCNTB2 Timer 2 count buffer register 定时器2计数缓冲寄存器
TCMPB2 Timer 2 compare buffer register 定时器2 比较缓冲寄存器
TCNTO2 Timer 2 count observation register 定时器2观测寄存器
1.设置GPIOC14引脚位PWM功能(function2功能)GPIOcALTFN0
	0xC001C020[29:28] = 0b10
2.设置PWM定时器的1级分频值  TCFG0
3.设置PWM定时器的2级分频值  TCFG1
4.设置定时器控制寄存器   TCON
5.设置定时器缓冲寄存器2  TCNTB2
6.设置定时器比较缓冲寄存器2  TCMPB2

6、编写代码

1.头文件包含
2.src/pwm.c 蜂鸣器代码编写
void hal_pwm_init( )
{
1.设置GPIOC14引脚位PWM功能
2.设置PWM2的一级分频值 TCFG0[15:8]
3.设置PWM2的二级分频值 TCFG1[11:8]
4.设置计数缓冲寄存器初始值  TCCNTB2[31:0]
5.设置比较缓冲寄存器初始值  TCMPB2[31:0]
6.打开手动更新位    TCON[13]
7.打开自动更新位    TCON[15]
8.关闭手动更新位	 TCON[13]
9.打开翻转位        TCON[14]
10.开启PWM2定时器的功能   TCON[12]
}
主函数main.c进行调用函数

【3】UART通用的异步串行全双工总线

总线是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束,按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号,总线是一种内部结构,它是CPU、内存、输入、输出设备传递信息的公用通道,主机的各个部件通过总线相连接,外部设备通过相应的接口电路再与总线相连接,从而形成了计算机硬件系统,在计算机系统中,各个部件之间传送信息的公共通路叫总线,微型计算机是以总线结构来连接各个功能部件的

image

1、总线的种类

1.串行总线:一个时钟周期主机发送一位数据,同时从机接受一位数据
2.优点:节约引脚资源  去电:传输速率慢
常见的串行总线:UART IIC SPI CAN
1.并行总线:一个时钟周期主机可以并行的发送多位数据,同时从机可以并行的接收多位的数据
2.优点:传输速率高  缺点:浪费引脚资源
场合:LCD屏,内存,硬盘

2、按照数据的传输方向

单工总线
双工总线

3、按照时钟划分

同步总线
异步总线:主机和从机采用各自独立的时钟源,要求各自的时钟源要保持相同的时钟频率

4、UART串行总线的硬件连接

5、UART串口的通信协议

串口在空闲时,数据线处于高电平的状态
发送端将数据线从高拉倒低,就是一个起始位
起始信号:开始发送数据的信号
数据位:要发送或者接收的数据,先发低位再发高位
校验位:奇偶校验,保证数据位加校验位1的个数和为奇数或者偶数
停止位:一帧数据发送结束,用于校准时钟
1.在一帧数据内部,每一位数据的传输都需要一个时钟周期
2.每帧数据之间的时间间隔是任意的,及空闲时间任意
3.串口采用异步时钟,各自采用各自独立的时钟源
4.时钟就会存在一定的误差,在数据的发送过程中,误差会累加,因此发送完一帧数据之后需要校准时钟

6、分析硬件电路图

1.sp3232芯片的作用:电平转换芯片
具有跟sp3232芯片具有相同功能的芯片有:SP232 MAX232 MAX3232
2.s5p6818采用的是TTL电平
	3.3V -->表示高电平
	0v   -->表示低电平
3.串口采用的是RS232电平
	+3 ~ -12  -->  表示高电平
	+3 ~ +12  -->  表示低电平

7、分析芯片手册

【5】arm异常处理过程

1、arm处理器的工作模式

为了提高arm处理器的工作效率,为arm处理器设计了多种工作模式,在不同的工作模式下,处理不同的时间,及执行不同的程序,完成特定的功能

2、五种异常模式,七种异常源

异常模式 异常源
FIQ模式 快速中断模式 外部中断事件触发
IRQ模式 普通中断模式 外部中断事件触发
SVC模式 管理(特权)模式 Reset或软中断指令
Abort模式 中止模式 指令或数据异常
Undef模式 未定义模式 指令没有定义/无法解析的指令

3、异常源

异常源是引发程序进入异常模式下,执行异常处理代码一类的事件
异常模式 异常源
FIQ模式 FIQ
IRQ模式 IRQ
SVC模式 Reset/软中断
Abort模式 data abort / pretfch abort
Undef模式 undef指令
data Abort:数据中止异常 --> 取数据失败
Pretfch Abort:指令中止异常 --> 取指令失败
Undef指令:未定义指令异常 --> 翻译指令不成功
1>五种异常模式对应七种异常源
2>异常源具有优先级,复位的优先级最高,FIQ优先级高于IRQ

4、异常处理过程

image

保存现场:4大步3小步  CPU自动完成
1.保存CRSR到spsr_<mode>
2.修改cpsr
	1>切换到ARM状态
	2>禁止中断位,根据需要
	3>修改模式位,切换到对应的异常模式
3.保存返回地址到lr_<mode>
4.修改PC值,执行对应的异常向量表位置

恢复现场:(需要手动完成)
1.恢复spsr_<mode>到cpsr中
2.恢复lr_<mode>到PC中
1.当异常发生之后,cpu自动完成保护现场的过程,自动修改PC值指向异常处理程序,而异常处理程序的入口地址可能不固定
2.所以设计芯片时,设计了一个异常向量表,异常发生后,先让PC指向异常向量表的位置,在通过异常向量表跳转到异常处理程序中

5、异常向量表

image

1.异常向量表就是内存代码段中一块连续的空间,这块空间的大小是32字节,被平均分成8份,每份占4个字节;
2.这个异常向量表中就存放7种异常源,还有一个是保留的
3.7种异常源在异常向量表中的位置是固定的,异常向量表的首地址
也是固定的;
4.既可以通过根据异常向量表的首地址做地址的偏移,就可以找到对应的异常源;

image

【6】按键中断实验

1、分析电路图

2、分析芯片手册

设置GPIO控制器流程

①通过GPIOxALTFN0/1寄存器设置为按键功能

②通过GPIOxOUTENB寄存器设置为输入功能

③通过GPIOxDETENB寄存器使能事件检测使能寄存器

④通过GPIOxDETMODE0/1寄存器设置事件检测模式

⑤通过GPIOxINTENB寄存器使能中断使能寄存器

⑥通过GPIOxDET寄存器设置事件检测寄存器

寄存器 寄存器描述
GPIOxOUTENB GPIO输出使能寄存器
GPIOxDETMODE0 GPIO事件检测模式寄存器0
GPIOxDETMODE1 GPIO事件检测模式寄存器1
GPIOxINTENB GPIO中断使能寄存器
GPIOxDET GPIO事件检测寄存器
GPIOxPAD GPIO引脚状态寄存器
GPIOxALTFN0 GPIO复用功能选择寄存器0
GPIOxALTFN1 GPIO复用功能选择寄存器1
GPIOxDETMODEEX GPIO事件检测模式扩展寄存器
GPIOxDETENB GPIO 检测使能寄存器
1.16个软件产生的中断 --> 简称SGIS
2.6个外部私有外设中断 --> 简称PPIS
3.1个内部私有外设中断 --> 简称PPIS
4.128个共享外设中断 --> 简称SPIS
GIC本身支持16个SGIS,16个PPIS,128个SPIS
s5p6818芯片只使用7个PPIS

GIC寄存器分为:分配器层(GICD)和CPU接口层(GICC)

【1】分配器层配置流程(GICD)

1、设置ISENABLERn寄存器:使能中断使能寄存器

2、设置IPRIORITYRn寄存器:中断优先级寄存器

3、设置ITARGETSRn寄存器:中断处理器目标寄存器

4、设置GICD_CTRL寄存器:设置分配器控制寄存器GICD层全局使能

5、GICD_ICPENDER寄存器:清除中断挂起标志位寄存器

【2】CPU接口层(GICC)

1、设置GICC_PMR寄存器:中断优先级屏蔽寄存器

2、设置GICC_CTRL寄存器:CPU接口控制寄存器

3、从GICC_IAR寄存器中获取终端号

4、GICC_EOIR中断结束寄存器

寄存器 寄存器描述
GICD_CTRL 分配器控制寄存器
GICD_ISENABLERn 设置中断使能寄存器
GICD_ICPENDERn 清除中断挂起标志寄存器
GICD_IPRIORITYRn 中断优先级寄存器
GICD_ITARGETSRn 中断处理器目标寄存器
GICC_CTRL CPU接口控制寄存器
GICC_PMR 中断优先级屏蔽寄存器
GICC_IAR 中断应答寄存器
GICC_EOIR 中断结束寄存器
GICD_CTRL:GICD层全局中断使能寄存器
GICD_ISENABLERn:GICD中设置中断使能寄存器
GICD_ICPENDERn:清除GICD层的中断挂起标志位
GICD_IPRIORITYRn:GICD层设置中断优先级
GICD_ITARGETSRn:GICD层中断目标分配寄存器

GICC_CTRL:GICC层中断全局使能寄存器
GICC_PMR:GICC层中断优先级屏蔽寄存器
GICC_IAR:GICC层中断应答寄存器,可以读到中断号
GICC_EOIR:GICC层中断结束寄存器,清除中断号
GIC作用:
1.所有的中断信号都是通过GIC转发中断信号到CPU中
2.GIC管理中断信号转发给哪个CPU核进行处理
3.中断信号具有优先级,当同时来多个中断信号时,GIC先转发高优先级的中断给CPU核处理,低优先级的在GIC中排队
4.高端ARM处理器不允许出现中断的嵌套,即高优先级的中断不可以打断低优先级的中断信号
5.GIC给每个中断信号都分配了一个唯一的中断号,通过中断号就可以区分中断的类型
GICD_ISENABLERn:GICD中设置中断使能寄存器
GICD_ISENABLERn每一位管理一个中断号,而GIC最多支持160个中断(16个SGIS,16个PPIS,128个SPIS),而一个GICD_ISENABLERn寄存器最多管理32个中断号,因此需要5个这样的寄存器共同管理160个中断源

GPIOB8引脚对应的中断号是86号,对应着寄存器的哪一位
86/32=2....22 第二个寄存器22位 
GICD_IPRIORITYRn:GICD层设置中断优先级
GICD_ISENABLERn每8位管理一个中断号,而GIC最多支持160个中断(16个SGIS,16个PPIS,128个SPIS),而一个GICD_IPRIORITYRn寄存器最多管理4个中断号,因此需要40个这样的寄存器共同管理160个中断源

GPIOB8引脚对应的中断号是86号,对应着寄存器的哪8位
86/4=21....2   第21个寄存器[23:16]位
GICD_ITARGETSRn:GICD层中断目标分配寄存器
GICD_ITARGETSRn每8位管理一个中断号,而GIC最多支持160个中断(16个SGIS,16个PPIS,128个SPIS),而一个GICD_ITARGETSRn寄存器最多管理4个中断号,因此需要40个这样的寄存器共同管理160个中断源

GPIOB8引脚对应的中断号是86号,对应着寄存器的哪8位
86/4=21....2   第21个寄存器[23:16]位
GICD_ICPENDERn:清除GICD层的中断挂起标志位
GICD_ICPENDERn每一位管理一个中断号,而GIC最多支持160个中断(16个SGIS,16个PPIS,128个SPIS),而一个GICD_ICPENDERn寄存器最多管理32个中断号,因此需要5个这样的寄存器共同管理160个中断源

GPIOB8引脚对应的中断号是86号,对应着寄存器的哪一位
86/32=2....22 第二个寄存器22位 

3、代码编写流程

1>GPIO按键初始化

1.设置GPIO引脚为GPIO功能
2.设置GPIO引脚为输入模式
3.设置GPIO引脚的检测使能
4.设置GPIO引脚的事件检测模式
5.设置GPIO引脚的中断使能
6.清除GPIO层中断挂起标志位

2>GIC寄存器中GICD初始化

1.设置GICD层中断使能寄存器
2.设置中断的优先级寄存器
3.设置GICD层目标分配寄存器,中断信号给CPU0处理
4.设置GICD层全局使能寄存器

3>GIC寄存器中GICC初始化

1.设置GICC层中断屏蔽寄存器
2.设置GICC层全局中断使能寄存器

4>中断函数do_irq.c

1.通过GICC_IAR寄存器,获取中断号
2.通过GPIODET寄存器对应位的值,可以判断那个gpio引脚触发的中断
3.清除GICD层的中断挂起标志位
4.清除中断号

【7】ADC实验

1、ADC概念

ADC:Analog Digital Covererter->模数转换器->将模拟量转换为数字量
DAC:Digital Analog Converter->数模转换器->将数字量转换为模拟量

2、模拟型传感器

模拟型传感器:输出的信号是一个模拟信号

3、数字型传感器

数字型传感器:输出量是一个数字量

4、模拟量和数字量关联

假设测量的模拟电压值为0~1.8v,转换对应的12位的数字量

数字量 模拟量
0000 0000 0000 0V
........................... ..........................
1111 11111 11111 1.8v
原理:将模拟量平均分成很多的小份,让数字量乘以一份的值,就是实际的测量的模拟量的值

5、分析硬件电路图

6、分析芯片手册

1>ADC框图

APSV:分频器

APEN:分频器使能

ADEN:AD使能

ATBY:电源

CLKIN:时钟输入

ADCDAT:ADC转换结果数字量

2>ADC时序图

AIN[15:0]:模拟输入通道

CLK:时钟 (时钟<6MHZ)

SEL[3:0]:通道选择

PD:电源

SOC:开启转换信号

EOC:转换结束信号

DO[11:0]:输出的数字量

3>ADCCON寄存器设置

1.读取转换结果的延时周期的个数
2.ADC供电之后,延时几个周期之后开启ADC转换
3.ADC通道的选择
4.打开ADC电源
5.ADEN使能
读0:转换结束
读1:正在进行转换
写0:没有影响
写1:开启ADC转换

4>ADCDAT寄存器设置

转换结果存放在这个寄存器

5>PRESCALERCON寄存器设置

1.APEN:设置分频器使能
2.APSV:分频器值

7、编写代码流程

1>adc初始化函数

1.设置ADCDAT读取转换结果的延时时间
2.社会ADC开启电源之后,时钟周期的延时个数
3.设置ADC的通道选择 选择0通道
4.开启ADC的电源
5.设置ADC的分频值
6.设置ADC的分频使能为

2>读取转换结果的值

1.开启ADC转换
2.等待ADC转换结果,如果ADC转换没有结束,等待ADC转换结束,如果转换结束,读取转换结果
3.从ADCDAT中读取转换结果
4.将获取的数字量通过公式转换为模拟量

【8】IIC总线串行半双工

1、IIC串行总线概述

1.IIC总线是PHLIPS公司在八十年代出推出的一种串行的半双工总线,主要用于连接整体电路;
2.IIC总线为两线制,只有两根双向信号号,一根是数据线(SDA),另外一根是时钟线(SCL);

2、IIC总线硬件连接

1.IIC是具备多主多从,系统所需的包括总线裁决功能的高性能串行的总线
2.能够主动发起通信的叫做主机,被动接受的属于从机
3.每个接到IIC总线上的器件都有唯一的地址,主机与其他器件进行数据传送时,总线上发送数据的器件为发送器,总线上接受数据的器件则为接收器

3、IIC总线的时序

1>起始信号时序

SCL线上为高电平期间,SDA线由高电平向低电平变化表示起始信号

2>数据信号时序

1.时钟在低电平期间,发送器向数据线上写入数据
2.时钟在高电平期间,接收器从数据线上读取数据

3>应答和非应答信号时序

1.接收器接收到8位的数据之后,需要给发送器返回一个应答信号或者非应答信号
2.在第九个时钟周期,低电平期间,接收器向数据线上写入数据
3.在第九个时钟周期,高电平期间,发送器从数据线上读取数据
4.如果读到的是高电平就是非应答信号,如果读到的是低电平就是应答信号

4>停止信号时序

1.SCL线上为高电平期间,SDA线由低电平到高电平变化表示停止信号
2.起始信号和终止信号都是由主机发出,起始信号产生后,总线上就处于占用的状态,终止信号产生后,总线上就处于空闲态

5>IIC的寻址

1.IIC总线传送的数据信号是广义的,包括地址信号,又包括真正的数据信号
2.主机在起始信号后,必须传送一个从机的地址(7位),第8位是数据的传送方向为(R/T),用0表示主机发送数据(T),用1表示接受数据(R)
3.总线上的每个从机将这7位从机地址与字节的地址进行比较,如果相同,则恩威自己被主机寻址,根据R/T位将自己定为发送器或接收器(本课程mma8451q所用的地址是0x1c)

4、IIC总线通信协议

1>主机给从机发送(写)一个字节数据

2>主机给从机发送连续的多个字节数据

3>主机从从机接受一个字节数据

4>主机从从机接受多个字节数据

5、模拟IIC时序代码

1>MMA8451q从机地址

GPIOD6:SCL
GPIOD7:SDA
#define SLAVE_ADDR   0x1C

2>设置GPIOD7位输入或者输出

#define SET_SDA_OUT  hal_gpio_mode(GPIOD,GPIO_PIN_7,OUT_MODE)
#define SET_SDA_IN   hal_gpio_mode(GPIOD,GPIO_PIN_7,IN_MODE)

3>设置GPIOD7输出高低电平

#define SDA_OUT_H    hal_gpio_write(GPIOD,GPIO_PIN_7,HIGH_LEVEL)
#define SDA_OUT_L    hal_gpio_write(GPIOD,GPIO_PIN_7,LOW_LEVEL)

4>设置GPIOD6输出高低电平

#define SCL_OUT_H    hal_gpio_write(GPIOD,GPIO_PIN_6,HIGH_LEVEL)
#define SCL_OUT_L    hal_gpio_write(GPIOD,GPIO_PIN_6,LOW_LEVEL)

5>读取SDA线上的数据

#define READ_SDA_DATA hal_gpio_read(GPIOD,GPIO_PIN_7)

6>延时函数

void delay_us(void);

7>IIC的初始化

void  iic_init(void);

8>模拟开始信号时序的函数

void iic_start(void);

9>模拟停止信号时序的函数

void iic_stop(void);

10>主机给从机发送一帧数据的函数

char iic_send_char(char dat);

11>从机给主机发送一帧的数据

char iic_recv_char(char ack);

12>主机向mma8451q中写入一个字节的数据

void mma8451_write_byte(unsigned char reg_addr,
		char dat);

13>主机从mma8451q中读取一个字节的数据

char mma8451_read_byte(unsigned char reg_addr);

14>mma8451q初始化函数

void mma8451_init(void);
posted @ 2021-06-04 18:46  Yangtai  阅读(1052)  评论(0编辑  收藏  举报