回复 楼主 Study_Stellaris 的帖子
掩码的方式,可以实现只修改指定的IO口的管脚,而不影响其他位,比位操作还灵活;比如楼主举得例子,掩码是1、2、5位,不管向IO口写什么数据,只能改变这3位;这在很多时候避免了读-修改-写的问题。
GPIODATA寄存器包含了存储器的256个单元。在写操作过程中,如果与数据位相关联的地址位被设为1,那么GPIODATA寄存器的值将发生变化。如果被清零,那么该寄存器的值将保持不变。另外的就是不知说的了。。。
以我的理解,这里其实是函数
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_5 | GPIO_PIN_2 | GPIO_PIN_1,0xEB);
的实现。图中的地址掩码其实就是由引脚值左移2位得到的,掩码中的0用来屏蔽端口中不关注的位,1用来修改或者获取端口中关注的位。
由图,地址掩码中第1、2、5位为1,则只将值0xEB中的第1、2、5位的值去修改端口D中的第1、2、5位,而端口D中的其它位保持原来的值。
PD = (Val & mask)| (PD & (~mask)),其中PD原值为00011101,mask为00100110,要写的值Val为0xEB,可求得修改第1、2、5脚后的PD口的值为00111011
可以去看看函数GPIOPinWrite的原型,当然,代码不完全能解释,我觉得应该是跟硬件工艺有关。