1010|0

2065

帖子

0

资源

纯净的硅(初级)

学习笔记之TMS320C6748的GPIO操作 [复制链接]

一、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框图

360截图20190606223702927.jpg

从中可以看到控制GPIO的各种寄存器,本文只介绍DIR、SET_DATA、CLR_DATA、INDATA这四个寄存器。

三、初始化GPIO步骤

参看《SPRUFL8B》 2.9 Initialization部分

1.进行器件引脚复用设置

2.设置PSC(电源和睡眠控制寄存器)使能GPIO

3.设置方向、数据、中断控制寄存器来按需配置

四、介绍StarterWare的有关GPIO的库函数

       使用StarterWare的GPIO函数需要添加“gpio.c”或者“C:\ti\C6748_StarterWare_1_20_04_01\binary\c674x\cgt_ccs\c6748\drivers\Debug\drivers.lib”,另外,还需要添加的头文件有"gpio.h"、 "soc_C6748.h"、 "hw_syscfg0_C6748.h"、 "hw_types.h" 这些头文件定义了很多寄存器的物理地址和用来计算地址位置等的函数宏。

1.按照步骤,我们先看一下有关复用的寄存器PINMUXn。因为我的开发板用到的是GPIO2[8],所以直接定位到PINMUX5寄存器:

360截图20190606223738397.jpg

看到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:\ti\C6748_StarterWare_1_20_04_01\drivers\gpio.c”。这样我们就可以简单操作GPIO了!

 
360截图20190606223811942.jpg


回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

最新文章 更多>>
    关闭
    站长推荐上一条 1/9 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表