【兆易创新GD32H759I-EVAL开发板】5、学习GPIO通用输出接口
在上一篇中,我学习了GPIO的配置方法。接下来,我们学习如何翻转电平。
在数字电路中,摸拟时序都是按照一定的协议来翻转电平来表示数据的,即高电平代表1,低电平来代表0,从而组成的数字的世界,不管是spi、i2c、uart等等都是离不开电平的翻转来实现的。当然象硬件的i2c、spi、uart他由专门的发生电路来产生而已,在模拟的时序中就需要使用到IO的电平翻功能。下面就讨论GD32H7xx的几种电平翻的实现方式。
1、使用端口输出控制寄存器(GPIOx_OCTL,x=A...H,J,K)来实现电平的高低输出,即向指定位写入0即输出低电平,写入1输出高电平。这是整个GPIO的核心寄存器。
2、为了方便用户使用,GD32H7xx扩展了两个用于辅助GPIOx_OCTL的寄存器端口位操作寄存器(GPIOx_BOP)、端口位翻转寄存器(GPIOx_TG)下面介绍如何使用这两个寄存来操作电平。
3、GPIOx_BOP寄存器是一个32位寄存器,它分区上下两个区CR区(31:16)与BOP区(15:0)。在《开发指南中》有写明向CR写入1,则清除OCTL相应位,为0,即输出低电平,向其写入0,则保存原来的不变。向BOP写指定位写1则设置OCTL为1,即输出高电平。如果写入0则保持原来的不变。
4、端口位翻转寄存器(GPIOx_TG)这也是32位寄存器,但是只用了第【15:0】位,向其指定位写入1,则翻转IO,如果写入0则保持不变。
综上所述,设定我们需要把PA0的电平拉高,则可以通过以下方式来实现
1)GPIOA_OCTL |= 0x01;
2) GPIOA_BOP |= 0x01;
3) if(1 !=(GPIOA_OCTL & 0x01))
GPIOA_TG |= 0x01;
把PA0的电平拉低,则可以通过以下方式来实现
1)GPIOA_OCTL &= 0xFE;
2) GPIOA_BOP|= (0x01<<16);
3) if(0 !=(GPIOA_OCTL & 0x01))
GPIOA_TG |= 0x01;
在写出指定电平时,GPIOA_TG效率是最低的
如果我们需要翻电平使用GPIOA_OCTL,与GPIOA_BOP时,就需要先获取电平,再写入,这时GPIO_TG就是效率最高的。
【总结】
在通用GPIO输出的配置与便用大概就是这么多的知识,如果我们在以后的工程中需要高效的来使用GPIO实现指定的功能,那么直接使用这些寄存器进行操作,将大大的提搞效率,当然如果使用库来操作,也是必须明白这些基础知识,才能正确的来使用他们。