【STM32】GPIO的相关配置寄存器、库函数、位操作(实例:STM32控制跑马灯)

您所在的位置:网站首页 如何转换gpio电平 【STM32】GPIO的相关配置寄存器、库函数、位操作(实例:STM32控制跑马灯)

【STM32】GPIO的相关配置寄存器、库函数、位操作(实例:STM32控制跑马灯)

2023-12-15 06:13| 来源: 网络整理| 查看: 265

STM32F1xx官方资料:

《STM32中文参考手册V10》-第8章通用和复用功能IO(GPIO和AFIO) 《Cortex-M3权威指南(中文)》第5章 位带操作

 

硬件连接

假设跑马灯实验的硬件连接如上图所示,LED0连接PB5,LED1连接PE5。由于在LED的另一端是VCC3.3,所以当PB5或PE5为低电平的时候,LED灯会亮。此时GPIO应采取推挽输出的模式。

 

GPIO的相关配置寄存器

STM32的每组GPIO口包括7个寄存器。也就是说,每个寄存器可以控制一组GPIO的16个GPIO口。这7个寄存器分别为:

GPIOx_CRL:端口配置低寄存器(32位)GPIOx_CRH:端口配置高寄存器(32位)GPIOx_IDR:端口输入寄存器(32位)GPIOx_ODR:端口输出寄存器(32位)GPIOx_BSRR:端口位设置/清除寄存器(32位)GPIOx_BRR:端口位清除寄存器(16位)GPIOx_LCKR:端口配置锁存寄存器(32位) 端口配置低寄存器(GPIOx_CRL)

由于每个GPIO口需要4位来进行配置输入输出模式(2位配置MODE,2位配置CNF),这样的话每组16个GPIO口则需要64位,这也就表明需要两个32位寄存器。于是GPIOx_CRL用于配置GPIO0-GPIO7的输入输出模式。同理GPIOx_CRH则用于配置GPIO8-GPIO15的输入输出模式。

同时对于上面的这个表可以总结出端口位配置的信息:

需要注意的是,当MODE选择00,CNF为选择10时,代表着上拉/下拉输入模式。到底是上拉还是下拉呢?此时需要PxODR(端口输出寄存器)来确定,0为下拉输入,1为上拉输入。

端口输入寄存器(GPIOx_IDR)

IDR寄存器低16位,每个位控制该组GPIO口的一个IO口,对应的是该IO口的输入电平。在输入模式下,可以读取I/O端口的电平值;在输出模式下,也可以读取I/O端口的电平值(在开漏输出时,读取到的I/O端口的电平值,不一定就是输出的电平值)。

端口输出寄存器(GPIOx_ODR)

ODR寄存器的低16位,每个位控制该组GPIO口的一个IO口,对应的是该IO口的输出电平。在输出模式下,可以通过写寄存器的值,来达到某个IO口的电平输出;在输入模式下,还可以通过写值,来确定是上拉还是下拉输入模式。

端口位设置/清除寄存器(GPIOx_BSRR)

在GPIO的开漏输出模式或者推挽输出模式下,都可以直接给ODR寄存器赋值来进行某个IO口的电平输出;同时,也可以通过对BSRR进行赋值来达到对ODR寄存器的控制来进行对IO口的电平输出。其实,BSRR寄存器的底层也是对ODR寄存器的控制。

BSRR寄存器的低16位可以只对ODR赋1,高16位可以只对ODR赋0。这样的好处是,只可以对ODR的某些特定位产生影响,而不对其他的位产生影响。而且可以一次性对ODR的许多位同时进行控制。

端口位清除寄存器(GPIOx_BRR)

BRR寄存器的功能其实和BSRR寄存器的高16位的功能是一样的,通常情况下,使用BSRR寄存器的低16位来赋1,使用BRR寄存器来赋0。

 

GPIO的寄存器版本

 

使能IO口时钟。配置寄存器RCC_APB2ENR;初始化IO口模式。配置寄存器GPIOx_CRH/CRL;操作IO口,输出高低电平。配置寄存器GPIOX_ODR或者BSRR/BRR。

具体的程序内容:

void LED_Init(void){ RCC->APB2ENR|=1ODR|=1CRL|=0x00300000; GPIOE->ODR|=1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3