[C5000 & C6000] C6748连载5:GPIO操作(原创)

[复制链接]
115|1
 楼主 | 2019-1-2 17:31 | 显示全部楼层 ||阅读模式
从这一个开始才算真正迈入6748的门槛,从TMS320C6748最简单的外设GPIO开始。
1、GPIO框图:

6748一共有144个GPIO管脚,分成了9个Bank,每个Bank有16个管脚:
1~144对应:GP0[0]~GP8[15],
对6748的GPIO操作其实和其他MCU的操作是个流程,不同的是6748要复杂很多,STM32有库函数,直接调用就可以,

但是6748的库函数不完整,有的需要对寄存器进行操作。
2、初始化GPIO的步骤
创龙的例程就不再赘述了,不知道是不是自己没找到源程序,下面的几个管脚复用的函数我都没有找到,不知道是怎么实现的,所以想要移植其他GPIO很困难。
/****************************************************************************/
/*                                                                          */
/*              GPIO 管脚复用配置                                           */
/*                                                                          */
/****************************************************************************/
void GPIOBankPinMuxSet(void)
{
// 配置相应的 GPIO 口功能为普通输入输出口
// 底板 LED
GPIOBank0Pin0PinMuxSetup();
GPIOBank0Pin1PinMuxSetup();
GPIOBank0Pin2PinMuxSetup();
GPIOBank0Pin5PinMuxSetup();
}



自己通过查阅技术手册,对GPIO的寄存器GPIO_OUT_DATA进行操作,
而不是调用GPIOPinWrite()函数对GPIO_SET_DATA寄存器进行操作,实现流水灯的效果。
第一步:管脚复用为输入输出口,在这里吐槽一下库函数,官方的库函数竟然没有管脚复用的函数,只能自己操作寄存器,6748有20个管脚复用控制寄存器PINMUX
把GP0[0]~GP0[7]设置为输出管脚:对应PINMUX1_31~0,每4bit控制一个管脚
技术手册:

对该寄存器的操作采用“读-屏蔽-写”的操作避免影响到其他位的配置。
   //复用管脚1~8,GP0[0]~GP0[7],为输入输出管脚
    PINMUX_1_VAL=HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1));  /* 读取PINMUX1(复用寄存器)寄存器的值 */
    PINMUX_1_VAL=(PINMUX_1_VAL&0x00000000)|0x88888888;
    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1))=PINMUX_1_VAL;/* 将设置后的值写回PINMUX1寄存器  */
其中HWREG是对寄存器进行操作:
#define HWREG(x)                                                              \
        (*((volatile unsigned int *)(x)))

SOC_SYSCFG_0_REGS定义在:soc_6748.h头文件中,代表系统控制寄存器的首地址,加上SYSCFG0_PINMUX(1)对应目标地址,这样的操作后面还有:
/** \brief Base address of DEV memory mapped registers                        */
#define SOC_SYSCFG_0_REGS                   (0x01C14000)


第二步:设置管脚为输出管脚,可以直接调用库函数,注意的是pinNumber是管脚号+1,其他不赘述:
    GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_OUTPUT);    // D10 GPIO0[7]
第三步:操作GPIO_OUT_DATA寄存器:

这里我不使用库函数
     GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_HIGH);
而是操作寄存器:
     HWREG(SOC_GPIO_0_REGS + GPIO_OUT_DATA(0))=0x01;
这样有个好处,在并行读GPIO口的时候有优势,同理可以操作:HWREG(SOC_GPIO_0_REGS + GPIO_INPUT_DATA(0))
其中SOC_GPIO_0_REGS 是GPIO的基地址
/** \brief Base address of GPIO memory mapped registers                       */
#define SOC_GPIO_0_REGS                     (0x01E26000)
GPIO_OUT_DATA是偏移地址,其中n从0~5


#define GPIO_OUT_DATA(n) (0x14 + (0x28 * n))
第四步:在CCS中调试
管脚复用正确:

方向正确:

输出结果正确:


感谢作者的参考文献:https://blog.csdn.net/litao31415/article/details/22645181

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2019-1-2 22:48 | 显示全部楼层
学习了    感谢分享
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

快速回复 返回顶部 返回列表