寒假做东西时,发现了这个骚操作,现在整理的时候发现有点忘了,故写下此总结备着。
主要讲两个问题:
1.什么是位带操作
2.怎么操作
1.1 在51单片机中,假如P1.1口有一个LED灯,那么对led的操作就是P1.1=0或P1.1=1。而stm32是做不到这样的,它是用两个函数来置位的:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
那么为了像51单片机一样能够单独的对某个端的某一个IO单独操作,就引入了位带操作这样的概念,简而言之,言而总之,就是为了去单独操作32里面PA端的第1个IO口,所以才有了位带这样的操作机制。
1.2 在我浅显的理解中,控制GPIO的寄存器有32位,可以映射到32个地址上去,改变对应地址的值就可以了改变寄存器对应位。那么只要改变控制置0置1的那一位控制字就可以让单片机置0置1了。
1.3 STM32不允许对某个端的某一个IO口进行操作,PA.1 = 0或者PA.1 = 1这样的操作是非法的。那就给PA.1起个小号,将原来PA.1的地址扩展成一个32位的字地址,一个小号对应相应控制字。其实STM32对所有的寄存器配置,都是对某个32位地址的操作,因此说白了,就是某个IO端口进行操作,这就是位带操作。
2.1 使用位带操作需要加入sys.h头文件
2.2 来些代码
#define LED0 PBout(5)// 配置PB.5可以输出高低电平,我试了一下也可以读取电平状态(if(LED0==1))
#define LED1 PEout(5)// PE.5输出
#define LED0 PBin(5)// 配置PB.5可以读取高低电平,设置之后就不能给它置位了
#define LED1 PEin(5)//
参考文章:https://www.cnblogs.com/szhb-5251/p/6662417.html