STM32学习笔记(一)----基本位操作

1)不改变其他位的值的状态下,对某几位进行设置初始值

这个场景,单片机开发中经常使用,方法就是先对需要设置的位用&符号进行清零操作,然后用|操作符设定数值,比如我们经常改变GPIO的状态,可以先对寄存器的值进行清零操作 

GPIOA ->CRL &= 0xFFFF FF0F;  //将第4-7位清零

GPIOA ->CRL &= 0x0000 0040; //设置相应位的值,不改变其他位置的数值


2)移位操作提高代码的可读性

移位操作在单片机开发中非常重要,固件库中GPIO初始化的函数里面有一行代码

GPIOx -> BSRR = (((uint 32_t)0x01)<

这个操作就是将BSRR寄存器的第pinpos位置设为1,为什么要通过左移而不是直接设定一个固定的值呢?其实这是为了提高代码的可读性以及可重用性。这行代码可以很直观明了的知道,是将第pinpos位设置为1,如果写成  BPIOx -> BSRR = 0x0030;需要你转换为二进制才能来清楚是哪位进行了置1,这样的代码就不好看也不好重用了,类似的代码可以写为  GPIOA -> ODR |= 1<<5;  //PA.5输出高,不改变其他位


3)~取反操作使用技巧

SR寄存器的每一位都代表一个状态,某个时刻我们希望去设置某一位的值为0,同时保留其他位都为1,简单的做法是直接给寄存器设置一个值: TIMx ->SR = 0xFFF7;

这样的做法设计第3位为0,但是这样的做法同样不好看,并且可读性很差。

库函数给出一种很好的写作方法, TIMx -> SR = (uint16_t)~TIM_FLAG;

而TIM_FLAG是通过宏定义定义的值:#define TIM_FLAG  ((uint16_t)0x0001)  这样的方法就可以看出来设置的第0位了。可读性非常强

你可能感兴趣的:(STM32学习笔记(一)----基本位操作)