第6章 GPIO端口讲解
- 格式:ppt
- 大小:2.56 MB
- 文档页数:2
嵌入式最基础的GPIO接口操作了解一下!1、GPIOGPIO(General Purpose Input/Output Port),即通用输入输出端口,就是芯片的一些引脚。
作为输入端口时,我们可以通过它们读入引脚的状态--高电平或低电平,作为输出端口时,我们可以通过它们输出高电平或低电平来控制连接的外围设备。
S3C2440有130个GPIO引脚,分为A~J共9组:GPA、GPB、…、GPJ。
通过设置相应的寄存器来设置某个引脚的功能(输入或输出或是其他特殊功能)。
2、通过寄存器操作GPIO每个端口可以很容易的通过软件配置以满足各种系统配置和设计需求,在使用之前你必须定义每个引脚的功能,如果不是用于复用功能,则引脚可以配置为普通输入输出端口。
1)端口配置寄存器GPxCON(x为A~J)GPxCON是用于选择引脚功能。
PORT A的端口配置寄存器GPACON中每一位对应一个引脚(PORT A共23个引脚,bit0~bit22对应GPA0~GPA22)。
当某位被设为0时,相应的引脚被设置成输出引脚,此时可以在GPADAT中相应位写入0或1让此引脚输出低电平或高电平。
当某位被设为1时,相应的引脚被设为地址线或用于地址控制,此时GPADAT无用。
(GPACON通常被设为全1,以便访问外部存储器件)PORT B~PORT J的端口配置寄存器操作完全相同:GPxCON中每两位控制一个引脚,00为输入、01为输出、10为特殊功能、11保留。
2)端口数据寄存器GPxDAT(x为A~J)GPxDAT是用于读/写引脚数据。
当引脚被设为输入时,读此寄存器可得到相应引脚的电平状态是高还是低;当引脚被设为输出时,通过写此寄存器的相应位可设置相应引脚输出高电平或低电平。
3)端口上拉寄存器GPxUP(x为B~J,注意:PORT A端口没有这个寄存器)GPxUP是用于选择是否使用内部上拉电阻。
此寄存器的某位被设置为1时,相应引脚不使用内部上拉电阻;设置为0时,相应引脚使用内部上拉电阻。
GPIO结构1. 什么是GPIO?GPIO(General Purpose Input/Output)是通用输入输出的缩写,是指计算机系统中用于与外部设备进行通信的一组接口。
在现代计算机系统中,GPIO通常是通过芯片上的引脚实现的。
GPIO接口可以以输入或输出的方式与外部设备进行通信。
作为输入,GPIO接口可以接收来自外部设备的信号,如按钮的按下、传感器的检测等。
作为输出,GPIO 接口可以向外部设备发送信号,如控制LED灯的亮灭、控制电机的运转等。
2. GPIO的结构GPIO的结构通常由以下几个组成部分组成:2.1. 引脚GPIO的功能通过芯片上的引脚实现。
每个引脚都有一个特定的编号,用于标识该引脚的功能和位置。
在一些计算机系统中,引脚的编号可能是通过物理排列或者软件配置来确定的。
2.2. 寄存器GPIO的寄存器用于控制和配置引脚的功能和状态。
寄存器是计算机系统中的一种特殊存储器,用于存储特定的控制和状态信息。
通过对寄存器的读写操作,可以实现对GPIO引脚的配置和控制。
寄存器通常包括以下几个重要的部分:•数据寄存器(Data Register):用于读取和写入引脚的电平状态。
•方向寄存器(Direction Register):用于配置引脚的输入或输出方向。
•中断寄存器(Interrupt Register):用于配置引脚的中断功能。
2.3. 控制器GPIO的控制器是负责管理和控制GPIO的硬件模块。
控制器通常由一组寄存器和逻辑电路组成,用于处理GPIO的输入和输出。
控制器的功能包括:•配置引脚的输入输出方向。
•配置引脚的中断功能。
•读取和写入引脚的电平状态。
•控制引脚的上拉和下拉电阻。
2.4. 驱动程序GPIO的驱动程序是运行在计算机系统上的软件模块,用于提供对GPIO的操作接口。
驱动程序通过访问GPIO的寄存器和控制器,实现对GPIO引脚的配置和控制。
驱动程序通常包括以下几个重要的功能:•初始化GPIO的寄存器和控制器。
gpio手册祥细解
GPIO(General-Purpose Input/Output)是通用输入/输出接口的缩写,它是微控制器芯片上常见的接口之一。
GPIO接口可以用于控制外部设备、读取外部设备的状态或者实现与其他设备的通信。
在微控制器中,GPIO接口通常由多个寄存器组成,每个寄存器控制一个特定的GPIO引脚。
每个GPIO引脚都可以被配置为输入或输出模式,并且可以设置不同的工作模式和触发方式。
GPIO接口的主要寄存器包括:
1.端口配置寄存器(GPIOx_CRL/CRH):用于配置GPIO 引脚的工作模式和触发方式。
2.端口输入数据寄存器(GPIOx_IDR):用于读取GPIO 引脚的输入状态。
3.端口输出数据寄存器(GPIOx_ODR):用于设置GPIO 引脚的输出状态。
4.端口位清除寄存器(GPIOx_BRR):用于清除指定的GPIO位。
5.端口位设置/清除寄存器(GPIOx_BSRR):用于设置或清除指定的GPIO位。
6.端口配置锁定寄存器(GPIOx_LCKR):用于锁定GPIO 引脚的配置寄存器,防止意外修改。
在使用GPIO接口时,首先需要配置GPIO引脚的工作模式和触发方式,然后可以通过读取或设置端口输入/输出数据寄存器来控制外部设备或读取外部设备的状态。
同时,也可以使用位清除、位设置/清除等操作来控制特定的GPIO位。
需要注意的是,不同的微控制器可能具有不同的GPIO接口和寄存器配置,因此在使用时需要参考具体的微控制器手册或数据手册进行操作。
gpio端口的基本结构
GPIO端口是一种广泛使用的计算机外围接口,它具有对外围设备进行输入和输出信号调节的功能。
GPIO端口的基本结构主要由端口控制器(I/O控制器)、接口驱动器(输入/输出驱动器)和多路I/O端口构成。
端口控制器是GPIO端口的核心部件,它控制着整个GPIO端口系统的工作,它拥有许多特性,用于实现对端口的控制和诊断,并支持不同类型外设的通讯。
接口驱动器是端口控制器协同工作的另一部分,它负责将来自外设的信号转变为控制器可以识别的信号,以便控制器能够准确地识别外设,有效地驱动外设的工作。
最后,GPIO端口的基本结构还包括多路I/O端口,它提供与CPU 交互的接口,是CPU与外设的连接桥梁,可由外设传递信号和数据,也可由CPU接收外设传来的信号和数据,完成数据交换。
总之,GPIO端口的基本结构主要由端口控制器、接口驱动器和多路I/O端口构成,它们在GPIO端口的工作中起着不同的作用,支持不同类型外设的通讯,与CPU间的交互,从而实现对外围设备的输入和输出信号的控制和调节。
GPIO(General-Purpose Input/Output)——通用输入/输出口,对大多数从事电子行业的人来说并不是什么陌生的东西。
但它却是基础性的,很多MCU 的后续开发都得用到GPIO。
TM320F28335有88个IO口,为GPIO0至GPIO87,其中GPIO0至GPIO63可以配置为8个核心中断。
TM320F28335的GPIO口可以分为三组,分别为A口(GPIO0至GPIO31),B口(GPIO32至GPIO63)和C口(GPIO64至GPIO87)。
GPIO的寄存器可以分为三种,分别是GPIO控制寄存器,GPIO数据寄存器和GPIO中断与低功耗模式选择寄存器。
详见图1、2、3。
图1 GPIO控制寄存器图2 GPIO数据寄存器图3 GPIO中断与低功耗模式选择寄存器GPIO控制寄存器GPxCTRL(x=A,B,C)为配置为输入限制的引脚指定了采样周期。
采样周期介于限制采样周期之内,是相对于系统时钟周期的倍数。
具体的配置见图4,以A口为例。
图4 GPIO Port A Qualification Control (GPACTRL) Register Field Descriptions而GPIO限制选择寄存器GPxQSELy(x=A,B,C;y=1,2)指定了采样窗是3个采样点还是6个采样点。
具体的配置见图5,还是以A口为例。
图5 GPIO Port A Qualification Select 1 (GPAQSEL1) Register Field Descriptions以上寄存器主要是为GPIO的输入功能进行的配置。
通过,图6(Qualification Using Sampling Window)和图7(Input Qualifier Clock Cycles),我们可以很清楚的知道GPIO的输入限制是怎样完美的去除我们不需要的噪声的。
图6Qualification Using Sampling Window图7Input Qualifier Clock Cycles在图7中,输入限制将忽略这个尖刺小脉冲。
GPIO的设置与使用GPIO,全称为“General Purpose Input/Output”,即通用输入/输出端口。
它是单片机(或其他外设)上的一组可编程的通用引脚,可以配置为输入或输出,通过编程控制,与外界设备进行数据交互。
GPIO具有可编程性和通用性,因此在嵌入式系统中广泛应用于控制和通信。
1.引脚模式设置:GPIO引脚可以配置为不同的模式,例如输入模式、输出模式、复用模式等。
一般通过寄存器来配置引脚的模式。
对于输入模式,可以配置引脚的阻抗、上拉或下拉电阻;对于输出模式,可以配置引脚的电平状态;对于复用模式,可以选择引脚的功能和使用的外设。
2.引脚操作:一旦引脚被配置为输入或输出模式,就可以通过相应的寄存器对引脚进行操作。
对于输入引脚,可以获取引脚的电平状态,判断输入信号的逻辑值;对于输出引脚,可以设置引脚的电平状态,控制输出信号的逻辑值。
3.中断设置:GPIO引脚可以配置中断功能,这样当引脚的电平状态发生变化时,可以触发中断并执行相应的中断服务程序。
通过中断方式,可以实现对输入引脚的实时监测和响应。
4.外设控制:GPIO引脚可以与外设进行连接,并通过GPIO来控制外设的功能。
例如,可以通过GPIO控制LED的亮灭、驱动蜂鸣器的发声、读取按键的状态等。
这需要通过设置相应的引脚模式和操作寄存器来实现。
1.确定所需的GPIO引脚:根据具体需求,确定需要使用的GPIO引脚。
这可以通过查阅芯片手册或开发板资料来获取相应的引脚信息。
2.配置引脚模式:根据使用要求,将GPIO引脚配置为输入或输出模式。
这一般需要设置相应的寄存器,标志位或设置值。
3.进行引脚操作:根据GPIO引脚的模式,进行相应的读取或写入操作。
对于输入引脚,可以读取引脚的电平状态;对于输出引脚,可以设置引脚的电平状态。
4.设置中断:如果需要使用中断功能,可以配置相应的中断使能,并编写中断处理函数。
在引脚状态变化时,触发中断执行中断处理程序。
GPIO(General-Purpose Input/Output)——通用输入/输出口,对大多数从事电子行业的人来说并不是什么陌生的东西。
但它却是基础性的,很多MCU 的后续开发都得用到GPIO。
TM320F28335有88个IO口,为GPIO0至GPIO87,其中GPIO0至GPIO63可以配置为8个核心中断。
TM320F28335的GPIO口可以分为三组,分别为A口(GPIO0至GPIO31),B口(GPIO32至GPIO63)和C口(GPIO64至GPIO87)。
GPIO的寄存器可以分为三种,分别是GPIO控制寄存器,GPIO数据寄存器和GPIO中断与低功耗模式选择寄存器。
详见图1、2、3。
图1 GPIO控制寄存器图2 GPIO数据寄存器图3 GPIO中断与低功耗模式选择寄存器GPIO控制寄存器GPxCTRL(x=A,B,C)为配置为输入限制的引脚指定了采样周期。
采样周期介于限制采样周期之内,是相对于系统时钟周期的倍数。
具体的配置见图4,以A口为例。
图4 GPIO Port A Qualification Control (GPACTRL) Register Field Descriptions而GPIO限制选择寄存器GPxQSELy(x=A,B,C;y=1,2)指定了采样窗是3个采样点还是6个采样点。
具体的配置见图5,还是以A口为例。
图5 GPIO Port A Qualification Select 1 (GPAQSEL1) Register Field Descriptions以上寄存器主要是为GPIO的输入功能进行的配置。
通过,图6(Qualification Using Sampling Window)和图7(Input Qualifier Clock Cycles),我们可以很清楚的知道GPIO的输入限制是怎样完美的去除我们不需要的噪声的。
图6Qualification Using Sampling Window图7Input Qualifier Clock Cycles在图7中,输入限制将忽略这个尖刺小脉冲。
一文看懂GPIO!一、前言GPIO全称General Purpose Input Output 即通用输入/输出,其实GPIO的本质就是芯片的一个引脚,通常在ARM中所有的I/O都是通用的。
不过由于每个开发板上都会设计不同的外围电路,这就造成GPIO的功能可能有所不同,大部分GPIO都是有复用功能的,比如有些GPIO可能是串口的TX或RX,也可能是I2C的SCL或SDA线。
所以我们不仅要知道GPIO能够输出高低电平,还要理解为什么有些GPIO可以复用某些功能,而其他的不可以。
二、GPIO内部结构我们在使用GPIO的时候可能不会去想为什么我们通过写代码或者操作寄存器就可以控制一个引脚的高低电平。
今天就让我们一起来看看为什么我们通过操作寄存器(其实写代码的过程就是在操作寄存器)就能控制引脚输入或者输出。
我们想要想控制一个GPIO口的需要操作7个寄存器,分别是CRL,CRH,IDR,ODR,BRR,BSRR,LCKR 我们对GPIO的操作本质上就是在对这些寄存器进行读写操作,以下是这些寄存器的名称:GPIOx_CRL(x = A..E)端口配置低寄存器 32位寄存器GPIOx_CRH(x = A..E)端口配置高寄存器 32位寄存器GPIOx_IDR(x = A..E)端口输入数据寄存器 32位寄存器但仅用低16位GPIOx_ODR(x = A..E)端口输出数据寄存器 32位寄存器但仅用低16位GPIOx_BRR(x = A..E)端口位清除寄存器 16位寄存器GPIOx_BSRR(x = A..E)端口位设置/清除寄存器 16位寄存器GPIOx_LCKR(x = A..E)端口配置锁定寄存器 32位寄存器我们首先分析上面的结构电路:1、保护二极管:保护二极管从它的名字就不难想到他是用来对系统进行保护的,通过两个二极管的导通可以防止引脚外部输入电压过低或过高。
当电压过高时,上方的保护二极管导通。
当电压过低时,下方的二极管导通,防止不正常电压导入到芯片内部造成芯片烧毁。
GPIO参数配置GPIO是计算机的通用输入输出端口,可以通过设置参数来进行配置。
下面是一个包含1200字以上的GPIO参数配置详解。
功能配置是指对GPIO引脚的功能进行配置,主要包括输入和输出功能。
对于输入功能,可以设置引脚为普通输入模式或者带上拉或下拉电阻的输入模式。
对于输出功能,可以设置引脚为普通输出模式、开漏模式或者复用功能模式。
电气特性配置是指对GPIO引脚的电气特性进行配置,包括输出驱动能力、输出电平模式、输入电平模式等。
输出驱动能力可以设置为低驱动或者高驱动。
输出电平模式可以设置为默认模式、推挽输出模式或者开漏输出模式。
输入电平模式可以设置为默认模式、上拉输入模式或者下拉输入模式。
中断配置是指对GPIO引脚的中断功能进行配置,包括中断使能、中断触发方式、中断优先级等。
中断使能可以设置为使能或者禁止中断。
中断触发方式可以设置为上升沿触发、下降沿触发、边沿触发或者电平触发。
中断优先级可以设置为低优先级或者高优先级。
为了进行GPIO参数配置,需要首先获取GPIO控制器的句柄,通过该句柄可以进行GPIO参数的读写操作。
在进行GPIO参数配置之前,需要先对GPIO进行初始化,设置GPIO的基本属性。
以Linux系统为例,通过终端使用GPIO库函数来进行GPIO参数配置。
首先,需要引入相关的头文件,如`<sys/ioctl.h>`和`<fcntl.h>`等。
然后,通过打开GPIO设备文件获取GPIO控制器的句柄。
接下来,可以通过调用GPIO库函数来设置GPIO的功能、电气特性和中断配置等参数。
例如,通过`ioctl`函数可以设置GPIO的功能,通过`ioctl`函数的第三个参数设置为`GPIO_SET_INPUT`或者`GPIO_SET_OUTPUT`来分别设置GPIO为输入功能或者输出功能。
要配置GPIO引脚的电气特性,可以使用`ioctl`函数的第三个参数设置为`GPIO_SET_DRIVE`、`GPIO_SET_OUTPUT_MODE`或者`GPIO_SET_INPUT_MODE`来分别设置GPIO的输出驱动能力、输出电平模式和输入电平模式。
嵌入式Linux学习笔记(二)-GPIO接口嵌入式Linux学习笔记(二)-GPIO接口一、GPIO介绍GPIO意为通用输入输出端口,简单说就是一些引脚,通过它们输出高低电平或者通过它们读取引脚高低电平状态S3C2440有130个I/O端口,分为A-J共9组:GPA、GPB、、、、GPJ,可以通过设置寄存器来确定某个引脚用于输入、输出还是特殊功能。
比如:可以设置GPH6作为输入、输出、或者用于串口。
1、通过寄存器来操作GPIO引脚1)GPxCON寄存器它用于配置引脚的功能端口A与端口B-J在功能上有所不同,GPACON中每一位对应一根引脚(共23根引脚)当某位为0时,对应引脚为输出,此时在GPADAT中相应位写入0或1,让此引脚输出低电平或高电平;当某位被设为1时,对应引脚为地址线或用于地址控制,此时GPADAT保留不用。
GPACON通常被设为全1,以便访问外部存储设备端口B-J在寄存器操作上完全相同,GPxCon中每两位控制一根引脚,00表示输入,01表示输出,10表示特殊功能,11保留不用2)GPxDAT寄存器它用于读写引脚,当引脚被设为输入时,读此寄存器得到对应引脚的电平状态是高还是低;当引脚被设为输出时,写此寄存器相应位可令此引脚输出高低电平。
3)GPxUP寄存器GPxUP,某位为1时,相应引脚无内部上拉电阻;为1时,相应引脚使用内部上拉电阻上拉电阻、下拉电阻的作用在于,当GPIO引脚出于第三态(非高低电平,而是高阻态,即相当于没接芯片)时,它的电平状态由上拉电阻和下拉电阻确定。
2、使用软件来访问硬件当个引脚的操作有3种:输出高低电平、检测引脚状态、中断。
对某个引脚的操作一般通过读写寄存器实现首先我们从点亮LED开始,下图选自mini2440原理图,LED1-4分别对应GPB5-8如果要控制这些LED,那么我们首先要把GPBCON寄存器中GPB5-8对应的位设为输出功能,然后写GPBDAT寄存器的相应位,使这4个引脚输出高低电平一般是低电平有效,即高电平时,对应LED熄灭,低电平时,对应LED点亮访问寄存器的时候,通过S3C2440的数据手册查到GPBCON和GPBDAT寄存器的地址,附数据手册点击下载GPBCON为0x56000010,GPBDAT为0x56000014通过下面的代码让GPB5输出低电平,点亮LED1#define GPBCON (*(volatile unsigned long *) 0x56000010) //volatile修饰符确保每次去内存中读取变量的值,还不是从cache或者寄存器中#define GPBDAT (*(volatile unsigned long *) 0x56000014)#define GPB5_OUT (1<<(5*2)) //两位控制一个引脚,那么GPB5就是GPBCON的[11:10]位,1左移10位,则[11:10]为01,表示GPB5为输出GPBCON = GPB5_OUT;GPBDAT &= ~(1<<5); //1左移5位取反,那么第5位为0,即GPB5输出低电平,点亮LED1二、GPIO操作实例1、使用汇编代码点亮一个LED先看源程序 led_on.S.text.global _start_start:LDR R0,=0x56000010 @ R0设为GPBCON寄存器MOV R1,#0x00000400 @ 设置GPB5为输出口, 位[11:10]=0b01STR R1,[R0]LDR R0,=0x56000014 @ R0设为GPBDAT寄存器MOV R1,#0x00000000 @ 此值改为0x00000020,可让LED1熄灭STR R1,[R0] @ GPB5输出0,LED1点亮MAIN_LOOP:B MAIN_LOOP @无限循环再来看程序的Makefileled_on.bin : led_on.Sarm-linux-gcc -g -c -o led_on.oled_on.Sarm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elfarm-linux-objcopy -O binary -S led_on_elfled_on.binclean:rm -f led_on.binled_on_elf *.oled_on.S生成led_on.bin第一行做汇编第二行做连接,指定代码段起始地址为0x00000000第三行把ELF格式转为二进制格式clean用于清除编译生成的文件2、使用c语言代码点亮LED汇编可读性比C差,我们用C来实现@******************************************************************************@ File:crt0.S@ 功能:通过它转入C程序@******************************************************************************.text.global _start_start:ldr r0, =0x53000000 @ WATCHDOG寄存器地址mov r1, #0x0str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K,这4k是steppingstone,后面会介绍@ nand flash中的代码在复位后会移到内部ram中,此ram只有4Kbl main @ 调用C程序中的main函数halt_loop:b halt_loop下面是led_on_c.c#define GPBCON (*(volatile unsigned long *)0x56000010)#define GPBDAT (*(volatile unsigned long *)0x56000014)int main(){GPBCON = 0x00000400; // 设置GPB5为输出口, 位[11:10]=0b01GPBDAT = 0x00000000; // GPB5输出0,LED1点亮return 0;}最后是Makefileled_on_c.bin : crt0.S led_on_c.carm-linux-gcc -g -c -o crt0.o crt0.Sarm-linux-gcc -g -c -o led_on_c.oled_on_c.carm-linux-ld -Ttext 0x0000000 -g crt0.o led_on_c.o -o led_on_c_elfarm-linux-objcopy -O binary -S led_on_c_elfled_on_c.binarm-linux-objdump -D -m arm led_on_c_elf>led_on_c.disclean:rm -f led_on_c.disled_on_c.binled_on_c_elf *.o分别汇编crt0.S和led_on_c.c连接目标到led_on_c_elf,代码段起始地址位0x00000000转换ELF格式到二进制led_on_c.bin最后转换结果为汇编码方便查看3、测试程序在先前搭建的编译环境中进入代码目录#make得到的bin文件,在win中使用dnw下载到开发板,设置串口波特率,对应端口,8N1,下载地址0x00000000开关拨到nor flash,打开电源,出现菜单以后,选择a然后选择USB PORT-transmit/restore,选择编译好的bin文件然后开关拨到nand启动,效果如下:(设置LED1和LED4亮)4、使用按键来控制LEDK1-K6如上图对应GPG,我们使用K1-K4操作LED1-LED4@******************************************************************************@ File:crt0.S@ 功能:通过它转入C程序@******************************************************************************.text.global _start_start:ldr r0, =0x56000010 @ WATCHDOG寄存器地址mov r1, #0x0str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K,这4k是steppingstone,后面会介绍@ nand flash中的代码在复位后会移到内部ram中,此ram只有4Kbl main @ 调用C程序中的main函数halt_loop:b halt_loop下面是key_led.c文件#define GPBCON (*(volatile unsigned long *)0x56000010)#define GPBDAT (*(volatile unsigned long *)0x56000014)#define GPGCON (*(volatile unsigned long *)0x56000060)#define GPGDAT (*(volatile unsigned long *)0x56000064)/** LED1-4对应GPB5、GPB6、GPB7、GPB8*/#define GPB5_out (1<<(5*2))#define GPB6_out (1<<(6*2))#define GPB7_out (1<<(7*2))#define GPB8_out (1<<(8*2))/** K1-K4对应GPG0、GPG3、GPG5、GPG6*/#define GPG7_in ~(3<<(6*2))#define GPG6_in ~(3<<(5*2))#define GPG3_in ~(3<<(3*2))#define GPG0_in ~(3<<(0*2))int main(){unsigned long dwDat;// LED1-LED4对应的4根引脚设为输出GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out ;// K1-K4对应的2根引脚设为输入GPGCON = GPG0_in & GPG3_in & GPG6_in & GPG7_in ;while(1){//若Kn为0(表示按下),则令LEDn为0(表示点亮)dwDat = GPGDAT; // 读取GPG管脚电平状态if (dwDat& (1<<0)) // K1没有按下GPBDAT |= (1<<5); // LED1熄灭elseGPBDAT &= ~(1<<5); // LED1点亮if (dwDat& (1<<3)) // K2没有按下GPBDAT |= (1<<6); // LED2熄灭elseGPBDAT &= ~(1<<6); // LED2点亮if (dwDat& (1<<5)) // K3没有按下GPBDAT |= (1<<7); // LED3熄灭elseGPBDAT &= ~(1<<7); // LED3点亮if (dwDat& (1<<6)) // K4没有按下GPBDAT |= (1<<8); // LED4熄灭elseGPBDAT &= ~(1<<8); // LED4点亮}return 0;}最后是Makefilekey_led.bin : crt0.S key_led.carm-linux-gcc -g -c -o crt0.o crt0.Sarm-linux-gcc -g -c -o key_led.okey_led.carm-linux-ld -Ttext 0x0000000 -g crt0.o key_led.o -o key_led_elf arm-linux-objcopy -O binary -S key_led_elfkey_led.binarm-linux-objdump -D -m arm key_led_elf>key_led.disclean:rm -f key_led.diskey_led.binkey_led_elf *.o测试效果。
gpio详细解读-回复GPIO详细解读:控制的基石GPIO(通用输入输出)是现代计算机系统中一个非常重要的概念。
它是指计算机给用户提供的一组可以进行信号输入和输出的引脚。
这些引脚可以连接到各种设备,如传感器、执行器和其他外部设备上,用于与计算机系统进行交互。
在本文中,我们将一步一步对GPIO进行详细解读,从GPIO的基本概念到使用GPIO进行控制操作。
让我们开始吧!第一步:理解GPIOGPIO是计算机系统中的一组引脚,它可以实现信号的输入和输出。
通常情况下,每个GPIO引脚都可以配置为输入或输出模式,这取决于用户的需要。
GPIO的引脚数量通常取决于具体的硬件平台。
一些嵌入式系统可能只有几个引脚,而一些高性能计算机可能有更多的引脚。
无论引脚数量如何,它们都具有相同的基本属性:输入和输出。
第二步:使用GPIO之前的准备工作在开始使用GPIO之前,首先需要确保正确的连接。
这包括将GPIO 引脚与外部设备连接起来,并确保电源和接地线正常工作。
另外,使用GPIO之前还需要了解GPIO的技术规格。
这包括引脚数量、工作电压、电流规格等。
这些规格将帮助我们确保使用GPIO时的安全和正确操作。
第三步:配置GPIO为输入或输出一旦准备就绪,接下来的步骤是配置GPIO引脚为输入或输出模式。
这可以通过软件编程来实现,通常会使用操作系统提供的API或特定的编程语言库进行配置。
在配置GPIO引脚之前,需要确定引脚号码和使用的编程接口。
例如,树莓派(Raspberry Pi)支持Python编程语言,可以使用RPi.GPIO库来进行GPIO配置。
要将GPIO引脚设置为输入模式,可以使用相应的设置函数,并指定引脚号码。
同样地,要将GPIO引脚设置为输出模式,也可以使用相应的设置函数。
第四步:读取输入信号一旦GPIO引脚被配置为输入模式,我们可以从外部设备读取信号。
这可以通过相应的读取函数来实现,函数将返回引脚的电平状态。
GPIO引脚的电平状态通常分为高电平和低电平。
gpio端口的基本结构
GPIO端口的基本结构是由一组引脚组成,它们可以连接到控制和监测外部设备,可以通过读写数字来控制,它也可以用来检测外部设备的状态。
GPIO端口可以看作电路上的一个小接口,在计算机中,典型的GPIO端口由如下四个部分组成:
1. 电源引脚(Power Pin):此端口的电源信号,用于为了外部设备提供功耗,也可以用于向外部设备传送信号或者进行数据通信、控制信号等。
2. 数据引脚(Data Pin):此端口的数据信号,用于接收和发送数据,以及发送控制信号。
3. 接收引脚(Receive Pin):此端口的接收信号,用于对外部设备传来的信号、数据进行接收。
4. 返回引脚(Return Pin):此端口的返回信号,用于将外部设备发来的信号或者数据返回给计算机。
此外,GPIO端口还可以包含其他的特殊用途的引脚,比如有的GPIO端口还可以带有PWM脉宽调制引脚、I2C接口引脚、SPI接口引脚等,以满足不同的应用需求。
总之,GPIO端口是一个很重要的电气元件,它是控制和监测外部设备的重要接口。
通过此端口,人们可以更大程度地发挥计算机的作用,使计算机可以与各种外部设备共同工作,实现多种功能。
最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多:(1)GPIO_Mode_AIN 模拟输入(2)GPIO_Mode_IN_FLOATING 浮空输入(3)GPIO_Mode_IPD 下拉输入(4)GPIO_Mode_IPU 上拉输入(5)GPIO_Mode_Out_OD 开漏输出(6)GPIO_Mode_Out_PP 推挽输出(7)GPIO_Mode_AF_OD 复用开漏输出(8)GPIO_Mode_AF_PP 复用推挽输出对于刚入门的新手,我想这几个概念是必须得搞清楚的,平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但一直未曾对这些做过归纳。
因此,在这里做一个总结:推挽输出:可以输出高,低电平,连接数字器件; 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。
高低电平由IC的电源低定。
推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。
输出既可以向负载灌电流,也可以从负载抽取电流。
推拉式输出级既提高电路的负载能力,又提高开关速度。
详细理解:如图所示,推挽放大器的输出级有两个“臂”(两组放大元件),一个“臂”的电流增加时,另一个“臂”的电流则减小,二者的状态轮流转换。
对负载而言,好像是一个“臂”在推,一个“臂”在拉,共同完成电流输出任务。
当输出高电平时,也就是下级负载门输入高电平时,输出端的电流将是下级门从本级电源经VT3拉出。
这样一来,输出高低电平时,VT3 一路和 VT5 一路将交替工作,从而减低了功耗,提高了每个管的承受能力。
又由于不论走哪一路,管子导通电阻都很小,使RC常数很小,转变速度很快。
因此,推拉式输出级既提高电路的负载能力,又提高开关速度。
开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).开漏形式的电路有以下几个特点:1. 利用外部电路的驱动能力,减少IC内部的驱动。