DSP

学习笔记之TMS320C6748的GPIO操作

2019-07-13 15:31发布

 一、TMS320C6748的GPIO特性  参考TI技术文档SPRUFL8B(《TMS320C674x/OMAP-L1x Processor GPIO User's Guide》)的1.2Features部分我们可以看出TMS320C6748的GPIO有如下特性:  1.可以通过单独的数据设置和清除寄存器来设置/清除GOIO功能和可通过软件在没有critical section保护下控制GPIO(这部分我不理解原文)  2.还支持通过写一个单一的输出数据寄存器设置/清除功能。  3.独立的输出/输入寄存器—— 输出寄存器可以读,以反映输出驱动器的状态输入寄存器可以读,以反映引脚的状态  4.所有GPIO信号可以作为中断源和可配置的边缘检测。  5.所有GPIO信号可以被用来产生到EDMA的事件 二、TMS320C6748的GPIO框图   从中可以看到控制GPIO的各种寄存器,本文只介绍DIR、SET_DATA、CLR_DATA、INDATA这四个寄存器。 三、初始化GPIO步骤 参看《SPRUFL8B》 2.9 Initialization部分 1.进行器件引脚复用设置 2.设置PSC(电源和睡眠控制寄存器)使能GPIO 3.设置方向、数据、中断控制寄存器来按需配置 四、介绍StarterWare的有关GPIO的库函数        使用StarterWare的GPIO函数需要添加“gpio.c”或者“C: iC6748_StarterWare_1_20_04_01inaryc674xcgt_ccsc6748driversDebugdrivers.lib”,另外,还需要添加的头文件有"gpio.h"、 "soc_C6748.h"、 "hw_syscfg0_C6748.h"、 "hw_types.h" 这些头文件定义了很多寄存器的物理地址和用来计算地址位置等的函数宏。 1.按照步骤,我们先看一下有关复用的寄存器PINMUXn。因为我的开发板用到的是GPIO2[8],所以直接定位到PINMUX5寄存器: 看到GP2[8]在PINMUX5的31-28位,令此位为“1”即可。下图为PINMUX5寄存器的物理地址: 我们采取“读-屏蔽-写”的操作避免影响到其他位的配置。在hw_types.h中定义了HWREG(x)  (*((volatile unsigned int *)(x))),于是我们可以如下设置: PINMUX_5_VAL=HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(5));  /* 读取PINMUX5(复用寄存器)寄存器的值 */ 
PINMUX_5_VAL=(PINMUX_5_VAL&0x0fffffff)|0x80000000; HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(5))=PINMUX_5_VAL;/* 将设置后的值写回PINMUX5寄存器  GP2[8] */        上面的SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(5)值为0x1c14134正好为PINMUX5的地址。StarterWare会根据某一外设的寄存器的基址的规律来计算该外设下的某一寄存器地址,就像SOC_SYSCFG_0_REGS,它在soc_C6748.h的289行定义为0x01C14000,而PINMUX5在此外设下。而SYSCFG0_PINMUX(n)  (0x120 + (n * 4))正好利用了每个PINMUXn之间有九个其他寄存器,每个寄存器都是32位来线性计算的。 2.这里PSC用硬件复位后的default就好了。 3.设置输入/输出寄存器。库函数中定义了void GPIODirModeSet(unsigned int baseAdd, unsigned int pinNumber,unsigned int pinDir);来设置IO口的输入/输出状态。其中pinNumber要注意,函数入口参数中有如下说明: The 144 GPIO pins have serial numbers from 1 to 144.
 *                       GPIO0[0] 1 ,GPIO1[0] 17
 *                       GPIO2[0] 33 ,GPIO3[0] 49
 *                       GPIO4[0] 65 ,GPIO5[0] 81
 *                       GPIO6[0] 97 ,GPIO7[0] 113
 *                       GPIO8[0] 129 譬如我想要设置GPIO2[8]为输出,则pinNumber=41。 GPIODirModeSet(SOC_GPIO_0_REGS, 41, GPIO_DIR_OUTPUT);可设置GPIO2[8]为输出;同样的,写GPIO函数一样的原理,只是寄存器地址计算不一样,这里就不列举了。GPIOPinWrite(SOC_GPIO_0_REGS, 41, GPIO_PIN_HIGH);就可以让GPIO2[8]输出高电平了。读操作具体函数参看"C: iC6748_StarterWare_1_20_04_01driversgpio.c”。这样我们就可以简单操作GPIO了!