gpio寄存器介绍

gpio寄存器介绍
gpio寄存器介绍

GPIO寄存器

在BCM2835中,共有54个GPIO管脚,其中GPIO寄存器有GPFSELn、GPSETn、GPCLRn等,下面具体描述这些寄存器的作用:

·寄存器 GPFSEL0 ~ GPFSEL5 ---- 功能寄存器,指定管脚为输入、输出等, 每3位决定一个管脚:

o 000 = GPIO Pin 9 is an input

o 001 = GPIO Pin 9 is an output

o 100 = GPIO Pin 9 takes alternate function 0

o 101 = GPIO Pin 9 takes alternate function 1

o 110 = GPIO Pin 9 takes alternate function 2

o 111 = GPIO Pin 9 takes alternate function 3

o 011 = GPIO Pin 9 takes alternate function 4

o 010 = GPIO Pin 9 takes alternate function 5

其中:(寄存器---地址---描述)

* GPFSEL0 --- 0x7E200000 --- 决定GPIO0-GPIO9管脚的功能

* GPFSEL1 --- 0x7E200004 --- 决定GPIO10-GPIO19管脚的功能

* GPFSEL2 --- 0x7E200008 --- 决定GPIO20-GPIO29管脚的功能

* GPFSEL3 --- 0x7E20000c --- 决定GPIO30-GPIO39管脚的功能

* GPFSEL4 --- 0x7E200010 --- 决定GPIO40-GPIO49管脚的功能

* GPFSEL5 --- 0x7E200014 --- 决定GPIO50-GPIO53管脚的功能

·寄存器 GPSET0 - CPSET1 ---- 设为1, 每一位决定一个管脚

o 0 = No effect

o 1 = Set GPIO pin n

其中:(寄存器---地址---描述)

* GPSET0 --- 0x7E20001C --- 决定GPIO0-GPIO31管脚

* GPSET1 --- 0x7E200020 --- 决定GPIO32-GPIO53管脚

·寄存器 GPCLR0 - GPCLR1 ---- 设为0, 每一位决定一个管脚

o 0 = No effect

o 1 = Clear GPIO pin n

其中:(寄存器---地址---描述)

* GPSET0 --- 0x7E200028 --- 决定GPIO0-GPIO31管脚

* GPSET1 --- 0x7E20002C --- 决定GPIO32-GPIO53管脚

单片机各寄存器汇总

符号 地址功能介绍 B F0H B寄存器 ACC E0H 累加器 PSW D0H 程序状态字 IP B8H 中断优先级控制寄存器 P3 B0H P3口锁存器 IE A8H 中断允许控制寄存器 P2 A0H P2口锁存器 SBUF 99H 串行口锁存器 SCON 98H 串行口控制寄存器 P1 90H P1口锁存器 TH1 8DH 定时器/计数器1(高8位)TH0 8CH 定时器/计数器1(低8位)TL1 8BH 定时器/计数器0(高8位)TL0 8AH 定时器/计数器0(低8位) TMOD 89H 定时器/计数器方式控制寄存器 TCON 88H 定时器/计数器控制寄存器 DPTR 82H 83H 83H数据地址指针(高8位) PC SP 81H 堆栈指针 P0 80H P0口锁存器 PCON 87H 电源控制寄存器 、PSW-----程序状态字。 D7D6D5D4D3D2D1D0 CY AC F0 RS1 RS0 OV P 下面我们逐一介绍各位的用途 CY:进位标志。 AC:辅助进、借位(高半字节与低半字节间的进、借位)。 F0:用户标志位,由用户(编程人员)决定什么时候用,什么时候不用。 RS1、RS0:工作寄存器组选择位。这个我们已知了。 0V:溢出标志位。运算结果按补码运算理解。有溢出,OV=1;无溢出,OV=0。什么是溢出我们后面的章节会讲到。

P :奇偶校验位:它用来表示ALU 运算结果中二进制数位“1”的个数的奇偶性。若为奇数,则P=1,否则为0。 运算结果有奇数个1,P =1;运算结果有偶数个1,P =0。 例:某运算结果是78H (01111000),显然1的个数为偶数,所以P=0。 定时/计数器寄存器 1.工作方式寄存器TMOD(P134) TMOD 为T0.T1的工作方式寄存器,其各位的格式如下:TMOD D7 D6 D 5 D4 D3 D2 D1 D0 GATE C/-T M1 M0 GATE C/-T M1 M0 定时器1 定时器0 位7 GATE ——T1的门控位。 当GATE=0时,只要控制TR1置1,即可启动定时器T1开始工作; 当GATE=1时,除需要将TR1置1外,还要使INT1引脚为高电平,才能启动相应的定时器开始工作。 位6 C/—T ——T1的功能选择位。 当C/—T=0时,T1为定时器方式; 当C/—T=0时,T1为计数器方式; 位5和位4 M1和M0——T1的方式选择位。 由这两位的组合可以定义T1的3种工作方式 定时器T1工作方式选择表 如右表: 位3 GATE ——T0的门控位。 当GATE=0时,只要控制TR0置1,即可启动定时器T0开始工作; 当GATE=1时,除需要将TR0置1外,还要使INT0引脚为高电平,才能启动相应的定时器开始工作。 位2 C/T ——T1的功能选择位。 当C/—T=0时,T0为定时器方式; 当C/—T=0时,T0为计数器方式; 位1和位0 M1和M0—T0的方式选择位。 由这两位的组合可以定义T1的3种工作方式 定时器T0工作方式选择表 TMOD 不能进行位寻址,只能用字节传送指令设置定时器工作方式,低半节定义定时器0,高半字节定义定时器1。复位时,TMOD 所有位均为0,定时器处于停止工作状态。 定时/计数器控制寄存器中断请求标志寄存器TCON(P183) TCON 的作用是控制定时器的启/停,标志定时器的溢出和中断情况。定时器控制寄存器TCON 各位格式如下:TCON(88H) 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 当有中断源发出请求时,有硬件将相应的中断标志位置 1.在中断请求被响应前,相应中断标志位被锁存在特殊功能寄存器TCON 或SCON 中。 TCON 为定时器T0和T1的控制寄存器,同时也锁住T0和T1的溢出中断标志及外部中断——INT0和— M1 M0 工作方式 功能描述 0 0 方式0 13位计数器 0 1 方式1 16位计数器 1 0 方式 2 自动再装入8位计数器 1 1 方式3 定时器1:停止计数 M1 M0 工作方式 功能描述 0 0 方式0 13位计数器 0 1 方式1 16位计数器 1 0 方式 2 自动再装入8位计数器 1 1 方式3 定时器0:分成2个8位计数器

I2C 接口实现通用 IO 扩展

Altera 公司 1AN-494-1.0 应用笔记494 利用MAX II CPLD 的I 2C 总线接 口实现GPIO 引脚扩展 引言本设计实例展示了Altera ? MAX ? II CPLD 通过工业标准I 2C 总线提供通 用I/O (GPIO) 引脚扩展的能力。为了减小封装尺寸和引脚数量,很多微 处理器系统限制了通用I/O 的数量。然而,如果系统有I 2C 接口,那么 本设计可以通过I 2C 总线来加入更多的 GPIO 引脚。借助于MAX II CPLD ,增加的这些GPIO 引脚要比微处理器的I/O 引脚功耗低。 GPIO 引脚扩展和I 2C 在某些情况下,可能需要通过较长的PCB 走线来访问系统中的GPIO 引 脚(例如蜂窝电话中不同部分的连接)。I 2C 接口是2线系统,本设计通 过普通的2线走线,在远端提供多个输入和输出引脚。这提高了设计灵活 性以及整个系统的物理紧凑性,还减小了封装尺寸和引脚数量。 可以通过这些通用输出引脚来连接并控制风扇控制器、LED 状态显示和 状态指示器等设备。同样的,复位引脚和按钮开关等设备可以直接连接到 CPLD 的通用输入上,实现各种应用。图1.通过I 2C 总线实现GPIO 引脚扩展 2007年12月,1.0版

利用MAX II CPLD的I2C总线接口实现GPIO引脚扩展 GPIO引脚扩展的I2C接口MAX II CPLD用作I2C总线从机,在其I2C接口上有两个引脚:I2C时钟SCL和I2C 数据线SDA。作为 I2C主机的主系统和MAX II(用作 I2C从机)进行通信。CPLD为主系统提供8个通用输入端口和8个通用输出端口。GPIO引脚并行接收 I2C总线串行发送的数据。这样,可以同时读写所有8个通用I/O。 I2C接口 对于I2C接口,CPLD(I2C从机)提供一个符合常用I2C 协议的内置7位地址。主机发送起始信号,然后是7位地址和一个R/W位。当I2C总线上广播的地址和从机设备的地址匹配时,根据主机发送的读或者写信号,设备发送一个ACK (应答)信号,然后是数据。随后是另一个ACK信号。以此不断进行数据交换,直到主机发送Stop (P)信号。 图2.I2C信号格式 表1.I2C接口引脚说明 信号目的方向SCL I2C时钟输出SDA I2C串行数据双向 2Altera公司

寄存器(register)

寄存器 Scope of register: 寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器能存储1位二进制数,所以由N个锁存器或触发器可以构成N位寄存器。寄存器是中央处理器内的组成部份。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。 1、寄存器- 特点及原理 寄存器又分为内部寄存器与外部寄存器,所谓内部寄存器,其实也是一些小的存储单元,也能存储数据。但同存储器相比,寄存器又有自己独有的特点: ①寄存器位于CPU内部,数量很少,仅十四个; ②寄存器所能存储的数据不一定是8bit,有一些寄存器可以存储16bit数据,对于386/486处理器中的一些寄存器则能存储32bit数据; ③每个内部寄存器都有一个名字,而没有类似存储器的地址编号。 寄存器的功能十分重要,CPU对存储器中的数据进行处理时,往往先把数据取到内部寄存器中,而后再作处理。外部寄存器是计算机中其它一些部件上用于暂存数据的寄存器,它与CPU之间通过“端口”交换数据,外部寄存器具有寄存器和内存储器双重特点。有些时候我们常把外部寄存器就称为“端口”,这种说法不太严格,但经常这样说。 外部寄存器虽然也用于存放数据,但是它保存的数据具有特殊的用途。某些寄存器中各个位的0、1状态反映了外部设备的工作状态或方式;还有一些寄存器中的各个位可对外部设备进行控制;也有一些端口作为CPU同外部设备交换数据的通路。所以说,端口是CPU和外设间的联系桥梁。CPU对端口(Ports)的访问也是依据端口的“编号”(地址),这一点又和访问存储器一样。不过考虑到机器所联接的外设数量并不多,所以在设计机器的时候仅安排了1024个端口

对GPIO的理解

对通用输入输出GPIO的深入理解 一.GPIO简介 I/O(Input/Output)接口是一颗微控制器必须具备的最基本外设功能。通常在ARM里,所有I/O都是通用的,称为GPIO(General Purpose Input/Output)。每个GPIO端口包含8个管脚,如PA端口是PA0~PA7。GPIO 模块支持多个可编程输入/输出管脚(具体取决于与GPIO复用的外设的使用情况)。GPIO模块包含以下特性: 1)可编程控制GPIO中断 ---屏蔽中断发生 ---边沿触发(上升沿、下降沿、双边沿) ---电平触发(高电平、低电平) 2)输入/输出可承受5V 3)在读和写操作中通过地址线进行位屏蔽 4)可编程控制GPIO管脚配置: ---弱上拉或弱下拉电阻 ---2mA、4mA、8mA驱动,以及带驱动转换速率(Slew Rate)控制的8mA 驱动 ---开漏使能 ---数字输入使能 二.GPIO的各种模式 GPIO管脚可以被配置为多种工作模式,其中有3种比较常用:高阻输入、推挽输出、开漏输出 1. 高阻输入(Input) 图1.1 GPIO高阻输入模式结构示意图 为减少信息传输线的数目,大多数计算机中的信息传输线采用总线形式,

即凡要传输的同类信息都在同一组传输线,且信息是分 时传送的。在计算机中一般有三组总线,即数据总线、地址总线和控制总线。为防止信息相互干扰,要求凡挂到总线上的寄存器或存储器等,它的输入输出端不仅能 呈现0、1两个信息状态,而且还应能呈现第三个状态----高阻抗状态,即此时好像它们的输出被开关断开,对总线状态不起作用,此时总线可由其他器件占用。三态缓冲器即可实现上述功能,它除具有输入输出端之外,还有一控制端。 如图1.1所示,为GPIO管脚在高阻输入模式下的等效结构示意图。这是一个管脚的情况,其它管脚的结构也是同样的。输入模式的结构比较简单,就是一个带有施密特触发输入(Schmitt-triggered input)的三态缓冲器(U1),并具有很高的输入等效阻抗。施密特触发输入的作用是能将缓慢变化的或者是畸变的输入脉冲信号整形成比较理想的矩形脉冲信号。执行GPIO管脚读操作时,在读脉冲(Read Pulse)的作用下会把管脚(Pin)的当前电平状态读到内部总线上(Internal Bus)。在不执行读操作时,外部管脚与内部总线之间是隔离的。 2. 推挽输出(Output) 图1.2 GPIO推挽输出模式结构示意图 推挽输出原理:在功率放大器电路中大量采用推挽放大器电路,这种电路中用两只三极管构成一级放大器电路, 两只三极管分别放大输入信号的正半周和负半周,即用一只三极管放大信号的正半周,用另一只三极管放大信号的负半周,两只三极管输出的半周信号在放大器负载 上合并后得到一个完整周期的输出信号。 推挽放大器电路中,一只三极管工作在导通、放大状态时,另一只三极管处于截止状态,当输入信号变化到另一个半周后,原先导通、放大的三极管进入截止,而原先截止的三极管进入导通、放大状态,两只三极管在不断地交替导通放大和截止变化,所以称为推挽放大器(https://www.360docs.net/doc/be11016304.html,)。

寄存器简单理解

GPIOB_BASE是一个地址,这个地址是GPIOB一系列寄存器的首地址,后面地址依次是GPIOB 的寄存器,将这个地址转换为结构体形式,并将后面寄存器按顺序定义在结构体里面,这样访问寄存器就可以通过引用结构体的形式了而不必书写寄存器的地址来访问寄存器。 寄存器用途: 1.可将寄存器内的数据执行算术及逻辑运算; 2.存于寄存器内的地址可用来指向内存的某个位置,即寻址; 3.可以用来读写数据到电脑的周边设备。 AX 累加器,得名原因是最初常使用ADD AX,n这样的指令 CX 计数器,得名原因是最常使用CX的值作为重复操作的次数 BX 常用作地址寄存器,如MOV AX,[BX],把BX所指地址中的数取到AX中去 DX 通用寄存器 所讲的寄存器都是以x86为基础的,那么这种CPU内,寄存器可分为以下几种: 1.EAX、EBX、ECX、EDX等通用寄存器——从通用上来讲,它所存储的东西,只要它的容积所容许的话,什么都是可以存储的; 2.CS、SS、ES等段寄存器——它所存储的只能是地址,它的作用是从寻址上可以体现出来; 3.EIP,也称为指令指针 4.EFLAGS寄存器,俗称为标志寄存器——所存储的是与CPU的每一个执行的指令有关。是关系到CPU每一个指令的执行相关内容与特殊的关联,即CPU所执行的指令是否违规,它的指令是否有进位,它的指令是否有溢出,都是在标志寄存器中能表现与表达出来; 5.浮点单元,这里面之所以只浮点单元,是因为在它里面还有一些小的寄存分类,主要是数学上的浮点上的计算 6.MMX指令使用的8个64位寄存器 7.单指令、多数据操作(SIMD,single-instruction,multiple-data)使用的8个128位XMM寄存器

msp430状态寄存器介绍概括

寄存器实在太多了。。我有个文档给你看看吧、、 MSP430寄存器中文注释---P1/2口(带中断功能) /************************************************************ * DIGITAL I/O Port1/2 寄存器定义有中断功能 ************************************************************/ #define P1IN_ 0x0020 /* P1 输入寄存器*/ const sfrb P1IN = P1IN_; #define P1OUT_ 0x0021 /* P1 输出寄存器*/ sfrb P1OUT = P1OUT_; #define P1DIR_ 0x0022 /* P1 方向选择寄存器*/ sfrb P1DIR = P1DIR_; #define P1IFG_ 0x0023 /* P1 中断标志寄存器*/ sfrb P1IFG = P1IFG_; #define P1IES_ 0x0024 /* P1 中断边沿选择寄存器*/ sfrb P1IES = P1IES_; #define P1IE_ 0x0025 /* P1 中断使能寄存器*/ sfrb P1IE = P1IE_; #define P1SEL_ 0x0026 /* P1 功能选择寄存器*/ sfrb P1SEL = P1SEL_; #define P2IN_ 0x0028 /* P2 输入寄存器*/ const sfrb P2IN = P2IN_; #define P2OUT_ 0x0029 /* P2 输出寄存器*/ sfrb P2OUT = P2OUT_; #define P2DIR_ 0x002A /* P2 方向选择寄存器*/ sfrb P2DIR = P2DIR_; #define P2IFG_ 0x002B /* P2 中断标志寄存器*/ sfrb P2IFG = P2IFG_; #define P2IES_ 0x002C /* P2 中断边沿选择寄存器*/ sfrb P2IES = P2IES_; #define P2IE_ 0x002D /* P2 中断使能寄存器*/ sfrb P2IE = P2IE_; #define P2SEL_ 0x002E /* P2 功能选择寄存器*/ sfrb P2SEL = P2SEL_; MSP430寄存器中文注释---P3/4口(无中断功能) /************************************************************ * DIGITAL I/O Port3/4寄存器定义无中断功能 ************************************************************/ #define P3IN_ 0x0018 /* P3 输入寄存器*/

(完整)STM32中使用GPIO的总结(超强),推荐文档

STM32 GPIO使用 操作步骤: 1.使能GPIO对应的外设时钟 例如://使能GPIOA、GPIOB、GPIOC对应的外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB| RCC_APB2Periph_GPIOC , ENABLE); 2.声明一个GPIO_InitStructure结构体 例如: GPIO_InitTypeDef GPIO_InitStructure; 3.选择待设置的GPIO管脚 例如:/* 选择待设置的GPIO第7、8、9管脚位,中间加“|”符号 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; 4.设置选中GPIO管脚的速率 例如:/* 设置选中GPIO管脚的速率为最高速率2MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //最高速率2MHz 5.设置选中GPIO管脚的模式 例如:/* 设置选中GPIO管脚的模式为开漏输出模式*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出模式 6. 根据GPIO_InitStructure中指定的参数初始化外设GPIOX 例如:/* 根据GPIO_InitStructure中指定的参数初始化外设GPIOC */ GPIO_Init(GPIOC, &GPIO_InitStructure); 7.其他应用 例:将端口GPIOA的第10、15脚置1(高电平) GPIO_SetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15); 例:将端口GPIOA的第10、15脚置0(低电平) GPIO_ResetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15);

UART寄存器介绍

UART寄存器介绍 UARTn_BR: UART波特率寄存器 UARTn_BR[15:0]: 由定时器的装入寄存器定时装入相应内容。 UARTn_CR.Run=0可以装入直到UARTn_CR.Run=1才写入无效 UARTn_TxBUFR:UART传输寄存器 UARTn_TxBUFR[8]: 传输数据第八位或者奇偶校验位或者唤醒位或者未定义的位有相应操作模式决定 1.如果是001模式则此位写0 2.如果是8+校验111模式则此位由UART自己处理写入软件操作无效 UARTn_TxBUFR[7]: 传输数据第七位或者奇偶校验位 1.如果是7+校验011模式同样此位由UART自己处理写入软件操作无效 UARTn_TxBUFR[6:0]:数据位 UARTn_RxBuffer: UART接收寄存器 RX[9]:桢错误标志1表示此桢有问题 RX[8]:接收数据位8,或者奇偶校验位或者唤醒位

RX[7]:接收数据位7,或者奇偶校验位 RX[6:0]:数据位 UARTn_CR:UART控制寄存器 CR[15-11]保留都是0 CR[10]FifoEnble队列模式0关闭表示TxFIFO认为是包含了16位数据才是满栈 1是开启表示TxFIFO认为当前就是才是满栈直接置TxFULL位 CR[9]SCENBLE 智能卡关闭还是开启不使用则置0 CR[8]RxEnble 接收功能关闭开启由下降沿来触发RXD脚初始化 CR[7]Run=0波特率无用=1则有用 CR[6]LoopBack=0标准的接收和发送模式=1是特殊模式。此位只由UART无效被改变 CR[5]ParityOdd选择奇偶校验=0则为偶校验=1为奇校验CR[43]StopBits 00 0.5停止位01是1个停止位10是1.5个11是2个 CR[2:0] MODE 5种模式 UARTn_IER UART的中断允许寄存器 15-9保留位为0 8 RxHalfFullIE 接收存储器超过8位则置

14、芯片与寄存器的介绍

理解芯片控制的原理 如果要说做单片机很难吗?其实并不难,用3句话就可以讲明白: 第1句话:芯片管脚不是输入,就是输出。 我们所有的程序,用单片机控制的产品,以及外设,无非就是控制芯片的各个管脚输入或者输出两个状态;例如,芯片发送数据就是输出;芯片驱动一个产品,也是输出;芯片接收数据就是输入;单片机对一个存储芯片写输入,可以理解为单片机与存储芯片连接的管脚输出状态,输出数据到存储芯片的管脚上,而存储芯片此时它的芯片对应管脚被配置成输入,将数据写入到芯片内部。 所以说,芯片管脚不是输入,就是输出,当然,如果你不使用这个管脚,也可以将它配置成某一种中间状态,免得干扰了外界,影响了PCB板上的其他元器件状态。 第2句话:芯片管脚不是高电平,就是低电平。 无论管脚是输入还是输出,它的目的是传输数据,传输信息,所以要么是高电平,要么低电平,通过010101这样的数据来传输它想传输的内容;这个就是所谓的二进制。 第3句话:传输协议。 什么是传输协议,比如与串口芯片通信,那么就要是串口协议的;如果是I2C 协议的EERPOM,那么就是I2C协议;还有其他一些比如485协议,CAN协议,USB协议,SD卡的SDIO协议…….等等数不胜数。 而这些协议,无非就是按照预先规定的表达方式进行通信,比如举个例子,我约定先连续发4个1,,然后再发4个0,就表示芯片A要开始发数据给芯片B 了,即芯片A通过它的芯片管脚发‘11110000’给到芯片B的时候,那么芯片B 就知道芯片A要给它真正的数据,它就要做好准备工作,准备好之后,芯片B 就会给芯片A一个回应,当芯片A收到芯片B的回应,就正式开始发数据。 这样通信双方之间的协商规定,就构成了协议,经过这么多年,就形成了我们所常见到的串口协议,CAN协议,USB协议(像USB协议又分为USB1.0协议,USB2.0协议,USB3.0协议,版本越高,速度就越快,协议进行优化后,通信效率也变高了)。 不知道大家理解了没有呢?所以总结下来,一个芯片最简单的外设莫过于 I/O口的高低电平控制,我们这里将详细讲解一下如何用一个I/O口去控制一个LED灯的亮灭。

Linux内核文档:GPIO接口

原文:Documentation/gpio.txt 翻译:tekkamanninja@https://www.360docs.net/doc/be11016304.html, 翻译完成时间:2012年2月18日星期六 V1.0

目录 什么是GPIO? (3) GPIO公约 (3) 标识GPIO (3) 使用 GPIO (4) 访问自旋锁安全的GPIO (4) 访问可能休眠的GPIO (5) 声明和释放GPIO (5) GPIO映射到IRQ (7) 模拟开漏信号 (7) GPIO实现者的框架 (可选) (8) 控制器驱动: gpio_chip (8) 平台支持 (8) 板级支持 (9) 用户空间的Sysfs接口(可选) (9) Sysfs中的路径 (9) 从内核代码中导出 (10)

本文档提供了一个在Linux下访问GPIO的公约概述。 这些函数以gpio_* 作为前缀。其他的函数不允许使用这样的前缀或相关的__gpio_* 前缀。 什么是GPIO? "通用输入/输出口"(GPIO)是一个灵活的由软件控制的数字信号。他们可由多种芯片提供,且对于从事嵌入式和定制硬件的Linux开发者来说是比较熟悉。每个GPIO都代表一个连接到特定引脚或球栅阵列(BGA)封装中“球珠”的一个位。电路板原理图显示了GPIO与外部硬件的连接关系。驱动可以编写成通用代码,以使板级启动代码可传递引脚配置数据给驱动。 片上系统(SOC) 处理器对GPIO有很大的依赖。在某些情况下,每个非专用引脚都可配置为GPIO,且大多数芯片都最少有一些GPIO。可编程逻辑器件(类似FPGA) 可以方便地提供GPIO。像电源管理和音频编解码器这样的多功能芯片经常留有一些这样的引脚来帮助那些引脚匮乏的SOC。同时还有通过I2C或SPI串行总线连接的"GPIO扩展器"芯片。大多数PC的南桥有一些拥有GPIO能力的引脚(只有BIOS固件才知道如何使用他们)。 GPIO的实际功能因系统而异。通常的用法有: - 输出值可写(高电平=1, 低电平=0)。一些芯片也有如何驱动这些值的选项,例如只允许输出一个值、支持“线与”及其他取值类似的模式(值得注意的是“开漏”信号)。 - 输入值可读(1、0)。一些芯片支持引脚在配置为“输出”时回读,这对于类似“线与”的情况(以支持双向信号)是非常有用的。GPIO 控制器可能有输入去毛刺/消抖逻辑,这有时需要软件控制。 - 输入通常可作为IRQ信号,一般是沿触发,但有时是电平触发。这样的IRQ 可能配置为系统唤醒事件,以将系统从低功耗状态下唤醒。 - 通常一个GPIO根据不同产品电路板的需求,可以配置为输入或输出,也有仅支持单向的。 - 大部分GPIO 可以在持有自旋锁时访问,但是通常由串行总线扩展的GPIO不允许持有自旋锁。但某些系统也支持这种类型。 对于给定的电路板,每个GPIO都用于某个特定的目的,如监控MMC/SD卡的插入/移除、检测卡的写保护状态、驱动LED、配置收发器、模拟串行总线、复位硬件看门狗、感知开关状态等等。 GPIO公约 注意,这个叫做“公约”,因为这不是强制性的,不遵循这个公约是无伤大雅的,因为此时可移植性并不重要。GPIO常用于板级特定的电路逻辑,甚至可能随着电路板的版本而改变,且不可能在不同走线的板子上使用。仅有在很少的功能上才具有可移植性,其他功能是平台特定。这也是由于“胶合”的逻辑造成的。 此外,这不需要任何的执行框架,只是一个接口。某个平台可能通过一个简单的访问芯片寄存器的内联函数来实现它,其他平台可能通过委托一系列不同的GPIO控制器的抽象函数来实现它。(有一些可选的代码能支持这种策略的实现,本文档后面会介绍,但作为GPIO接口的客户端驱动程序必须与它的实现无关。) 也就是说,如果在他们的平台上支持这个公约,驱动应该尽可能的使用它。平台必须在Kconfig中声明对GENERIC_GPIO 的支持(布尔型true),并提供一个 文件。那些调用标准GPIO函数的驱动应该在Kconfig 入口中声明依赖GENERIC_GPIO。当驱动包含文件: #include GPIO函数是可用,无论是“真实代码”还是经优化过的语句。 如果你遵守这个公约,当你的代码完成后,对其他的开发者来说会更容易看懂和维护。 注意,这些操作包含所用平台的I/O 屏障代码,驱动无须显式地调用他们。 标识GPIO

段寄存器的工作原理

一、段寄存器的产生 段寄存器的产生源于Intel 8086 CPU体系结构中数据总线与地址总线的宽度不一致。 数据总线的宽度,也即是ALU(算数逻辑单元)的宽度,平常说一个CPU是“16位”或者“32位”指的就是这个。8086CPU的数据总线是16位。 地址总线的宽度不一定要与ALU的宽度相同。因为ALU的宽度是固定的,它受限于当时的工艺水平,当时只能制造出16位的ALU;但地址总线不一样,它可以设计得更宽。地址总线的宽度如果与ALU相同当然是不错的办法,这样CPU的结构比较均衡,寻址可以在单个指令周期内完成,效率最高;而且从软件的解决来看,一个变量地址的长度可以用整型或者长整型来表示会比较方便。 但是,地址总线的宽度还要受制于需求,因为地址总线的宽度决定了系统可寻址的范围,即可以支持多少内存。如果地址总线太窄的话,可寻址范围会很小。如果地址总线设计为16位的话,可寻址空间是2^16=64KB,这在当时被认为是不够的;Intel最终决定要让8086的地址空间为1M,也就是20位地址总线。 地址总线宽度大于数据总线会带来一些麻烦,ALU无法在单个指令周期里完成对地址数据的运算。有一些容易想到的可行的办法,比如定义一个新的寄存器专门用于存放地址的高4位,但这样增加了计算的复杂性,程序员要增加成倍的汇编代码来操作地址数据而且无法保持兼容性。 Intel想到了一个折中的办法:把内存分段,并设计了4个段寄存器,CS,DS,ES和SS,分别用于指令、数据、其它和堆栈。把内存分为很多段,每一段有一个段基址,当然段基址也是一个20位的内存地址。不过段寄存器仍然是16位的,它的内容代表了段基址的高16位,这个16位的地址后面再加上4个0就构成20位的段基址。而原来的16位地址只是段内的偏移量。这样,一个完整的物理内存地址就由两部分组成,高16位的段基址和低16位的段内偏移量,当然它们有12位是重叠的,它们两部分相加在一起,才构成完整的物理地址。 Base b15 ~ b12 b11 ~ b0 Offset o15 ~ o4 o3 ~ o0 Address a19 ~ a0 这种寻址模式也就是“实地址模式”。在8086中,段寄存器还只是一个单纯的16位寄存器,而且操作寄存器的指令也不是特权指令。通过设置段寄存器和段内偏移,程序就可以访问整个

王猛stm32_GPIO接口原理及使用LED流水灯

( 一) 在学习STM32芯片时,首先要接触的第(一)个内容就是对STM32_GPIO接口的配置和使用。 下面以一个LED流水灯的实验来进行说明。 首先看一下LED的原理图: 从图中可以看出4个LED一端分别连接 STM32芯片的PF6\PF7\PF8\PF9四个引脚,另一端共连一高电平,因此,当PF6\PF7\PF8\PF9分别输出低电平时,4 个LED点亮,输出高电平时LED熄灭,图中电阻主要起限流作用,防止LED或GPIO引脚因电流过大而损坏。 LED流水灯就是通过对STM32引脚的配置,将引脚配置成输出(高、低)电平来实现LED灯的亮灭。 程序实现步骤 1、LED.h头文件:主要用来定义各引脚的 规则(1) #ifndef _LED_H /*测试LED.h是否被定义过*/ (2) #define _LED_H /*如果没有定义则定义*/ (3) #endif /*如果定义了,则跳过(2)、(3)直接执 /*行语句(4)、(5)*/ (4)语句……… (5) 语句……… 备注:#ifndef与#endif要一起使用,否则可能报错 例:#ifndef _LED_H #define _LED_H #include “main.h”(其包含stm32f10x.h)注意位置要在 ifndef,与define后 #define RCC_APB2Periph_LED RCC_APB2Periph_GPIOF /*定义了LED的

使/失能时钟接口,即PF 口*/ #define GPIO_LED GPIOF/*定义LED对应的GPIO组即PF*/ /*定义了每个LED灯对应的引脚名称*/ #define GPIO_DS1_PIN GPIO_Pin_6 #define GPIO_DS2_PIN GPIO_Pin_7 #define GPIO_DS3_PIN GPIO_Pin_8 #define GPIO_DS4_PIN GPIO_Pin_9 #define LED_NUM 4 //定义了LED灯的个数4个 Void Turnon_LED(u8 LED_number);//函数声明 Void Delay(u32 nCount);//函数声明 #endif 自此LED.h文件定义完毕 2、LED.c程序文件:主要实现LED灯的流水闪烁 例:void LED(void) { u8 count=0;/*定义一个计数变量 GPIO_InitTypeDef GPIO_InitStructure;/*定义一结构 体用来初始化LED_GPIO 接口 RCC_APB2PeriphClockCmd(RCC_APB2Periph_LED,ENABLE);/* 开启LED的GPIO接口时 钟 /*对各LED所连接的引脚进行配置*/ GPIO_InitStructure.GPIO_Pin = GPIO_DS1_PIN|GPIO_DS2_PIN| GPIO_DS3_PIN| GPIO_DS4_PIN; /*选择引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;/设置为 推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHZ;/输出速 率50MHZ,引脚作为输出时,则配置Speed,作为输入用时,可不 必配置 GPIO_Init(GPIOF,&GPIO_InitStructure)/初始化LED_GPIO接 口 下面就来给各LED对应的引脚配置高、低电平以使其亮、灭。其中所

AD9833详细原理解析(附内部寄存器说明)

基于AD9833的高精度可编程波形发生器系统设计 来源:国外电子元器件 1 引言 频率合成器在通信、雷达和导航等设备中既是发射机的激励信号源,又是接收机的本地振荡器;在电子对抗设备中可作为干扰信号发生器;在测试设备中则作为标准信号源。因此频率合成器被称为许多电子系统的“心脏”。而设计高精度,易于操作的频率合成器则是核心,因此,这里提出了一种基于DDS AD9833的高精度波形发生器系统解决方案。用户可直接编辑设置所需的波形频率和峰峰值等信息,利用串口将配置信息发送到电路板,实时控制波形。该系统设计已成功应用于某型雷达测速仪测试设备。 2 AD9833简介 AD9833是ADI公司的一款低功耗、DDS器件,能够输出正弦波、三角波、方波。AD9833无需外接元件,输出频率和相位可通过软件编程设置,易于调节。其频率寄存器为28位,主频时钟为25 MHz时,其精度为0.1 Hz;主频时钟为l MHz时.精度可达0.004 Hzt2。 AD9833内部有5个可编程寄存器:1个16位控制寄存器,用于设置器件_T 作模式;2个28位频率寄存器和2个12位相位寄存器,分别用于设置器件输出正弦波的频率和相位。AD9833有3根串行接口线,可与SPI,QSPI,MICRO-WIRE 和DSP接口标准相兼容。在串口时钟SCLK的作用下,数据是以16位方式加载至设备。 AD9833的内部电路主要有数控振荡器(NCO)、频率和相位调节器、SineROM、D/A转换器、电压调整器。AD9833的核心是28位的相位累加器,它由加法器和相位寄存器组成,而相位寄存器是按每个时钟增加步长,相位寄存器的输出与相位控制字相加后输入到正弦查询表地址中。正弦查询表包含1个周期正弦波的数字幅值信息,每个地址对应正弦波中O。~360°内的1个相位点。查询表把输入的地址相位信息映射成正弦波幅值的数字量信号,驱动D/A转换器输出模拟量。 输出正弦波频率为: 式中:FREQREG为频率控制字,由频率寄存器FREQOREG或FREQlREG的值给定,其范围为0≤M<228一1。fMCLK为参考时钟频率。 输出正弦波的相位为2π/4 096xPHASEREG,其中PHASEREG是所选相位寄存器的值。输出正弦波的峰峰值固定.约600 mV,且正弦波不是标准正弦波,即波谷是0 V,而不是负电压。因此,输出正弦波为: 式中:K约600 mV,与器件内部参考电压有关。

GPIO

F2812 I/O配置与应用浅析 GPIO,英文全称为General-Purpose IO ports,也就是通用IO口。嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。 接口至少有两个寄存器,即“通用IO控制寄存器”与“通用IO数据寄存器”。数据寄存器的各位都直接引到芯片外部,而对这种寄存器中每一位的作用,即每一位的信号流通方向,则可以通过控制寄存器中对应位独立的加以设置。这样,有无GPIO接口也就成为微控制器区别于微处理器的一个特征。 一、 F2812 I/O端口概述 F2812提供了56个多功能引脚,这些引脚的第一功能是作为通用意义数字I/O口(GPIO),而第二功能则可以作为片内外设的输入/输出引脚。F2812通过专门的多路选择器(MUX)进行引脚功能的选择。如果作为通用数字I/O口,有专门的方向寄存器用于配置引脚作为输入还是输出,另外还有专门的数据寄存器、置位寄存器、清零寄存器以及触发寄存器用于对I/O口的状态进行读取或配置。 GPIO 引脚分配 GPIO A GPIOA0 / PWM1 GPIOA1 / PWM2 GPIOA2 / PWM3 GPIOA3 / PWM4 GPIOA4 / PWM5 GPIOA5 / PWM6 GPIOA6 / T1PWM_T1CMP GPIOA7 / T2PWM_T2CMP GPIOA8 / CAP1_QEP1 GPIOA9 / CAP2_QEP2 GPIOA10 / CAP3_QEPI1 GPIOA11 / TDIRA GPIOA12 / TCLKINA GPIOA13 / C1TRIP GPIOA14 / C2TRIP GPIOA15 / C3TRIP GPIO B GPIOB0 / PWM7 GPIOB1 / PWM8 GPIOB2 / PWM9 GPIOB3 / PWM10 GPIOB4 / PWM11 GPIOB5 / PWM12 GPIOB6 / T3PWM_T3CMP GPIOB7 / T4PWM_T4CMP GPIOB8 / CAP4_QEP3 GPIOB9 / CAP5_QEP4 GPIOB10 / CAP6_QEPI2 GPIOB11 / TDIRB GPIOB12 / TCLKINB GPIOB13 / C4TRIP GPIOB14 / C5TRIP GPIOB15 / C6TRIP GPIO D GPIOD0 / T1CTRIP_PDPINTA GPIOD1 / T2CTRIP / EVASOC GPIOD5 / T3CTRIP_PDPINTB GPIOD6 / T4CTRIP / EVBSOC GPIO E GPIOE0 / XINT1_XBIO GPIOE1 / XINT2_ADCSOC GPIOE2 / XNMI_XINT13 GPIO F GPIOF0 / SPISIMOA GPIOF1 / SPISOMIA GPIOF2 / SPICLKA GPIOF3 / SPISTEA

GPIO 接口测试

GPIO接口测试步骤 一、设置硬件环境 连接VS子板从dm8168扩展出来的GPIO连接到了VS子板的J1接口 二、配置编译linux内核 1》在linux-2.6.37-psp04.00.00.12/arch/arm/mach-omap2/ board-ti8168evm.c文件的558行添加TI816X_MUX(SC1_DATA, OMAP_MUX_MODE2), TI816X_MUX(SC0_DET, OMAP_MUX_MODE2), 配置GP0[24] GP1[9]管脚为GPIO管脚 2》配置linux内核使能Device Drivers –》GPIO Support –》/sys/class/gpio 三、启动开发板 四、创建GPIO节点 echo 24 > /sys/class/gpio/export echo 41 > /sys/class/gpio/export 五、设置GPIO方向 cd /sys/class/gpio/gpio24 echo "out" > direction cd /sys/class/gpio/gpio41 echo "out" > direction 六、改变GPIO值 cd /sys/class/gpio/gpio24 echo 1 > value cd /sys/class/gpio/gpio41 echo 1 > value 使用万用表测量VS子板–》JP1 –》1 或3管脚为高电平 cd /sys/class/gpio/gpio24 echo 0 > value

cd /sys/class/gpio/gpio41 echo 0 > value 使用万用表测量VS子板–》JP1 –》1 或3管脚为低电平 七、运行C测试程序 运行gpio0-24-test 或gpio1-9-test测试例程,使用示波器可以看到频率为1HZ的方波 一、Follow these steps for controlling the GPIO lines from sysfs entries a. Export, which GPIO pin you want to control. Below steps are done with respect to GPIO30 (an example $ echo 30 > /sys/class/gpio/export b. Change the GPIO pin direction to in/out $ echo "out" > /sys/class/gpio/gpio30/direction $ echo "in" > /sys/class/gpio/gpio30/direction c. Changing the value $ echo 1 > /sys/class/gpio/gpio30/value $ echo 0 > /sys/class/gpio/gpio30/value d. Unexport the GPIO pin $ echo 30 > /sys/class/gpio/unexport Sysfs entries are created from 0 - 63 in case of DM816X because it has two GPIO banks 0 and 1. Note: GPIO's which are used already in the drivers can not be control from sysfs, unless untill driver export that particular pin. Run these commands for knowing what are the GPIO's already requested in the drivers. $ mount -t debugfs debugfs /sys/kernel/debug $ cat /sys/kernel/debug/gpio

相关文档
最新文档