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 有问题大家可以一起交流沟通!