STM32 16位IO口操作的一些教訓(xùn)
最近在用TFT屏的時(shí)候走啦不少彎路,因?yàn)門FT屏都是16位的,所以大部分的都是采用一組IO口對(duì)應(yīng)16個(gè)數(shù)據(jù)位剛好并口傳輸數(shù)據(jù),最近因?yàn)镮O口緊缺,所以想要改成串口,但是發(fā)現(xiàn)串口刷新屏幕太慢所以最后改成8位的并口,但是STM32操作IO口的寄存器是16位的。也就是說用并口的話一起傳輸數(shù)據(jù)進(jìn)去雖然只用8位但是操作還是16位一起操作,雖然有8位沒用到但是還是在傳輸數(shù)據(jù)進(jìn)去的時(shí)候被一起操作,會(huì)把不用的8位的值一起覆蓋。
#define DATAOUT(x) GPIOB->ODR=x; //數(shù)據(jù)輸出
如上當(dāng)調(diào)用宏的時(shí)候整個(gè)B端口一起被操作。
方法1:ODR配置法,可以直接使用GPIO->ODR=value< 方法2可以用位操作的方式單獨(dú)對(duì)IO口進(jìn)行操作,但是這樣操作數(shù)據(jù)刷新速度很慢。voidWriteData(u8data){//分別操作與液晶連接的IO口,順序是由高位到低位GPIO_WriteBit(GPIO號(hào),Pin號(hào),(data&0x80)>>7);GPIO_WriteBit(GPIO號(hào),Pin號(hào),(data&0x40)>>6);GPIO_WriteBit(GPIO號(hào),Pin號(hào),(data&0x20)>>5);GPIO_WriteBit(GPIO號(hào),Pin號(hào),(data&0x10)>>4);GPIO_WriteBit(GPIO號(hào),Pin號(hào),(data&0x08)>>3);GPIO_WriteBit(GPIO號(hào),Pin號(hào),(data&0x04)>>2);GPIO_WriteBit(GPIO號(hào),Pin號(hào),(data&0x02)>>1);GPIO_WriteBit(GPIO號(hào),Pin號(hào),data&0x01);}使用這種方式就不會(huì)影響到底8位,但是這樣刷新速度很慢。