1、GPIO_PIN的宏定义
以STM32G431 HAL库为例,
在GPIO.h中,我们可以知道PIN_0~PIN_15对应着0x0001~0x8000
由GPIO_PIN_ALL对应0xFFFF可知,0xFFFF每一位对应四个数,每个数对应一个PIN引脚。
因为十六进制中的F实际上可以写成四位二进制1111,所以F和PIN引脚其实是一一对应的。
PIN0~PIN15可以被分为四组四位二进制来表示。
即0~3对应0xFFFF的最后一个F,4~7对应0xFFFF的倒数第二个F,8~11对应0xFFFF的第二个F,12~15对应0xFFFF的第一个F。
举个例子,我们点亮PC8-PC15中的后三位,那么对应的数字用二进制表示为:
0000 0111 0000 0000
四组四位二进制
再将其转换成十六进制:
0x0700
可见后三位被点亮了
用这种方法在点多个灯的时候更加灵活方便,可以直接把要点的灯先用二进制0,1表示,再计算出十六进制数表示即可。
总结:前三位:E,后三位:7;前两位:C,中间两位:6,后两位:3.
以四位为一组,按组计算十六进制数即可。
2、移位操作点灯
用移位操作来点灯,其原理和上面是一样的,本质都是0和1的表达。
在STM32G431RBT中,只有PC8~PC15的LED灯,所以只需要看四组四位二进制的前两组。
那么我们可以以0x80这个数字为基准,即 0000 0000 1000 0000,刚好在第三组的第一位。
于是我们想点第几个灯,就左移几位即可。(左移一位相当于乘以2)
点亮第七个灯(从右往左数,由低位到高位)。