使用单片机,不得不和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为对应引脚置位后的二进制码
使用^的好处是,只用一条语句便可保证在其他引脚状态不改变的前提下,改变特定引脚输出状态。