STM32C语言位操作符的知识

这些与或非,取反,异或,右移,左移这些到底怎么回事,这里我们就不多做详细,相信
大家学 C 语言的时候都学习过了。如果不懂的话,可以百度一下,非常多的知识讲解这些操作
符。下面我们想着重讲解位操作在单片机开发中的一些实用技巧。
1) 不改变其他位的值的状况下,对某几个位进行设值。
这个场景单片机开发中经常使用,方法就是先对需要设置的位用&操作符进行清零操作,
然后用|操作符设值。比如我要改变 GPIOA 的状态,可以先对寄存器的值进行&清零操作
GPIOA->CRL&=0XFFFFFF0F; //将第 4-7 位清 0
然后再与需要设置的值进行|或运算
GPIOA->CRL|=0X00000040; //设置相应位的值,不改变其他位的值
2) 移位操作提高代码的可读性。
移位操作在单片机开发中也非常重要,下面让我们看看固件库的 GPIO 初始化的函数里
面的一行代码
GPIOx->BSRR = (((uint32_t)0x01) << pinpos);
这个操作就是将 BSRR 寄存器的第 pinpos 位设置为 1,为什么要通过左移而不是直接设
置一个固定的值呢?其实,这是为了提高代码的可读性以及可重用性。这行代码可以
很直观明了的知道,是将第 pinpos 位设置为 1。如果你写成
GPIOx->BSRR =0x0030;
这样的代码就不好看也不好重用了。
类似这样的代码很多:
GPIOA->ODR|=1<<5; //PA.5 输出高,不改变其他位
这样我们一目了然,5 告诉我们是第 5 位也就是第 6 个端口,1 告诉我们是设置为 1 了。

求教,此处对于十六进制的位操作运算是如何清零置数过程的,STM32小白求助

你将16进制数转换为2进制数写到纸上一看就清楚明白了。
例如将一个8位的寄存器的高4位置 1,那么一般写法是REG |= 0xF0;
或是 REG |= ((1<<7)|(1<<6)|(1<<5)|(1<<4));
写为2进制,设REG初始状态为0x55;
REG: 0101 0101
与 : 1111 1111
= : 1111 0101

清零操作一般这样写:REG &= ~(1<<5); //将第五位置0
写为2进制,设REG初始状态为0xAA;
1<<5 : 0010 0000
~(1<<5) : 1101 1111

REG : 1010 1010
= : 1000 1010

1<<5得到100000再和原来数字or,原来数字中除了第5位,别的位保留。第5位无论是什么,都变成1了。

C中很多逻辑操作和位操作都是这样的,用问题的反面取得正面的结果,这样让人知道为什么有正面的结果

GPIOA->ODR|=1< GPIOA->ODR&=0<<5; //PA.5 输出低,不改变其他位 这“&”符号相当于*,意思就是不管bit5原来是0还是1,*0那就把bit5变为0 了。这样比较容易理解。