打印
[STM32]

立创商城STM32F系列MDK下C语言基础复习——位操作

[复制链接]
779|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小乐Tzz|  楼主 | 2018-8-20 10:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MDK下 C语言基础复习————位操作
/*********************************************************/
C 语言位操作相信学过 C语言的人都不陌生了,简而言之,就是对基本类型变量可以在位级别进行操作。这节的内容很多朋友都应该很熟练了,我这里也就点到为止,不深入探讨。下面我们先讲解几种位操作符,然后讲解位操作使用技巧。
C 语言支持如下6 种位操作
运算符                  含义                  运算符                  含义
&                                  按位与            ~                          取反
|                                  按位或                   <<                           左移
^                                  按位异或            >>                           右移

这些与或非,取反,异或,右移,左移这些到底怎么回事,这里我们就不多做详细,相信大家学C 语言的时候都学习过了。如果不懂的话,可以百度一下,非常多的知识讲解这些操作符。下面我们想着重讲解位操作在单片机开发中的一些实用技巧。
1)  不改变其他位的值的状况下,对某几个位进行设值。
这个场景单片机开发中经常使用,方法就是先对需要设置的位用&操作符进行清零操作,然后用|操作符设值。比如我要改变GPIOA-> BSRRL的状态,可以先对寄存器的值进行&清零操作
GPIOA-> BSRRL &=0XFF0F;  //将第 4-7 位清 0
然后再与需要设置的值进行|或运算
GPIOA-> BSRRL |=0X0040;  //设置相应位的值,不改变其他位的值
2)  移位操作提高代码的可读性。
移位操作在单片机开发中也非常重要,我们来看看下面一行代码
GPIOx->ODR = (((uint32_t)0x01) << pinpos);
这个操作就是将ODR寄存器的第pinpos位设置为1,为什么要通过左移而不是直接设置一个固定的值呢?其实,这是为了提高代码的可读性以及可重用性。这行代码可以很直观明了的知道,是将第pinpos位设置为1。如果你写成
GPIOx->ODR =0x0030;
这样的代码就不好看也不好重用了。
3)  ~取反操作使用技巧
SR 寄存器的每一位都代表一个状态,某个时刻我们希望去设置某一位的值为0,同时其他位都保留为1,简单的作法是直接给寄存器设置一个值:
TIMx->SR=0xFFF7;
这样的作法设置第 3位为0,但是这样的作法同样不好看,并且可读性很差。看看库函数代码中怎样使用的:
TIMx->SR = (uint16_t)~TIM_FLAG;
而 TIM_FLAG是通过宏定义定义的值:
#define TIM_FLAG_Update                    ((uint16_t)0x0001)
#define TIM_FLAG_CC1                       ((uint16_t)0x0002)
看这个应该很容易明白,可以直接从宏定义中看出TIM_FLAG_Update就是设置的第0位了,可读性非常强。
/*********************************************************/


【立创商城】STM32F103CBT6 托盘  https://item.szlcsc.com/8796.html

相关帖子

沙发
ayb_ice| | 2018-8-21 13:08 | 只看该作者
本帖最后由 ayb_ice 于 2018-8-21 13:34 编辑

BSRRL寄存器根本不需要与或操作,直接赋值就可以,为零的位根本不起作用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

70

帖子

0

粉丝