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位,但是这样刷新速度很慢。

  

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值