原创 STM32系列之四旋翼(二)位运算

2017-8-9 14:32 1217 18 18 分类: MCU/ 嵌入式

今天跟着视频学习了位运算,感觉很有用,这里分享给大家。

位运算

位运算主要有:位与运算符(&)、按位或运算符(|)、异或运算符(^)、取反运算符(~)、左移运算符(<<)、右移运算符(>>)等,下面我们分别介绍这几个位运算的用法及其在程序中的运用。

(1)位与(&)

按位与运算符“&”是双目运算符。其功能是参与运算的两数各对应的二进位相与。两个数相“与”时,如果两个位同时为1,则结果为1,否则为0,即:1&1=1,1&0=0,0&1=0,0&0=0。

比如:0xc3&0x11计算如下

在STM32编程中位与(&)运算可以作为条件判断之用,请看下面的程序:

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin),这是STM32库中的函数,用来读取输出的某个引脚的电平,运行一下”Go To Definition”,你会发现下面的语句:

if ((GPIOx->ODR & GPIO_Pin) != (uint32_t)Bit_RESET),当然对应的GPIOx->ODR是输出数据寄存器的值,是16位的数值;GPIO_Pin也是STM32库定义的16位类型的数据。

(2)位或(|)

按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的两个二进位有一个为1时,结果位就为1,即:1|1=1,1|0=1,0|1=1,0|0=0。

比如:0xc3|0x10

在STM32编程中位或运算(|),可以作为置位之用,因为位或运算不会改变影响原来数值的其它位,上面的0xc3|0x10,原来的0xc3(b11000011),只有一个位发生了改变。请看下面的程序:

GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1;这是常见的对两个引脚按位或,在STM32库中,GPIO_Pin_0和GPIO_Pin_1其实也是两个整数,请看它们的宏定义:

#define GPIO_Pin_0               ((uint16_t)0x0001)  

#define GPIO_Pin_1               ((uint16_t)0x0002)  

(3)异或(^)

两个二进制数进行异或,若对应的位不相同,则结果为1,否则为0,即:0^0=0,0^1=1,1^0=1,1^1=0;

比如(0xc3 ^ 0x10) ^ 0x10

从上面的式子中大家发现了什么,对,0xc3与0x10第一次异或,发生一次改变,且只改变了与0x10相关的位,并且如果与同一个数两次异或,它就恢复到初始值,所以异或(^)具有翻转的功能,在程序中可以当做开关使用,比如,让一个LED灯点亮和熄灭就可以用这种方法:

GPIOA->ORD ^= GPIO_Pin_1;     //LED1灯熄灭

Delay_ms(100);

GPIOA->ORD ^= GPIO_Pin_1;     //LED1点亮  

(4)取反(~)

这是个单目运算符,二进制位取反,如果1取反,结果为0,0取反,结果为1,即:~0=1,~1=0。

程序中取反(~)和按位与(&)相结合,会有复位的效果。

比如0xd3&(~0x10)

(~0x10)结果为b11101111,再和0xc3按位与: 

是不是达到了复位的效果呢?

(5)左移运算符(<<)

左移运算符用来将一个数的各二进制位全部左移若干位,后面补0,移出的位被丢弃,相当于乘2运算,因为位运算比乘法用算快,所以可对一个代码进行优化。

比如0x01<<8,结果为b100000000,就是1后面补8个0,移位运算符在通信时,接收数据时很有用。

(6)右移运算符(>>)

右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,对于左边移出的空位,如果是正数,则一律补0,如果是负数,则可能补0,也可能补0,这由不同的机器决定。

这个运算符可以用来获取一个16位数据的高8位,比如:要获取0x1111的高8位,0xcc11>>8,便可得到高8位0xcc。

到这里,今天的内容就结束了。

如果有写的不合适的地方,还请大家多多指教。如果你有兴趣,也可以一起互相学习,共同进步。 (微信号 :c18093458455)

文章评论0条评论)

登录后参与讨论
相关推荐阅读
《源》 2017-08-29 15:09
STM32系列之四旋翼(五) 官方DMP库的移植
MPU6050的陀螺仪和加速度计的寄存器数据可以传输到MPU6050的数字运动处理器(DMP),经过DMP的融合处理就可以得到四元数,再用几个公式把四元数转换一下,就可以得到四旋翼的姿态角了。应美盛官...
《源》 2017-08-24 23:52
STM32系列之四旋翼(四) MPU6050知识点梳理
相关内容:1)MPU6050的简介2)MPU6050的封装3)MPU6050的陀螺仪、加速度计、磁力计介绍4)自检(Self Test)5)系统结构图6)姿态角7)如何得到姿态角8)MPU6050与单...
《源》 2017-08-23 23:25
STM32学习之路(四十二)怎样把PCB文件下单给工厂
我们可以选择任意的工厂来给我们加工电路板,今天以立创商城为例,介绍把PCB文件下单给工厂的整个过程。步骤如下:第一步:在浏览器的地址栏输入嘉立创的网址:http://www.sz-jlc.com ;第...
《源》 2017-08-23 23:21
STM32学习之路(四十一)Gerber文件的生成与查看
当我们要加工我们设计好的PCB时 ,需要将PCB文件转换为Gerber文件,然后将Gerber文件交付给工厂,导入CAM软件,来为每一道PCB工艺流程提供数据,进行加工。Gerber文件是线路板行业软...
《源》 2017-08-22 23:27
STM32学习之路(四十)给PCB添加Logo和注释
今天我们学习如何给PCB板添加开窗效果的Logo,以及给PCB添加注释。1、给PCB添加Logo由于KiCad还不支持添加中文文字,所以需要借助其它的工具来进行设计。下面我们开始设计:第一步:打开电脑...
《源》 2017-08-22 23:24
STM32学习之路(三十九) PCB覆铜
现在我们开始给电路板覆铜,所谓覆铜,就是将PCB上闲置的空间作为基准面,然后用固体铜填充,这些铜区又称为灌铜。覆铜的意义在于,减小地线阻抗,提高抗干扰能力;降低压降,提高电源效率;还有,与地线相连,减...
我要评论
0
18
1
2
3
4
5
6
7
8
9
0
关闭 站长推荐上一条 /3 下一条