GPIO简介

什么是GPIO?
         General Purpose Input Output (通用输入/输出)简称为GPIO,或总线扩展器,利用工业标准I2C、SMBus或SPI接口简化了I/O口的扩展。当微控制器或芯片组没有足够的I /O端口,或当系统需要采用远端串口通信或控制时,GPIO产品能够提供额外的控制和监视功能。
嵌入式系统中常常有数量众多,但是 结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。而且,许多这样的设备 /电路只要求 一位,即只要有开/关两种状态就够了,比如灯亮与灭。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般 都会提供一个 “通用可编程IO接口”,即GPIO。
  接口至少有两个寄存器,即“通用IO控制寄存器”与“通用IO数据寄存器”。数据寄存器的各位都 直接引到芯片外部,而对这种寄存器中每一位的作用,即每一位的信号流通方向,则可以通过控制寄存器中对应位独立的加以设置。这样,有无 GPIO接口也就成 为微控制器区别于微处理器的一个特征。
  在实际的MCU中,GPIO是有多种形式的。比如,有的数据寄存器可以按照位寻址,有些却不能按 照位寻址,这在编程时就要区分了。比如传统的8051系列,就区分成可位寻址和不可位寻址两种寄存器。另外,为了使用的方便,很多mcu把 glue logic等集成到芯片内部,增强了系统的稳定性能,比如GPIO接口除去两个标准寄存器必须具备外,还提供上拉寄存器,可以设置IO的输出模式是高阻, 还是带上拉的电平输出,或者不带上拉的电平输出。这在电路设计中,外围电路就可以简化不少。
  另外需要注意的是,对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的。如果系统结构支持独立的IO地址空间,并且是 端口映射,就必须使用汇编语言完成实际对设备的控制,因为C语言并没有提供真正的“端口”的概念。如果是内存映射,那就方便的多了。
GPIO优点
  GPIO的优点(端口扩展器)
  低功耗:GPIO具有更低的功率损耗(大约1μA,μC的工作电流则为100μA)。
  集成IIC从机接口:GPIO内置I2C从机接口,即使在待机模式下也能够全速工作。
  小封装:GPIO器件提供最小的封装尺寸 ― 3mm x 3mm QFN!
  低成本:您不用为没有使用的功能买单!
  快速上市:不需要编写额外的代码、文档,不需要任何维护工作!
  灵活的灯光控制:内置多路高分辨率的PWM输出。
  可预先确定响应时间:缩短或确定外部事件与中断之间的响应时间。
  更好的灯光效果:匹配的电流输出确保均匀的显示亮度。
  布线简单:仅需使用2条就可以组成I2C总线或3条组成SPI总线。
  与ARM 的几组GPIO引脚,功能相似,GPxCON 控制引脚功能,GPxDAT用于读写引脚数据。另外,GPxUP用于确定是否使用上拉电阻。
  x为A,B,,H/J,  
      没有上拉电阻。
### GPIO编程使用指南 #### 1. GPIO简介 GPIO(General Purpose Input Output),即通用输入输出端口,是一种可由软件控制其行为的硬件资源。它允许微控制器与其他外部设备通信,既可以作为输入也可以作为输出。 #### 2. STM32中的GPIO配置流程 STM32系列单片机提供了丰富的外设功能,其中GPIO是最基础也是最常用的外设之一。以下是基于STM32的标准库或HAL库实现GPIO初始化的一般过程: - **启用时钟**:任何外设操作前都需要先开启对应的时钟。 - **定义结构体变量**:用于存储GPIO的具体参数设置。 - **配置引脚属性**: - 设置引脚号(Pin Number)。 - 定义工作模式(Mode)。 - 设定速度(Speed)、上下拉电阻状态(Pull-up/Pull-down)以及驱动方式(Push-pull/Open-drain)。 - **调用初始化函数**:完成实际的寄存器写入动作。 具体到代码层面,在标准库环境下可以参照如下模板[^1];而在较新的HAL库框架下则有另一种形式[^2]。 #### 3. 示例程序分析 这里给出两个版本的例子来说明如何通过不同的开发环境去操控一个连接在PD12上的LED灯泡亮灭情况。 ##### (1)Standard Peripheral Library Example ```c #include "stm32f4xx.h" int main(void){ // Enable clock access to GPIOD port. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); // Initialize structure used for configuring the pin settings. GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // Select PD12 as target pin. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // Set it into output mode. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;// Define maximum switching frequency. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // Choose push pull type operation. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // No internal resistor connection. // Apply these configurations onto physical hardware component. GPIO_Init(GPIOD,&GPIO_InitStructure); while(1){ // Turn ON LED connected at PD12 by setting its value high. GPIO_SetBits(GPIOD, GPIO_Pin_12); // Simple delay loop without using any specialized timing functions. for(int i=0;i<1000000;i++); // Now turn OFF that same led again but this time clearing bit instead of setting one. GPIO_ResetBits(GPIOD, GPIO_Pin_12); // Another simple busy waiting period implemented via counting iterations inside a dummy cycle construct. for(int j=0;j<1000000;j++); } } ``` ##### (2)Hardware Abstraction Layer (HAL) Library Approach For projects utilizing STMicroelectronics' more contemporary Hardware Abstraction Layers approach here's an alternative method which leverages their prebuilt helper macros and routines making things slightly easier compared with raw register manipulations seen previously under standard peripheral libraries context above: ```c void GPIO_Configuration(void){ GPIO_InitTypeDef GPIO_InitStruct; /* Enable Clock Access To Port A */ __HAL_RCC_GPIOA_CLK_ENABLE(); /** Configure PA0 Pin As Push Pull Output With Internal Resistor Pulled Up At High Speed Operation Mode **/ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; /* Perform Actual Initialization On Physical Component Level Through Provided API Call */ HAL_GPIO_Init(GPIOA ,&GPIO_InitStruct ); } /* Inside Main Function After Calling Above Setup Routine You Can Simply Toggle State Of That Particular Bit Using Below Macro Definitions Directly Without Needing Additional Loops Etc..*/ while(true){ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET ); Delay(); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);Delay(); } ``` 以上两种方法展示了利用不同工具链针对相同任务所采取的不同策略。前者更加贴近底层细节而后者封装程度更高从而简化了一些常见重复性的劳动强度但是同时也隐藏掉了部分内部工作机制原理因此理解两者区别有助于开发者根据项目需求灵活选用合适的技术路线[^1].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值