DSP TMS320C6748—GPIO配置
转自:https://blog.csdn.net/xiaoluoshan/article/details/54412085
1 General-Purpose Input/Output(GPIO)通用输入输出配置介绍
本节我们主要介绍GPIO的输入输出控制功能,中断部分下次结合中断向量表一起说明。
1.1 GPIO简介
TMS320C6748共有8 Banks,16 GPIOs per Bank,几乎所有引脚都可以配置成为GPIO端口。
对于GPIO,我们只需关注这几个寄存器:
- DIR:方向控制寄存器,控制GPIO管脚是输入还是输出,其中,对应位置0表示该管脚为输出管脚;对应位置1表示该管脚为输入管脚。
- OUT_DATA:输出数据寄存器,控制管脚输出电平,其中,对应位置0表示该管脚输出为低电平;对应位置1表示该管脚输出为高电平。
- SET_DATA:设置数据寄存器,对应位置1表示该管脚输出为高电平,需要注意的是该寄存器写0无效。
- CLEAR_DATA:清除数据寄存器,对应位置1表示该管脚输出为低电平,需要注意的是该寄存器写0无效。
- IN_DATA:输入数据寄存器,注意该寄存器是只读寄存器,返回对应位的输入电平。
1.2 GPIO配置说明
创龙开发板中:GPIO_LED工程
a. 配置PSC模块,使能GPIO功能。
/****************************************************************************/
/* */
/* PSC 初始化 */
/* */
/****************************************************************************/
void PSCInit(void)
{
// 使能 GPIO 模块
// 对相应外设模块的使能也可以在 BootLoader 中完成
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
}
b. 配置PINMUX模块,选择需要使用的管脚作为GPIO引脚。
/****************************************************************************/
/* */
/* GPIO 管脚复用配置 */
/* */
/****************************************************************************/
void GPIOBankPinMuxSet(void)
{
// 配置相应的 GPIO 口功能为普通输入输出口
// 核心板 LED
GPIOBank6Pin12PinMuxSetup();
GPIOBank6Pin13PinMuxSetup();
// 底板 LED
GPIOBank0Pin1PinMuxSetup();
GPIOBank0Pin2PinMuxSetup();
GPIOBank0Pin5PinMuxSetup();
}
具体可以参看这篇帖子。http://bbs.elecfans.com/forum.php?mod=viewthread&tid=516939&page=1&extra=#pid3851865
c. 配置DIR方向控制寄存器。
/****************************************************************************/
/* */
/* GPIO 管脚初始化 */
/* */
/****************************************************************************/
void GPIOBankPinInit(void)
{
// 配置 LED 对应管脚为输出管脚
// OMAPL138 及 DSP C6748 共有 144 个 GPIO
// 以下为各组 GPIO BANK 起始管脚对应值
// 范围 1-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
// 核心板 LED
GPIODirModeSet(SOC_GPIO_0_REGS, 110, GPIO_DIR_OUTPUT); // 核心板FD1 GPIO6[13]
GPIODirModeSet(SOC_GPIO_0_REGS, 109, GPIO_DIR_OUTPUT); // 核心板FD2 GPIO6[12]
// 底板 LED
GPIODirModeSet(SOC_GPIO_0_REGS, 6, GPIO_DIR_OUTPUT); // 底板GD1 GPIO0[5]
GPIODirModeSet(SOC_GPIO_0_REGS, 2, GPIO_DIR_OUTPUT); // 底板GD2 GPIO0[1]
GPIODirModeSet(SOC_GPIO_0_REGS, 3, GPIO_DIR_OUTPUT); // 底板GD3 GPIO0[2]
}
d. 如果配置GPIO为输入引脚,那么在有信号输入后可以读取IN_DATA寄存器以获得输入电平;如果配置GPIO为输出引脚,可以配置OUT_DATA或SET_DATA或CLEAR_DATA寄存器输出高/低电平。
/****************************************************************************/
/* */
/* 主函数 */
/* */
/****************************************************************************/
int main(void)
{
// 外设使能配置
PSCInit();
// GPIO 管脚复用配置
GPIOBankPinMuxSet();
// GPIO 管脚初始化
GPIOBankPinInit();
// 主循环
for(;;)
{
GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_HIGH); // 底板GD1 GPIO0[5]
GPIOPinWrite(SOC_GPIO_0_REGS, 2, GPIO_PIN_HIGH); // 底板GD2 GPIO0[1]
GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_HIGH); // 底板GD3 GPIO0[2]
GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_HIGH); // 核心板FD1 GPIO6[13]
GPIOPinWrite(SOC_GPIO_0_REGS, 109, GPIO_PIN_HIGH); // 核心板FD2 GPIO6[12]
Delay(0x00FFFFFA);
GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_LOW); // 底板GD1 GPIO0[5]
GPIOPinWrite(SOC_GPIO_0_REGS, 2, GPIO_PIN_LOW); // 底板GD2 GPIO0[1]
GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_LOW); // 底板GD3 GPIO0[2]
GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_LOW); // 核心板FD1 GPIO6[13]
GPIOPinWrite(SOC_GPIO_0_REGS, 109, GPIO_PIN_LOW); // 核心板FD2 GPIO6[12]
Delay(0x00FFFFFA);
}
}