GPIO口的灵活操作

使用单片机,不得不和GPIO打交道。可以说是GPIO是操作单片机的重点之一。常用单片机机型都提供类似于STM32的固件库函数包括对GPIO的操作。但这并不意味着对GPIO的控制寄存器的底层操作不用了解,下面我说明两款常用的芯片nrf52832和STM32的GPIO引脚的操作。

这里首先要明白GPIO和其他片内外(例如定时器,片内FLASH等)是一样的,同样是通过总线与内核连接,并不属于内核.

首先是nrf52832:

NRF52832是我最近才接触的,不过它的GPIO控制配置寄存器比STM32更加简单,直接,明了。所以此处先介绍,

NRF52832总共一个端口也就是port,可通过32个外部引脚访问。其配置寄存器包括:

1.输出配置寄存器OUT

      此寄存器共32位用来为32个引脚配置输出状态(高低),写1高,写0低。

2.输出置位寄存器outset

      此寄存器用来对32引脚进行置位,也就是输出1进行设置,对应为写1,则该引脚输出高电平,写0无效

3.输出清除寄存器outclr

      此寄存器用来对32个引脚进行清除,也就是输出0进行设置,对应为写1,则该引脚输出低电平,写0无效

      123寄存器都是对输出电平的控制,23只是对1的详细控制。

4.输入寄存器

      输入寄存器存储32个引脚的输入状态(配置为输入的引脚),只读。

5. 方向寄存器

      该寄存器控制32个引脚输入还是输出,对应位为1是,引脚配置为输出。为0时引脚配置成输入。

6.方向置位寄存器

      向该寄存器引脚对应位写1,则该引脚被配置为输出,写0无效

7.方向清除寄存器

      向该寄存器引脚对应位写1,则该引脚被配置为输入,写0无效

      67寄存器同5寄存器的作用相同,只是更加详细的控制。

8.引脚配置寄存器(共32个,各引脚对应一个本身的配置寄存器)

      该寄存器对对应引脚的配置,做出初始化。包括方向(输入还是输出,该位同方向寄存器是相同的物理寄存器)

是否打开输入缓冲区。上拉下拉配置,输出标准配置,感应配置。

stm32的GPIO:

STM32的GPIO同样和上面的NRF52830拥有同样功能的寄存器,只不过其名称可能不同。(为了节省空间,是STM32的一些寄存器可能位置方面比较混乱,必将32是一款IO口众多的芯片)

STM32的GPIO口比较多,但每16个引脚被组织为一个端口。这里拿一个端口进行说明:

1.端口配置低位寄存器

   寄存器共32位,每两位控制一个引脚的输入输出模式配置,所以分高位低位寄存器

2.端口配置高位寄存器

    同上

3.端口输入数据寄存器

    寄存器(低16位)存储对应引脚的输入状态

4.端口输出数据寄存器

    寄存器(低16位)位置1对应引脚输出高电平。写0输出低电平

5.端口设置/清除寄存器

    高16位用来清除引脚输出值,写1对应引脚输出低电平,写0无效

    低16位用来置位引脚输出值,写1对应引脚输出高电平,写0无效

    注意:同时使用高16位与低16时,高16无效

6.端口清除寄存器

    寄存器低16位用来清除引脚输出值,写1对应引脚输出低电平,写0无效

    此寄存器是为解决5寄存器不能同时使用32位设计

使用上述寄存器可对GPIO进行简单的高低电平控制

单个引脚输出高电平:可用端口置位寄存器

单个引脚输出低电平:用端口清除寄存器

多个引脚输出:用输出数据寄存器

若想翻转输出,最好使用异或操作控制输出数据寄存器。例如

NRF_GPIO->OUT ^=  leds_mask

led_mask为对应引脚置位后的二进制码

使用^的好处是,只用一条语句便可保证在其他引脚状态不改变的前提下,改变特定引脚输出状态。

猜你喜欢

转载自blog.csdn.net/qq_41281601/article/details/81838135