1. 程式人生 > >STM3216位IO口操作的一些教訓

STM3216位IO口操作的一些教訓

 最近在用TFT屏的時候走啦不少彎路,因為TFT屏都是16位的,所以大部分的都是採用一組IO口對應16個數據位剛好並口傳輸資料,最近因為IO口緊缺,所以想要改成串列埠,但是發現串列埠重新整理螢幕太慢所以最後改成8位的並口,但是STM32操作IO口的暫存器是16位的。也就是說用並口的話一起傳輸資料進去雖然只用8位但是操作還是16位一起操作,雖然有8位沒用到但是還是在傳輸資料進去的時候被一起操作,會把不用的8位的值一起覆蓋。

 #define DATAOUT(x) GPIOB->ODR=x; //資料輸出

如上當呼叫巨集的時候整個B埠一起被操作。

方法1: ODR配置法,可以直接使用 GPIO->ODR = value << N;給對應的IO口進行輸出操作。
但是此時在硬體上要保證:
1. 該功能口(如GPIOA)上的其餘的IO口不作為普通的IO輸出口使用
2. 行列之外的GPIO口,要麼是普通的IO輸入口,要麼是功能口。功能口就是UART、USB、PWM、ADC等,對GPIO的ODR進行操作時,不會對功能口產生影響。
也就是說比如現在選擇B埠的高8位,那麼8--15IO口被選擇用來驅動TFT,但是0-7IO口不能在用著普通輸出IO口,但是可以設定為輸入,或者UART,usb,PWM,ADC等功能。
方法2 
可以用位操作的方式單獨對IO口進行操作,但是這樣操作資料重新整理速度很慢。
void WriteData(u8 data)

   //分別操作與液晶連線的IO口,順序是由高位到低位
    GPIO_WriteBit(GPIO號, Pin號,(data & 0x80) >> 7 ); 
    GPIO_WriteBit(GPIO號, Pin號,(data & 0x40) >> 6 ); 
    GPIO_WriteBit(GPIO號, Pin號,(data & 0x20) >> 5 ); 

    GPIO_WriteBit(GPIO號, Pin號,(data & 0x10) >> 4 ); 
    GPIO_WriteBit(GPIO號, Pin號,(data & 0x08) >> 3 ) ; 
    GPIO_WriteBit(GPIO號, Pin號,(data & 0x04) >> 2 ); 
    GPIO_WriteBit(GPIO號, Pin號,(data & 0x02) >> 1 ); 

    GPIO_WriteBit(GPIO號, Pin號,data & 0x01);
 }
使用這種方式就不會影響到底8位,但是這樣重新整理速度很慢。