gpio (一) 硬件

  • gpio 与 管脚 的关系
General-purpose input/outputs

一般除了 vcc gnd 这些管脚 ,其他所有管脚都支持gpio.

vcc/vdd 和 gnd/vss 属于 supply pin
其他管脚属于 I/O pin,其中极少数只能 Input

大部分管脚能被作为 gpio 使用,还可以被复用为其他功能(例如,串口)
管脚 功能 可能是普通的gpio ,也可能是 串口, pwm 功能,中断,中的一个或者复用.

  • gpio 是什么
是功能,由什么支撑的
	IO口基本结构
	请查询 <M3 IO口基本结构>
		其中包括 (输入数据,输出数据,位设置,位清除)寄存器 ttl肖特基触发器 上下拉电阻 pmos nmos 保护二级管  .

51 的 gpio

// 比较简单,直接控制输出,没有时钟,
#include <reg51.h>
//P0口输出0xFE
P0  = 0xFE;

stm32f4 的 gpio


STM32F4 最多有 9 组 IO,分别用大写字母表示,即 x=A/B/C/D/E/F/G/H/I,每组16个IO口

STM32F4 每组通用 I/O 端口包括 
	432 位配置寄存器(MODER、OTYPER、OSPEEDR 和 PUPDR)
	232 位数据寄存器(IDR 和 ODR)
	132 位置位/复位寄存器 (BSRR)
	132 位锁定寄存器 (LCKR) 
	232 位复用功能选择寄存器(AFRH 和 AFRL)
	
STM32F4 每组 IO 有 1032 位寄存器控制
	其中常用的有 4 个配置寄存器+2 个数据寄存器+2 个复用功能选择寄存器,共 8
  • 常见配置代码
// stm32f4xx_gpio.h
// stm32f4xx_gpio.c
void LED_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟
  //GPIOF9,F10初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1对应IO口
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  // 配置 MODER、OTYPER、OSPEEDR 和 PUPDR
  GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIO
  // 操作 BSRRL 寄存器
  GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高,灯灭
  // 操作 BSRRH 寄存器
  GPIO_ResetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置低,灯亮
  // GPIO_Write 操作 ODR寄存器
}
// 读输出 GPIO_ODR
// 读输入 GPIO_IDR
// GPIO_PinLockConfig 操作 LCKR
// AFRH 和 AFRL 在 stm32f4xx_gpio.c 中没有 

推挽输出和 开漏输出 有什么区别?为什么一般控制灯的时候用 推挽输出?
stm32F4 的 gpio 为什么需要设置时钟
	一般使用外设都去使能时钟
	在 stm32f4xx_rcc.h 中 RCC_AHB1Periph_GPIOA - RCC_AHB1Periph_GPIOK 都属于 IS_RCC_AHB1_CLOCK_PERIPH
如果使用的不是 引脚的 gpio 功能,需要配置 gpio 吗? 
	需要

这几个参数的确定
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  // 如果你要模拟 100M 速率的 总线,那么 需要设置 为 GPIO_Speed_100MHz;
  // 如果是 复用 uart ,则 需要设置 GPIO_Speed_2MHz 就可以了
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz // 也就是说你可以 10^8hz 操作gpio,一个周期 为 10^(-8)s , 就是 10^(-8) * 10^(9) nm = 10nm;??? 
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 // 一般是让当前的 线 失效, 空闲


推挽输出:可以输出高,低电平,连接数字器件。 
输出 0 时,N-MOS 导通,P-MOS 高阻,输出0。 
输出 1 时,N-MOS 高阻,P-MOS 导通,输出1(不需要外部上拉电路)。

开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内). 
输出 0 时,N-MOS 导通,P-MOS 不被激活,输出0。 
输出 1 时,N-MOS 高阻, P-MOS 不被激活,输出1(需要外部上拉电路);可以读IO输入电平变化,此模式可以把端口作为双向IO使用。 
I2C控制器的两根引脚就应该是开漏输出,上拉电阻2.2K应该可以,如果小于1K的话,控I2C的时候引脚会一直为高或其他情况.

s3c2440 的 gpio

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

12 中 阐述了 管脚 与功能的关系
图3 阐述了 功能与寄存器的关系

所以一般设置寄存器来控制 设置管脚的功能
例如我们可以配置 0x1140 0000开始的四个字节中 的 31-28bit 为 0b0000 ,会直接配置为 0b1111,为EXT_INT1[7](注意,中断不是输入,虽然看起来是输入管脚,但是功能是中断,中断和输入是两个功能)
例如我们可以配置 0x1140 0000开始的四个字节中 的 37-24bit 为 0b0001 ,来配置 XuCTSn[1]引脚的功能为 Output

在这里插入图片描述


gpa0[7] 设置为了 终端 ,gpa0[6] 设置为了 输出
中断时可以 读 GPA0DAT[7] (此时要考虑是哪一方将 GPA0DAT[7] 还原)
那么 就可以 设置 GPA0DAT[6]1,来讲gpa0[6]的引脚拉高且输出. 

在这里插入图片描述

gpa0[7] 设置为中断,此时如果是上升沿触发,电平触发,则需要设置下拉, 15:14 设置为 0b01
gpa0[6] 设置为输出,可以不设置,为 disable.
默认为 下拉

其实只要设置过一次,就不再是

在这里插入图片描述

上面是驱动能力,根据需要设置
  • 三星寄存器概述
一组寄存器如下,控制8个脚,一个寄存器控制8个脚的一个方面.
所以设置一个脚,一般会设置6个寄存器,如果不设置,就使用默认值.
GPD0CON:	(模式寄存器)引脚功能	
GPD0DAT:	(数据寄存器)引脚输入或输出的数据	
GPD0PUD:	(上下拉寄存器)	
GPD0DRV:	(驱动能力寄存器)	
GPD0CONPDN:	(功耗相关寄存器)	
GPD0PUDPDN:	(功耗相关寄存器)
  • 代码

#define GPFCON      (*(volatile unsigned long *)0x56000050)
#define GPFDAT      (*(volatile unsigned long *)0x56000054)

int main()
{
    GPFCON = 0x00000100;    // 设置GPF4为输出口, 位[8:7]=0b01
    GPFDAT = 0x00000000;    // GPF4输出0,LED1点亮

    return 0;
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值