通用型之输入输出---GPIO

GPIO就是我们最常见的一种外设了。它就是STM32上的一个具有输入输出功能的引脚。这部分我们就学习一下GPIO的一些寄存器从而了解GPIO的功能和作用。
--------------------------------------------------------分割线-----------------------------------------------------------
首先介绍的是IO口的输入输出模式!
输入模式
-输入浮空(GPIO_Mode_IN_FLOATING)
-输入上拉(GPIO_Mode_IPU)
-输入下拉(GPIO_Mode_IPD)
-模拟输入(GPIO_Mode_AIN)
输出模式
-开漏输出(GPIO_Mode_Out_OD)
-开漏复用功能(GPIO_Mode_AF_OD)
-推挽式输出(GPIO_Mode_Out_PP)
-推挽式复用功能(GPIO_Mode_AF_PP)
浮空输入:信号进入芯片后,通过一个施密特触发器后来读取的,就是IO口状态是不确定的,可高可低也在可在 此之间。一般外接的是按键,因为按键可以给他一个确定的信号。
模拟输入:就是最普通的输入方式,信号进入芯片后,直接读取。
上拉输入:信号进入芯片,会加一个上拉电阻,然后再经过施密特触发器转换成0/1,读这个引脚的话就是高电平
下拉输入:信号进入芯片,会加一个下拉电阻,然后再经过施密特触发器转换成0/1,读这个引脚的话就是地电平
开漏输出:一般的话这个输出需要外接一个上拉电阻和电源。输出低电平的话可以直接输出0,但是输出不了高 电平,必须要接一个上拉电阻接电源才可以输出高电平。
推挽输出:最普通的输出方式,可直接输出高低电平1/0,3.3V/0V.
复用推挽/开漏输出:就相当于使用了IO口的第二功能。
GPIO的主要寄存器:
1.CRL(32位):配置IO口的模式和速度的。主要是GPIO引脚的低位(0~7),每个IO口占4位,高位CNFx位IO 口具体模式配置,低位MODEx为输入输出及速度配置
2.CRH (32位) :配置IO口的模式和速度的。主要是GPIO引脚的高位(8~15),每个IO口占4位,同理上
3.ODR(32位):读取IO口的状态,高位(1631)保留为0.低位(015)读取IO口状态
4.ODI(32位):即可读也可写IO口的状态,高位(1631)保留为0.低位(015)读或写IO口状态。
5.BSRR(32位):可以用来写的寄存器。高位(1631)写1为低,写0无动作。低位(015)写1为高,写0误 动作。
6.BRR(16位):低16位,写1为低,写0无动作。
7.LCKR(32位):锁存寄存器。没用过,还不了解。
例如:要设置GPIOA的pin5口为上拉输入。
GPIOA->CHL&=0xff0fffff;//把GPIOA5清除,然后其他位不变
GPIOA->CHL|=0X0080000;//GPIOA5这一位为8,即1000,高两位10代表上下拉输入,低两位代表输入
GPIOA->ODR|=1<<5;//上拉输入需要把ODR寄存器对应的引脚位置1
例如:GPIOE的pin14引脚设置推挽输出,速度10Mhz。
GPIOE->CHRH&=0xf0ffffff;
GPIOE->CRH|=0x01000000;
ODR、BSRR、BRR寄存器写数据时候的区别:
1.ODR寄存器只可写1,无法写0操作
2.通常修改IO口引脚状态的时候不用ODR的主要原因是通过ODR寄存器改变引脚状态时会关闭中断。

例子:点亮LED0(PA8)LED1(PD2)GPIO配置代码:

void LED_GPIO_Init(void)
{
    RCC->APB2ENR|=1<<2;//时钟APB2_GPIOA
    RCC->APB2ENR|=1<<5;//时钟APB2_GPIOD
    
    GPIOA->CRH&=0xFFFFFFF0;//复位除了PA8端口,其他位保持不变
    GPIOA->CRH|=0x00000003;//设置输出模式为推挽输出,速率为50Mhz
    
    GPIOD->CRL&=0xFFFFF0FF;//复位除了PD2端口,其他位保持不变
    GPIOD->CRL|=0x00000300;//设置输出模式为推挽输出,速率为50Mhz
    
    GPIOA->ODR|=1<<8;//PA8初始化状态为高电平
    GPIOD->ODR|=1<<2;//PD2初始化状态为高电平
}
    while(1)
    {
        GPIOA->BSRR|=1<<8;
        GPIOD->BSRR|=1<<2;
        delay_ms(300);
        GPIOA->BRR|=1<<8;
        GPIOD->BRR|=1<<2;
        delay_ms(300);
    }

如果对您的问题有帮助的话可以帮忙点个赞,谢谢~QQ群:540093471 有问题大家可以一起交流沟通!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_LiuChunJiang刘春江

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值