经过一段时间的学习,今天发现STM32的单个端口都有一个32位的地址,这样就可以把这个地址给找出来,进行单个位的操作了,这也没有什么好说的,直接复制粘贴就好了,用到的时候过来复制直接使用就行了。虽然看着挺多的起始最后就是得到一个地址而已:
#define GPIOA_ODR_Addr (GPIOA_BASE + 0x0C) //想用哪个GPIO就改成ABCDEF,可以是ODR也可以是IDR
#define PAout(n) *(unsigned int*)((GPIOA_ODR_Addr & 0xf0000000) + 0x02000000 + ((GPIOA_ODR_Addr & 0x00ffffff) << 5) + (n << 2))
// PAout(n) 这个n就代表这个位
上面这个代码是写到头文件里面的,使用的时候就是直接使用PAout(n)就好了,n写几就是第几个端口这个单独的位,0x0c是ODR寄存器的偏移地址。我还总结了一个图:
为此我特意封装了一个函数:
这上面是输出寄存器的写法,输入寄存器也是一样的写法:
#ifndef __KEY_H
#define __KEY_H
#define GPIOA_IDR_Addr (GPIOA_BASE + 0x08) //想用哪个GPIO就改成ABCDEF,可以是ODR也可以是IDR
#define PAin(n) *(unsigned int*)((GPIOA_IDR_Addr & 0xf0000000) + 0x02000000 + ((GPIOA_IDR_Addr & 0x00ffffff) << 5) + (n << 2))
// PAout(n) 这个n就代表这个位
void Key_Init(void);
uint8_t Key(void);
#endif
直接判断这个PAin(n)的值就好了,1就证明这个端口是高电平,0这个端口就是低电平。
最后完成了一个按键控制一个LED灯的亮灭的工程:
我今天主要是为了记录这种方法,指不定以后什么时候就用到这种方法呢?暂时我是用不到这个方法的,也不是什么特别重要的方法,用别的方法也能达到同样的效果,不过感觉没有这样直接啊!所以还是记录下吧!