在学习正点原子的stm32时,会看到这样一段设置io口的代码,当时初学的时候百思不得其解,因为我没有学51,直接上来就学了32,看他那个视频的时候,几乎是睡着的状态去看的,直到后来啃了cc2530,才逐渐对寄存器,io口的配置有那么点了解,今天来解读一下当初的疑惑。
//IO方向设置
#define DHT11_IO_IN() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=8<<12;}//PA11
#define DHT11_IO_OUT() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=3<<12;}
我们可以看到上图有关于CRH这个寄存器的介绍,其实CRH是用来配置第8到15个引脚的,每4位控制一个引脚,所以上面的GPIOA->CRH&=0XFFFF0FFF实际上是将第11个引脚的4个位置全置0;比如我们要设置PA12为输入模式则GPIOA->CRH&=0XFFF0FFFF;,那么应该而GPIOA->CRH|=8<<12是将1000左移12位,也就是将4位中的高两位设置成10,即上下拉输入模式,低两位设置成00,也就是输入模式。正好对应了DHT11_IO_IN。DHT11_IO_OUT同理。