CSL学习笔记第八章GPIO模块.docx
第八章 GPIO模块8.1 概述通过GPIO模块的设计以允许对C55x器件中可用的非复用和地址GPIO引脚的核心控制。以下三个表格列出了该模块有关的函数,寄存器和宏定义。表8-1 GPIO函数GPIO_pinDirection设置GPIO引脚为输入或者输出GPIO_pinDisable禁止一个引脚作为GPIO引脚GPIO_pinEnable使能一个引脚作为GPIO引脚GPIO_pinRead读GPIO引脚的值GPIO_pinWrite向GPIO引脚写值下面的函数是C5501和C5502器件所支持。GPIO_colse释放一个或多个GPIO引脚GPIO_config配置GPIO引脚GPIO_open分配一个或多个GPIO引脚到当前进程中GPIO_pinReadAll读一个或多个引脚的值GPIO_pinWriteAll写一个或多个引脚GPIO_pinReset复位一个或多个引脚表8-2 GPIO寄存器IODIR IO7DIR, IO6DIR, IO5DIR, IO4DIR, IO3DIR, IO2DIR, IO1DIR, IO0DIRIODATA IO7D, IO6D, IO5D, IO4D, IO3D, IO2D, IO1D, IO0D C5509 and C5509A支持以下.AGPIOEN IO13, IO12, IO11, IO10, IO9, IO8AGPIODIR IO13DIR, IO12DIR, IO11DIR, IO10DIR, IO9DIR, IO8DIRAGPIODATAIO13D, IO12D, IO11D, IO10D, IO9D, IO8DC5502 和 C5501支持以下.PGPIOEN0 IO15EN, IO14EN, IO13EN, IO12EN, IO11EN, IO10EN, IO9EN, IO8EN,IO7EN, IO6EN, IO5EN, IO4EN, IO3EN, IO2EN, IO1EN, IO0ENPGPIODIR0 IO15DIR, IO14DIR, IO13DIR, IO12DIR, IO11DIR, IO10DIR, IO9DIR, IO8DIR,IO7DIR, IO6DIR, IO5DIR, IO4DIR, IO3DIR, IO2DIR, IO1DIRPGPIODAT0 IO15DAT, IO14DAT, IO13DAT, IO12DAT, IO11DAT, IO10DAT, IO9DAT, IO8DAT,IO7DAT, IO6DAT, IO5DAT, IO4DAT, IO3DAT, IO2DAT, IO1DAT, IO0DATPGPIOEN1 IO31EN, IO30EN, IO29EN, IO28EN, IO27EN, IO26EN, IO25EN, IO24EN,IO23EN, IO22EN, IO21EN, IO20EN, IO19EN, IO18EN, IO17EN, IO16ENPGPIODIR1 IO31DIR, IO30DIR, IO29DIR, IO28DIR, IO27DIR, IO26DIR, IO25DIR,IO24DIR, IO23DIR, IO22DIR, IO21DIR, IO20DIR, IO19DIR, IO18DIR,IO17DIR, IO16DIRPGPIODAT1 IO31DAT, IO30DAT, IO29DAT, IO28DAT, IO27DAT, IO26DAT, IO25DAT,IO24DAT, IO23DAT, IO22DAT, IO20DAT, IO19DAT, IO18DAT, IO17DAT,IO16DATPGPIOEN2 IO45EN, IO44EN, IO43EN, IO42EN, IO41EN, IO40EN, IO39EN, IO38EN,IO37EN, IO36EN, IO35EN, IO34EN, IO33EN, IO32ENPGPIODIR2 IO45DIR, IO44DIR, IO43DIR, IO42DIR, IO41DIR, IO40DIR, IO39DIR,IO38DIR, IO37DIR, IO36DIR, IO35DIR, IO34DIR, IO33DIR, IO32DIRPGPIODAT2 IO45DAT, IO44DAT, IO43DAT, IO42DAT, IO41DAT, IO40DAT, IO39DAT,IO38DAT, IO37DAT, IO36DAT, IO35DAT, IO34DAT, IO33DAT, IO32DAT8.2 配置结构体以下是建立GPIO的配置结构体GPIO_Config(非并行GPIO引脚配置结构体)成员列表:Uint16 ioen引脚使能寄存器 IOENUint16 iodir引脚方向寄存器 IODIR说明:建立非并行GPIO引脚的GPIO配置结构体.创建并初始化该结构体,接着向GPIO_config()函数船体其地址。你可以通过使用文本值或者GPIO_RMK宏来创建结构体成员值。GPIO_ConfigAll(并行和非并行GPIO引脚的配置结构体)说明:GPIO配置结构体是用于建立并行和非并行GPIO引脚,.创建并初始化该结构体,接着向GPIO_configAll()函数船体其地址。你可以通过使用文本值或者GPIO_RMK宏来创建结构体成员值。成员列表:Uint16 ioen 非并行引脚使能寄存器 IOENUint16 iodir 非并行GPIO引脚方向寄存器 IODIRUint16 pgpioen 并行GPIO引脚使能寄存器0 PGPIOEN0Uint16 pgpiodir 并行GPIO引脚方向寄存器0PGPIODIR0Uint16 pgpioen1 并行GPIO引脚使能寄存器1 PGPIOEN1Uint16 pgpiodir1 并行GPIO引脚方向寄存器1 PGPIODIR1Uint16 pgpioen2 并行GPIO引脚使能寄存器 2 PGPIOEN2Uint16 pgpiodir2 并行GPIO引脚方向寄存器2 PGPIODIR28.3函数以下的函数被C5502和C5501支持。GPIO_close(释放先前被GPIO_open所占用的GPIO引脚)函数Void GPIO_(GPIO_Handle hGpio);参数hGpioGPIO 引脚句柄(参见GPIO_open())返回值None说明释放先前被GPIO_open所占用的GPIO引脚。实例GPIO_close(hGpio);GPIO_open(为单独使用占用GPIO)函数GPIO_Handle GPIO_open(Uint32 allocMask,Uint32 flags);参数allocMask占用的GPIO引脚,可以参见GPIO_pinDirection查看可用的引脚。flags打开标志,当前未指定。返回值GPIO_Handle器件句柄说明在一个GPIO引脚被使用前,必须要被该应用程序占用,一旦被占用了,就不会在响应其他的请求,直到被GPIO_close()关闭。返回值是一个唯一的器件句柄,该句柄用于随后的API调用中的GPIO中。如果函数出错返回INV(-1)。对于C5502和C5501,有四组GPIO 引脚(见GPIO_pinDirection())在调用了GPIO_open() 的同一时刻只能打开一组中的一个或几个引脚,在不同组中多次调用引脚的allocMask会产生未知结果。例如:GPIO_open()第一个参数是同一组的(GPIO_GPIO_PIN4|GPIO_GPIO_PIN2),但是(GPIO_GPIO_PIN4 | GPIO_PGPIO_PIN2)就会产生未知结果。如果GPIO_open()在一个组中被调用了,在GPIO_close被调用前,它就不能再次调用来打开同组的其他引脚。然而,GPIO_open()可以在此时被调用来打开其他组的引脚。例如:如果GPIO_open()第一次调用了GPIO_GPIO_PIN4,他就不能再被调用打开同组的的GPIO_GPIO_PIN2,但是可以打开GPIO_PGPIO_PIN2.实例GPIO_Handle hGpio;hGpio = GPIO_open(GPIO_PGPIO_PIN1,0);GPIO_config(向非并行寄存器写入值)函数void GPIO_config(GPIO_Handle hGpio,GPIO_Config *cfg);参数hGpioGPIO器件句柄Cfg初始化配置寄存器的指针返回值无说明使用配置结构体向非并行GPIO控制寄存器写入值。注意:GPIO_Config结构体对于GPIOhe PGPIO是通用的,但GPIO_config() 函数只对使能的GPIO0:7.( The GPIO_config() function just discards the enable field in case of GPIO 0:7 pins.)实例GPIO_Handle hGpio ;GPIO_Config myConfig = GPIO_PIN1_OUTPUT | GPIO_PIN3_OUTPUT 对5501和5502的配置hGpio = GPIO_open (GPIO_GPIO_PIN1|GPIO_GPIO_PIN3,0)GPIO_config(hGpio &myconfig); GPIO_configAll(向并行和非并行GPIO控制寄存器写入值)函数void GPIO_config(GPIO_ConfigAll&gCfg)参数gCfg上电和掉电非复用GPIO引脚的配置结构体返回值无说明向并行和非并行GPIO控制寄存器写入值,用法参见GPIO_ConfigAll实例GPIO_ConfigAll gCfg = GPIO_PIN1_OUTPUT|GPIO_PIN3_OUTPUT,/*IODIR*/0,/*PGPIOEN0*/0,/*PGPIODIR0*/0,/*PGPIOEN1*/0,/*PGPIODIR1*/0,/*PGPIOEN2*/0,/*PGPIODIR2*/*5501和5502的gpio配置*/GPIO_configAll(&gCfg);GPIO_pinDirection(设置GPIO为输入或者输出)函数对于C5501和C5502void GPIO_pinDirection(GPIO_Handle hGpio,Uint32 pinMask,Uint16 direction);对于C5509/A和C5510void GPIO_pinDirection(Uint32 pinMask,Uint16 direction);参数hGpio之前调用GPIO_open()返回的GPIO句柄。(此参数只对C5501/2)pinMask 受方向影响的GPIO引脚对于5501/2,pinMask可以是以下的:GPIO PinGroup 0 (非并行):GPIO_GPIO_PIN0GPIO_GPIO_PIN1GPIO_GPIO_PIN2GPIO_GPIO_PIN3GPIO_GPIO_PIN4GPIO_GPIO_PIN5GPIO_GPIO_PIN6GPIO_GPIO_PIN7GPIO Pin Group 1 (并行 GPIO Pins 0-15):GPIO_PGPIO_PIN0GPIO_PGPIO_PIN1GPIO_PGPIO_PIN2GPIO_PGPIO_PIN3GPIO_PGPIO_PIN4GPIO_PGPIO_PIN5GPIO_PGPIO_PIN6GPIO_PGPIO_PIN7GPIO_PGPIO_PIN8GPIO_PGPIO_PIN9GPIO_PGPIO_PIN10GPIO_PGPIO_PIN11GPIO_PGPIO_PIN12GPIO_PGPIO_PIN13GPIO_PGPIO_PIN14GPIO_PGPIO_PIN15GPIO Pin Group 2 (并行 GPIO Pins 16-31):GPIO_PGPIO_PIN16GPIO_PGPIO_PIN17GPIO_PGPIO_PIN18GPIO_PGPIO_PIN19GPIO_PGPIO_PIN20GPIO_PGPIO_PIN21GPIO_PGPIO_PIN22GPIO_PGPIO_PIN23GPIO_PGPIO_PIN24GPIO_PGPIO_PIN25GPIO_PGPIO_PIN26GPIO_PGPIO_PIN27GPIO_PGPIO_PIN28GPIO_PGPIO_PIN29GPIO_PGPIO_PIN30GPIO_PGPIO_PIN31GPIO Pin Group 3 (并行GPIO Pins 32-45):GPIO_PGPIO_PIN32GPIO_PGPIO_PIN33GPIO_PGPIO_PIN34GPIO_PGPIO_PIN35GPIO_PGPIO_PIN36GPIO_PGPIO_PIN37GPIO_PGPIO_PIN38GPIO_PGPIO_PIN39GPIO_PGPIO_PIN40GPIO_PGPIO_PIN41GPIO_PGPIO_PIN42GPIO_PGPIO_PIN43GPIO_PGPIO_PIN44GPIO_PGPIO_PIN45pinMask可以是单独的某个引脚或者是同组几个引脚的组合(例如: GPIO_PGPIO_PIN23| GPIO_PGPIO_PIN30)。directionpinMask选定的引脚的方向标记GPIO Pin Group 0 (非并行 GPIO Pins):GPIO_GPIO_PIN0_OUTPUTGPIO_GPIO_PIN1_OUTPUTGPIO_GPIO_PIN2_OUTPUTGPIO_GPIO_PIN3_OUTPUTGPIO_GPIO_PIN4_OUTPUTGPIO_GPIO_PIN5_OUTPUTGPIO_GPIO_PIN6_OUTPUTGPIO_GPIO_PIN7_OUTPUTGPIO_GPIO_PIN0_INPUTGPIO_GPIO_PIN1_INPUTGPIO_GPIO_PIN2_INPUTGPIO_GPIO_PIN3_INPUTGPIO_GPIO_PIN4_INPUTGPIO_GPIO_PIN5_INPUTGPIO_GPIO_PIN6_INPUTGPIO_GPIO_PIN7_INPUTGPIO Pin Group 1 (并行GPIO Pins 0-15):GPIO_PGPIO_PIN0_OUTPUTGPIO_PGPIO_PIN1_OUTPUTGPIO_PGPIO_PIN2_OUTPUTGPIO_PGPIO_PIN3_OUTPUTGPIO_PGPIO_PIN4_OUTPUTGPIO_PGPIO_PIN5_OUTPUTGPIO_PGPIO_PIN6_OUTPUTGPIO_PGPIO_PIN7_OUTPUTGPIO_PGPIO_PIN8_OUTPUTGPIO_PGPIO_PIN9_OUTPUTGPIO_PGPIO_PIN10_OUTPUTGPIO_PGPIO_PIN11_OUTPUTGPIO_PGPIO_PIN12_OUTPUTGPIO_PGPIO_PIN13_OUTPUTGPIO_PGPIO_PIN14_OUTPUTGPIO_PGPIO_PIN15_OUTPUTGPIO_PGPIO_PIN0_INPUTGPIO_PGPIO_PIN1_INPUTGPIO_PGPIO_PIN2_INPUTGPIO_PGPIO_PIN3_INPUTGPIO_PGPIO_PIN4_INPUTGPIO_PGPIO_PIN5_INPUTGPIO_PGPIO_PIN6_INPUTGPIO_PGPIO_PIN7_INPUTGPIO_PGPIO_PIN8_INPUTGPIO_PGPIO_PIN9_INPUTGPIO_PGPIO_PIN10_INPUTGPIO_PGPIO_PIN11_INPUTGPIO_PGPIO_PIN12_INPUTGPIO_PGPIO_PIN13_INPUTGPIO_PGPIO_PIN14_INPUTGPIO_PGPIO_PIN15_INPUTGPIO Pin Group 2 (并行GPIO Pins 16-31):GPIO_PGPIO_PIN16_OUTPUTGPIO_PGPIO_PIN17_OUTPUTGPIO_PGPIO_PIN18_OUTPUTGPIO_PGPIO_PIN19_OUTPUTGPIO_PGPIO_PIN20_OUTPUTGPIO_PGPIO_PIN21_OUTPUTGPIO_PGPIO_PIN22_OUTPUTGPIO_PGPIO_PIN23_OUTPUTGPIO_PGPIO_PIN24_OUTPUTGPIO_PGPIO_PIN25_OUTPUTGPIO_PGPIO_PIN26_OUTPUTGPIO_PGPIO_PIN27_OUTPUTGPIO_PGPIO_PIN28_OUTPUTGPIO_PGPIO_PIN29_OUTPUTGPIO_PGPIO_PIN30_OUTPUTGPIO_PGPIO_PIN31_OUTPUTGPIO_PGPIO_PIN16_INPUTGPIO_PGPIO_PIN17_INPUTGPIO_PGPIO_PIN18_INPUTGPIO_PGPIO_PIN19_INPUTGPIO_PGPIO_PIN20_INPUTGPIO_PGPIO_PIN21_INPUTGPIO_PGPIO_PIN22_INPUTGPIO_PGPIO_PIN23_INPUTGPIO_PGPIO_PIN24_INPUTGPIO_PGPIO_PIN25_INPUTGPIO_PGPIO_PIN26_INPUTGPIO_PGPIO_PIN27_INPUTGPIO_PGPIO_PIN28_INPUTGPIO_PGPIO_PIN29_INPUTGPIO_PGPIO_PIN30_INPUTGPIO_PGPIO_PIN31_INPUTGPIO Pin Group 3 (并行GPIO Pins 32-45):GPIO_PGPIO_PIN32_OUTPUT GPIO_PGPIO_PIN33_OUTPUT GPIO_PGPIO_PIN34_OUTPUTGPIO_PGPIO_PIN35_OUTPUT GPIO_PGPIO_PIN36_OUTPUTGPIO_PGPIO_PIN37_OUTPUT GPIO_PGPIO_PIN38_OUTPUT GPIO_PGPIO_PIN39_OUTPUT GPIO_PGPIO_PIN40_OUTPUT GPIO_PGPIO_PIN41_OUTPUT GPIO_PGPIO_PIN42_OUTPUT GPIO_PGPIO_PIN43_OUTPUT GPIO_PGPIO_PIN44_OUTPUT GPIO_PGPIO_PIN45_OUTPUT GPIO_PGPIO_PIN32_INPUT GPIO_PGPIO_PIN33_INPUTGPIO_PGPIO_PIN34_INPUTGPIO_PGPIO_PIN35_INPUTGPIO_PGPIO_PIN36_INPUTGPIO_PGPIO_PIN37_INPUTGPIO_PGPIO_PIN38_INPUTGPIO_PGPIO_PIN39_INPUTGPIO_PGPIO_PIN40_INPUTGPIO_PGPIO_PIN41_INPUTGPIO_PGPIO_PIN42_INPUTGPIO_PGPIO_PIN43_INPUTGPIO_PGPIO_PIN44_INPUTGPIO_PGPIO_PIN45_INPUT方向可以使用任何上面定义过的符号常量来设置,同组的多个引脚可以用或操作进行设置比如:GPIO_PGPIO_PIN45_INPUT | GPIO_PGPIO_PIN40_OUTPUT返回值无说明设置一个或多个GPIO的方向实例/*设置pgpio为输入*/GPIO_handle hGpio = GPIO_openGPIO_PGPIO_PIN1|GPIO_PGPIO_PIN15;GPIO_pinDirection(hGpio,GPIO_PGPIO_PIN1_INPUT) ;GPIO_pinDisable.(禁止一个引脚作为GPIO引脚)函数对于5501/2:Void GPIO_pinDisable(GPIO_Handle hGpio,Uint32 pinId)对于5509/a,5510:Void GPIO_pinDisable(Uint32 pinId)参数hGpio由GPIO_open返回的GPIO句柄(仅对5501/2 CSL)pinId禁止的引脚,参见GPIO_pinDirection()查看引脚号。返回值无说明禁止一个或多个GPIO引脚实例/*禁止PGPIO1作为GPIO*/GPIO_handle hGpio = GPIO_open (GPIO_GPIO_PIN1|GPIO_GPIO_PIN15);GPIO_pinDisable(hGpio,GPIO_GPIO_PIN1);GPIO_pinEnable(使能一个引脚作为GPIO)函数对于5501/2:Void GPIO_pinEnable(GPIO_Handle hGpio,Uint32 pinId)对于5509/A,5510:Void GPIO_pinEnable(Uint32 pinId)参数hGpio由GPIO_open返回的GPIO句柄(仅对5501/2 CSL)pinId使能的引脚,参见GPIO_pinDirection()查看引脚号。返回值无说明使能一个GPIO引脚实例GPIO_pinEnable(hGpio,GPIO_GPIO_PIN1)GPIO_pinRead (读GPIO引脚值)函数对于5501/2:intGPIO_pinRead(GPIO_Handle hGpio,Uint32 pinId) 对于5509/A,5510:int GPIO_pinRead(Uint32 pinId)参数hGpio由GPIO_open返回的GPIO句柄(仅对5501/2 CSL)pinId要读的引脚返回值读出的值(0或1)说明读输入引脚的值实例int val;val = GPIO_pinRead(hGpio,GPIO_GPIO_PIN1);GPIO_pinReadAll(从一个或多个GPIO引脚上读回值)函数对于5501/5502:Int GPIO_pinReadAll(GPIO_Handle hGpio,Uint32 pinMask);对于5509/A,5510:Int GPIO_pinReadAll(Uint32 pinMask)参数hGpio 由GPIO_open返回的GPIO句柄(仅对5501/2 CSL)pinMask 要读的GPIO引脚号,参见GPIO_pinDirection()查看引脚号返回值value 读出的GPIO引脚值说明读出pinMask指定的GPIO引脚的值。(该函数返回代替引脚的值,. The function returnsthe value in place of the pins. It does not right-justify the value to return a rawresult.)实例int val;/*读IO0和IO7引脚的值*/val = GPIO_pinReadAll(hGpio,GPIO_GPIO_PIN0|GPIO_GPIO_PIN7); GPIO_pinWrite(向一个GPIO引脚写入值)函数对于 5501/2:Void GPIO_pinWrite(GPIO_Handle hGpio ,Uint32 pinMask ,Uint16 val)对于 5509/A,5510:Void GPIO_pinWrite(Uint32 pinMask,Uint16 val)参数hGpio 由GPIO_open返回的GPIO句柄(仅对5501/2 CSL)pinMask 要写的GPIO引脚号,参见GPIO_pinDirection()查看引脚号val向GPIO引脚写入的值(0或1)返回值无说明向GPIO输出引脚写入值。实例/*向pin0和pin5写入1*/GPIO_pinWrite (hGpio,GPIO_GPIO_PIN0|GPIO_GPIO_PIN5,1)GPIO_pinWriteAll (向一个或者多个GPIO引脚写入值)函数对于 C5502 and C5501:void GPIO_pinWriteAll(GPIO_Handle hGpio,Uint32 pinMask, Uint16 val)对于C5509/C5509A/C5510:void GPIO_pinWriteAll(Uint32 pinMask, Uint16 val)参数hGpio 由GPIO_open返回的GPIO句柄(仅对5501/2 CSL)pinMask 要写的GPIO引脚号,参见GPIO_pinDirection()查看引脚号。val向GPIO引脚写入的值(0或1)返回值无说明向一个或多个输出GPIO引脚写入值, ( Ths function assumes an in-place value mask for writing to the GPIO pins. It will not left-justify values.)实例/*向pin0和pin5写入1*/GPIO_pinWrite All(hGpio,GPIO_GPIO_PIN0|GPIO_GPIO_PIN5,1) GPIO_pinReset (复位GPIO引脚为默认值)函数void GPIO_pinReset(GPIO_Handle hGpio ,Uint pinMask)参数hGpio 由GPIO_open返回的GPIO句柄(仅对5501/2 CSL)pinMask 要写的GPIO引脚号,参见GPIO_pinDirection()查看引脚号。返回值无说明重置所选的GPIO引脚到默认的值0实例/* writes 1 to IO pin1 and IO pin 3 */ GPIO_pinReset (hGpio, GPIO_GPIO_PIN1 | GPIO_GPIO_PIN3);8.4 GPIO CSL 宏A) 读写GPIO寄存器的宏GPIO_RGET()Uint16 GPIO_RGET(REG)GPIO_RSET()void GPIO_RSET(REG,Uint16 regval)B)读写GPIO寄存器字段的宏(只对有超过一个字段的寄存器)GPIO_FGET()Uint16 GPIO_FGET(REG,FIELD)GPIO_FSET()void GPIO_FSET(REG,FIELD,Uint16 fieldval)C) 创建GPIO寄存器和字段值的宏(只对有超过一个字段的寄存器)GPIO_REG_RMK()Uint16 GPIO_REG_RMK(fieldval_n,.,fieldval_0)注意:*Start with field values with most significant field positions:field_n: MSB fieldfield_0: LSB field*only writable fields allowedGPIO_FMK()Uint16 GPIO_FMK(REG,FIELD,fieldval) D)读寄存器地址的宏GPIO_ADDR()Uint16GPIO_ADDR(REG)Notes: 1) REG include the registers IODIR, IODATA, GPIODIR, GPIODATA, GPIOEN, AGPIODIR, AGPIODATA, and AGPIOEN.2) FIELD indicates the register field name3) regval indicates the value to write in the register (REG).4) fieldval indicates the value to write in the field (FIELD).第 10 页