coocox吧 关注:14贴子:22
  • 1回复贴,共1

找到一种简便高效的GPIO并行写的方法

取消只看楼主收藏回复

估计有很多人会抱怨CoX提供的库函数里没有提供直接并行接口读写函数,这样给需要并行读写的场合带来了很大麻烦,特别是在写比如LCD驱动的时候,一般要同时读写写8位或16位并行接口。参阅过CoX Driver 里的一些驱动写法,都是一位一位的通过GPIO来读写,这样不仅效率降低,占用的程序空间也较大。 下面推荐一种简单高效的方法:(仅限于STM32F1xx系列xgpio库函数,其他MCU系列没研究,估计大同小异吧) 写:GpioParaWrite(unsigned long ulPort, unsigned long ulData, unsigned long ulMask) { xGPIOPinWrite(ulPort, ulData&ulMask, 1); xGPIOPinWrite(ulPort, ~ulData&ulMask, 0);}ulData是要写入的数据ulMask是掩码,比如你要写低八位,则ulMask取0x00FF,16位则取0xFFFF 其实现原理参照下述: Cox库里关于GPIO写函数有这样的定义xgpio.h里定义#define xGPIOPinWrite(ulPort, ulPins, ucVal) \ GPIOPinWrite(ulPort, ulPins, ucVal)xgpio.c里定义void GPIOPinWrite(unsigned long ulPort, unsigned long ulPins, unsigned char ucVal){ // // Check the arguments. // xASSERT(GPIOBaseValid(ulPort)); // // Write the pins. // xHWREG(ulPort + GPIO_ODR) = ((ucVal & 1) ? (xHWREG(ulPort + GPIO_ODR) | ulPins) : (xHWREG(ulPort + GPIO_ODR) & ~(ulPins)));}在ucVal=1时,ulPins的值与ODR的值相或,在ucVal=0时ulPins的值取反并屏蔽无关位后与ODR的值相与,在经过xGPIOPinWrite(NF_DATA_PORT, ulData, 1);xGPIOPinWrite(NF_DATA_PORT, ~ulData, 0);这两次写后相当于ODR与ulData或一次再与一次,结果ulData就写入ODR了,而且不影响其他位。 读:Cox库里关于GPIO读函数有这样的定义xgpio.h里定义#define xGPIOPinRead(ulPort, ulPins) \ GPIOPinRead(ulPort, ulPins)xgpio.c里定义long GPIOPinRead(unsigned long ulPort, unsigned long ulPins){ // // Check the arguments. // xASSERT(GPIOBaseValid(ulPort)); // // Return the pin value(s). // return(xHWREG(ulPort +GPIO_IDR ) & (ulPins));}要并行读就比较简单了,只需要把Mask作为ulPins参数传递这个函数就行了。 这样相比逐位读写效率高多了,特别是在位数较多的情况下。而且采用的都是通用强制接口,可移植性强。虽然这样效率有所提高,但还是没有直接写寄存器快,因此希望今后的CoX固件库里有直接用寄存器实现这样的操作的函数。 如有问题望高手指出。


1楼2013-03-27 11:03回复
    顶一个,没人顶就自己顶,一定要顶啊,必须的


    2楼2013-03-28 12:35
    回复