TMS320C6748开发视频教程笔记 第12章 通用输入输出口 GPIO

12-1 相关例程演示

1、GPIO_LED
输出模式,控制LED闪烁
2、GPIO_KEY
输入模式(中断)
按键控制核心板LED点亮
3、GPIO_KEY_TIMER_EventCombine
GPIO按键中断与定时器1中断组合事件
定时器每5s产生一次中断闪烁核心板LED
按下按键USER1闪烁另一个核心板LED
4、GPIO_KEY_EDMA
按键触发EDMA3事件
按下USER0按键,核心板LED闪烁1次
同时EDMA3将StringScr数据复制到StringDst
5、MATRIX_KEY
矩阵键盘

12-2 管脚复用配置

在这里插入图片描述
在这一期视频教程中为大家讲解通用输入输出口,在几乎所有的嵌入式CPU上,它们的外设可能差别很大,但是唯有这种外设它们是相同的,它们都是有一些通用目的的IO口,也就是GPIO。对于C6748也不例外,C6748一共有144个功能复用的GPIO口,注意这里有一个功能复用,也就是说这些GPIO口不仅仅可以作为GPIO来使用,也可以跟其他的外设的输入输出引脚进行复用,所以我们在使用这144个IO口之前,我们必须要配置好它的功能复用状态才能够使用,对于GPIO口的功能复用在SYSCFG(System configuration)寄存器中,有PINMUX0到PINMUX19一共20个寄存器可以用于配置这些IO口的输出输入功能。
GPIO口应该算是C6748中最简单的一个外设了,从这张结构图中就可以看出,它的功能非常简单,首先就是一个方向控制,控制这个IO口是输入还是输出;其次是对它输出状态的配置,可以进行SET置位或者CLEAR清除,对于这两个寄存器,都是写1有效,写0没有任何作用;还有一个就是中断,在C6748的每一个GPIO口都支持中断触发,但是由于这些IO口被分为由Bank0到Bank8,每一个Bank有16个IO口,所以在中断事件上以Bank为单位,也就是说只有Bank能触发中断,但是我们在触发了这一个Bank的中断之后,我们需要判断到底具体是哪一位产生了中断。在C6748 GPIO口的中断上支持上下沿触发,这里需要注意的是它不支持所谓的电平触发,实际上也没有必要,我们将它配置成边沿触发就可以了。这里需要注意的是,对于GPIO口的中断事件,除了可以给CPU也同时可以给EDMA发送中断,这样的话我们就可以通过一些GPIO口来触发一些EDMA的事件。
在这里插入图片描述
在这一期视频教程中,讲解一下6部分内容
在这里插入图片描述
1、管脚复用配置:由于这144个GPIO口功能都是复用的,有的IO口都不止两种三种甚至四种功能,所以在使用这些IO口之前必须要配置它的复用功能。
2、输入/输出模式:讲解一下GPIO口输入输出模式的配置
3、中断:讲解一下GPIO口的中断触发
4、EDMA3:讲解一下GPIO口触发EDMA3事件
5、测量代码执行时间:讲解一下怎么测量我们的代码执行周期
6、单步调试:讲解一下基于CCS的调试方式,我们没有单独拿一节课详细讲CCS的操作,主要是因为CCS功能比较强大,当然这只是一方面原因,还有一方面原因实际上是CCS V4以后是基于eclipse开发环境,它的操作相对比较友好,也比较简单,没有必要单独拿出一节课的内容呢来详细讲解CCS操作,只是在我们需要用到的时候来介绍相关的使用方法就可以了。
在这里插入图片描述
首先打开CCS开发环境,导入GPIO_LED这个例程,这里需要注意的是,导入的时候一定要保证导入的时候有一个Copy projects into workspace(复制工程到工作空间)一定不要勾选,导入工程以后打开唯一的一个main.c文件。这里另外再多说一句,因为在注释的时候是中英文或者是中文和符号混合排版的,如果CCS使用的不是等宽字体的话,在排版上会看着比较乱,而且对于CCS默认字号为9的来说,对中文的显示不友好,建议将字体改为12,字体改为等宽字体,获得比较好的可读效果。

对于一个c程序来说,首先从它的主函数来看,首先就是PSCInit();,它的主要功能就是使能相应的模块。因为DSP C6748是一款低功耗的产品,所以在一般情况下,对于我们不使用的模块默认都是关闭的,所以在使用之前我们必须要使能相应的模块。使能模块是对PSC外设进行操作,而PSC这个外设对应的startware驱动库里只有一个PSCModuleControl();函数,就是控制模块的状态,我们要使用它就需要把相应的模块状态配置为ALWAYS_ON也就是开启状态。对于这个PSC使能也可以在BootLoader中完成,比如说我们可以在.ais文件生成的时候就将相应的外设模块开启。
之后就是对GPIO管脚复用配置,可以按住Ctrl键点击相应的函数GPIOBankPinMuxSet(void),跳转到相应的函数本体,可以看到这里调用了4个函数,这4个函数分别配置相应的GPIO口,这4个函数的声明是位于TL6748.h这个头文件,按住Ctrl键点击#include "TL6748.h" 这个语句,跳转到这个文件,

/****************************************************************************/
/*                                                                          */
/*              底板 LED 测试                                               */
/*                                                                          */
/*              2014年04月20日                                              */
/*                                                                          */
/****************************************************************************/
#include "TL6748.h"                 // 创龙 DSP6748 开发板相关声明

#include "hw_types.h"               // 宏命令
#include "hw_syscfg0_C6748.h"       // 系统配置模块寄存器
#include "soc_C6748.h"              // DSP C6748 外设寄存器

#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明

#include <stdio.h>
/****************************************************************************/
/*                                                                          */
/*              宏定义                                                      */
/*                                                                          */
/****************************************************************************/
// 软件断点
#define SW_BREAKPOINT   asm(" SWBP 0 ");

/****************************************************************************/
/*                                                                          */
/*              全局变量                                                    */
/*                                                                          */
/****************************************************************************/

/****************************************************************************/
/*                                                                          */
/*              函数声明                                                    */
/*                                                                          */
/****************************************************************************/
// 外设使能配置
void PSCInit(void);
// GPIO 管脚复用配置
void GPIOBankPinMuxSet();
// GPIO 管脚初始化
void GPIOBankPinInit();
// 延时
void Delay(unsigned int n);

/****************************************************************************/
/*                                                                          */
/*              主函数                                                      */
/*                                                                          */
/****************************************************************************/
int main(void)
{
	// 外设使能配置
	PSCInit();

	// GPIO 管脚复用配置
	GPIOBankPinMuxSet();

	// GPIO 管脚初始化
	GPIOBankPinInit();

	// 主循环
	for(;;)
	{
		printf("LED 亮!\n");
		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(0x00FFFFFF);
		printf("LED 灭!\n");
		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(0x00FFFFFF);

//		// 延时
//		Delay(0x00FFFFFA);
//    	GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_LOW);    // D10 灭 GPIO0[2]
//		GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_HIGH);   // D7  亮 GPIO0[0]
//
//		//延时
//		Delay(0x0000000A);
//		GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_LOW);    // D7  灭 GPIO0[0]
//		GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_HIGH);   // D6  亮 GPIO0[5]
//
//		// 延时
//		Delay(0x00FFFFFA);
//		GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_LOW);    // D6  灭 GPIO0[5]
//		GPIOPinWrite(SOC_GPIO_0_REGS, 2, GPIO_PIN_HIGH);   // D9  亮 GPIO0[1]
//
//		// 延时
//		Delay(0x0000000A);
//		GPIOPinWrite(SOC_GPIO_0_REGS, 2, GPIO_PIN_LOW);    // D9  灭 GPIO0[1]
//		GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_HIGH);   // D10 亮 GPIO0[2]
	}
}

/****************************************************************************/
/*                                                                          */
/*              PSC 初始化                                                  */
/*                                                                          */
/****************************************************************************/
void PSCInit(void)
{
	// 使能 GPIO 模块
	// 对相应外设模块的使能也可以在 BootLoader 中完成
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
}

/****************************************************************************/
/*                                                                          */
/*              GPIO 管脚复用配置                                           */
/*                                                                          */
/****************************************************************************/
void GPIOBankPinMuxSet(void)
{
	// 配置相应的 GPIO 口功能为普通输入输出口

	// 核心板 LED
	GPIOBank6Pin12PinMuxSetup();          // 核心板FD2  GPIO6[12]
	GPIOBank6Pin13PinMuxSetup();          // 核心板FD1  GPIO6[13]

	// 底板 LED
	// GPIOBank0Pin0PinMuxSetup();
	GPIOBank0Pin1PinMuxSetup();           // 底板GD3  GPIO0[2]
	GPIOBank0Pin2PinMuxSetup();           // 底板GD2  GPIO0[1]
	GPIOBank0Pin5PinMuxSetup();           // 底板GD1  GPIO0[5]
}

/****************************************************************************/
/*                                                                          */
/*              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, 109, GPIO_DIR_OUTPUT);  // GPIO6[12]
//    GPIODirModeSet(SOC_GPIO_0_REGS, 110, GPIO_DIR_OUTPUT);  // GPIO6[13]

    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, 1, GPIO_DIR_OUTPUT);    // D7  GPIO0[0]
//    GPIODirModeSet(SOC_GPIO_0_REGS, 2, GPIO_DIR_OUTPUT);    // D9  GPIO0[1]
//    GPIODirModeSet(SOC_GPIO_0_REGS, 3, GPIO_DIR_OUTPUT);    // D10 GPIO0[2]
//    GPIODirModeSet(SOC_GPIO_0_REGS, 6, GPIO_DIR_OUTPUT);    // D6  GPIO0[5]

    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]

}

/****************************************************************************/
/*                                                                          */
/*              延时                                                        */
/*                                                                          */
/****************************************************************************/
void Delay(unsigned int n)
{
	unsigned int i;

	for(i=n;i>0;i--);
}

这个文件主要是关于创龙的一些开发板的相关管脚复用的配置,而这个文件是没有相对应的.c文件的,它是对一个库函数,就是platform.lib这样一个库函数的一些函数的声明。

/****************************************************************************/
/*                                                                          */
/*              创龙 DSP6748 开发板相关声明                                 */
/*                                                                          */
/*              2014年07月12日                                              */
/*                                                                          */
/****************************************************************************/
#ifndef __TL6748_H__
#define __TL6748_H__

#ifdef __cplusplus
extern "C" {
#endif

/****************************************************************************/
/*                                                                          */
/*              函数声明                                                    */
/*                                                                          */
/****************************************************************************/
extern void UARTPinMuxSetup(unsigned int instanceNum,
                            unsigned int modemCtrlChoice);
extern unsigned int RtcVersionGet(void);
extern void RTCPinMuxSetup(unsigned int alarmPinReqd);
extern void SPI0CSPinMuxSetup(unsigned int csPinNum);
extern void SPI1CSPinMuxSetup(unsigned int csPinNum); 
extern void I2CPinMuxSetup(unsigned int instanceNum);
extern void SPIPinMuxSetup(unsigned int instanceNum);
extern void ConfigRasterDisplayEnable(void);
extern void GPIOBank0Pin0PinMuxSetup(void);
extern void GPIOBank0Pin1PinMuxSetup(void);
extern void GPIOBank0Pin2PinMuxSetup(void);
extern void GPIOBank0Pin5PinMuxSetup(void);
extern void GPIOBank0Pin6PinMuxSetup(void);
extern void GPIOBank6Pin1PinMuxSetup(void);
extern void GPIOBank6Pin12PinMuxSetup(void);
extern void GPIOBank6Pin13PinMuxSetup(void);
extern void EHRPWM0PinMuxSetup(void);
extern void EHRPWM1PinMuxSetup(void);
extern void ECAPPinMuxSetup(unsigned char n);
extern void LIDDDisplayEnable(void);
extern void McASPPinMuxSetup(void);
extern void EMACPinMuxSetup(void);
extern void LIDDPinMuxSetup(void);
extern void LCDPinMuxSetup(void);
extern void NANDPinMuxSetup(void);
extern void EMIFAClkConfig(void);
extern void VPIFPinMuxSetup(void);
extern void RS485PinMuxSetup(void);
extern void AD7606PinMuxSetup(void);
extern void EMACPinMuxRMIISetup(void);

#ifdef __cplusplus
}
#endif
#endif

Platform函数源码是在Platform这个工程中,我们可以打开这个工程,比如说我们现在想要看GPIO口的复用状况,我们打开GPIO.c,可以在这里找到我们关于GPIO口复用的一些函数,比如说main.c,void GPIOBankPinMuxSet(void)函数中的GPIOBank0Pin0PinMuxSetup();函数,我们找到这个函数,可以看到函数的源码。

/****************************************************************************/
/*                                                                          */
/*              创龙 DSP6748 开发板相关函数                                 */
/*                                                                          */
/*              2014年07月12日                                              */
/*                                                                          */
/****************************************************************************/
#include "hw_types.h"

#include "TL6748.h"
#include "soc_C6748.h"
#include "hw_syscfg0_C6748.h"

/****************************************************************************/
/*                                                                          */
/*              宏定义                                                      */
/*                                                                          */
/****************************************************************************/
#define PINMUX1_GPIO0_0_ENABLE    (SYSCFG_PINMUX1_PINMUX1_31_28_GPIO0_0    << \
                                    SYSCFG_PINMUX1_PINMUX1_31_28_SHIFT)
 
#define PINMUX1_GPIO0_1_ENABLE    (SYSCFG_PINMUX1_PINMUX1_27_24_GPIO0_1    << \
                                    SYSCFG_PINMUX1_PINMUX1_27_24_SHIFT)

#define PINMUX1_GPIO0_2_ENABLE    (SYSCFG_PINMUX1_PINMUX1_23_20_GPIO0_2    << \
                                    SYSCFG_PINMUX1_PINMUX1_23_20_SHIFT)

#define PINMUX1_GPIO0_5_ENABLE    (SYSCFG_PINMUX1_PINMUX1_11_8_GPIO0_5     << \
                                    SYSCFG_PINMUX1_PINMUX1_11_8_SHIFT)

#define PINMUX1_GPIO0_6_ENABLE    (SYSCFG_PINMUX1_PINMUX1_7_4_GPIO0_6      << \
                                    SYSCFG_PINMUX1_PINMUX1_7_4_SHIFT)

#define PINMUX19_GPIO6_1_ENABLE   (SYSCFG_PINMUX19_PINMUX19_23_20_GPIO6_1  << \
                                    SYSCFG_PINMUX19_PINMUX19_23_20_SHIFT)

#define PINMUX13_GPIO6_12_ENABLE  (SYSCFG_PINMUX13_PINMUX13_15_12_GPIO6_12 << \
                                    SYSCFG_PINMUX13_PINMUX13_15_12_SHIFT)

#define PINMUX13_GPIO6_13_ENABLE  (SYSCFG_PINMUX13_PINMUX13_11_8_GPIO6_13  << \
                                    SYSCFG_PINMUX13_PINMUX13_11_8_SHIFT)

/****************************************************************************/
/*                                                                          */
/*              管脚复用配置                                                */
/*                                                                          */
/****************************************************************************/
void GPIOBank0Pin0PinMuxSetup(void)
{
     unsigned int savePinmux = 0;

     savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) &
                  ~(SYSCFG_PINMUX1_PINMUX1_31_28));

     HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) =
          (PINMUX1_GPIO0_0_ENABLE | savePinmux);
}

void GPIOBank0Pin1PinMuxSetup(void)
{
    unsigned int savePinmux = 0;

    savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) &
                 ~(SYSCFG_PINMUX1_PINMUX1_27_24));

    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) =
         (PINMUX1_GPIO0_1_ENABLE | savePinmux);
}

void GPIOBank0Pin2PinMuxSetup(void)
{
    unsigned int savePinmux = 0;

    savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) &
                 ~(SYSCFG_PINMUX1_PINMUX1_23_20));

    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) =
         (PINMUX1_GPIO0_2_ENABLE | savePinmux);
}

void GPIOBank0Pin5PinMuxSetup(void)
{
    unsigned int savePinmux = 0;

    savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) &
                 ~(SYSCFG_PINMUX1_PINMUX1_11_8));

    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) =
         (PINMUX1_GPIO0_5_ENABLE | savePinmux);
}

void GPIOBank0Pin6PinMuxSetup(void)
{
    unsigned int savePinmux = 0;

    savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) &
                 ~(SYSCFG_PINMUX1_PINMUX1_7_4));

    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) =
         (PINMUX1_GPIO0_6_ENABLE | savePinmux);
}

void GPIOBank6Pin1PinMuxSetup(void)
{
    unsigned int savePinmux = 0;

    savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(19)) &
                 ~(SYSCFG_PINMUX19_PINMUX19_23_20));

    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(19)) =
         (PINMUX19_GPIO6_1_ENABLE | savePinmux);
}

void GPIOBank6Pin12PinMuxSetup(void)
{
    unsigned int savePinmux = 0;

    savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(13)) &
                 ~(SYSCFG_PINMUX13_PINMUX13_15_12));

    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(13)) =
         (PINMUX13_GPIO6_12_ENABLE | savePinmux);
}

void GPIOBank6Pin13PinMuxSetup(void)
{
    unsigned int savePinmux = 0;

    savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(13)) &
                 ~(SYSCFG_PINMUX13_PINMUX13_11_8));

    HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(13)) =
         (PINMUX13_GPIO6_13_ENABLE | savePinmux);
}

源码:

void GPIOBank0Pin0PinMuxSetup(void)
{
     unsigned int savePinmux = 0;

     savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) &
                  ~(SYSCFG_PINMUX1_PINMUX1_31_28));

     HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) =
          (PINMUX1_GPIO0_0_ENABLE | savePinmux);
}

首先介绍一下HWREG这个宏,我们跳到这个宏的声明,它是在hw_types.h这个文件中声明了,hw是hardware的意思,意思是硬件类型一些声明,这里边有6个宏命令,HWREG是读int型的寄存器,我们在之前的GEL文件中简单介绍过直接通过映射的内存地址来访问寄存器,使用的就是这样一个指针,只不过写成了宏的形式。HWREG(x)读32位的int型,HWREGH(x)读16位的short型,最后一个HWREGB(x)是读8位的char型,在一般情况下,DSP C6748的寄存器都是32位的,所以只会用到HWREG(x)这个宏。
这里需要注意的是,下面还有3个宏命令,这3个我们是不能够使用的,它主要是对于TI的cortex M3\M4系列的单片机来说的,在之前TI并没有cortex M3\M4的单片机,TI是通过收购一家luminary(流明诺瑞)的公司,在它的公司有一个比较经典的产品就是群星系列Stellaris,所以那一个系列的单片机都叫LM3S系列,后来TI把这个公司收购以后就使用了它的一些代码,实际上这些,包括startware中的一些函数的书写风格都是跟LM3S系列单片机群星的库是非常类似的,包括图形库和USB库,都是移植到C6748上的,如果之前用过LM3S系列单片机的话,对于这些函数的使用会非常熟悉,或者说非常有亲切感。下面3中宏就是为cortex M3\M4单片机使用的,因为它支持这样一种方式,它有一段区域是支持直接按位来进行读写的,就是注释中所说的bit-band region这样一个区域,使用下边这3个宏命令来对这个区域的内存进行读写只需要1条指令,就是直接读或者直接写,而在一般情况下,我们按位操作都是先把寄存器的值读出来,然后再修改,最后再写入,因为DSP C6748中没有这样一个可以按位操作的内存区域,所以我们只能使用前3个宏,而且一般情况下对于32位寄存器来说,我们只使用HWREG(x)这个宏命令。

//*****************************************************************************
//
// Macros for hardware access, both direct and via the bit-band region.
//
//*****************************************************************************
#define HWREG(x)                                                              \
        (*((volatile unsigned int *)(x)))
#define HWREGH(x)                                                             \
        (*((volatile unsigned short *)(x)))
#define HWREGB(x)                                                             \
        (*((volatile unsigned char *)(x)))
#define HWREGBITW(x, b)                                                       \
        HWREG(((unsigned int)(x) & 0xF0000000) | 0x02000000 |                \
              (((unsigned int)(x) & 0x000FFFFF) << 5) | ((b) << 2))
#define HWREGBITH(x, b)                                                       \
        HWREGH(((unsigned int)(x) & 0xF0000000) | 0x02000000 |               \
               (((unsigned int)(x) & 0x000FFFFF) << 5) | ((b) << 2))
#define HWREGBITB(x, b)                                                       \
        HWREGB(((unsigned int)(x) & 0xF0000000) | 0x02000000 |               \
               (((unsigned int)(x) & 0x000FFFFF) << 5) | ((b) << 2))

下面就以GPIOBank0Pin0PinMuxSetup(void)讲解一下这个是怎么实现的,这里最主要用到的一个宏命令就是刚才说的HWREG(x),也就是对寄存器的读写的命令。对寄存器按位进行读写,首先是读回来,然后修改,最后再写回去。这个函数执行的也是这样一个操作,首先是读回来,不过在读回来呢执行了一个小小的额外的操作,就是将我们需要的那几位置0,在等号的右边首先是HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1))这个寄存器的值先读回来,然后跟这个值~(SYSCFG_PINMUX1_PINMUX1_31_28)按位与,这样就把我们要修改的那4位的值配置为0,而其他位不变,保存在savePinmux这个变量中。

void GPIOBank0Pin0PinMuxSetup(void)
{
     unsigned int savePinmux = 0;

     savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) &
                  ~(SYSCFG_PINMUX1_PINMUX1_31_28));

     HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) =
          (PINMUX1_GPIO0_0_ENABLE | savePinmux);
}

为什么是4位呢?我们看一下Pin Multiplexing这个寄存器,从这张寄存器的域的表可以看出,对于每一个管脚的配置都是由4位来进行配置的,所以刚刚那个宏的作用就是将需要修改的4位全部置0,额外看一下,它的有效值可以选0、1h、2h、4h、8h,如果我们想把这个IO口配置成普通的IO口,GPIO0[0]的话,我们给这4位寄存器赋值为8就可以了。
在这里插入图片描述
然后就执行修改和写回去,在这个赋值的等号右边就是对它的值修改,将我们保存回来的值savePinmux跟这一个宏PINMUX1_GPIO0_0_ENABLE进行一个或的操作,我们前边也说过,如果要将某一个变量的某几位的值置1的话,就将它跟一个值进行或的操作,我们看一下这个宏,这个宏是由SYSCFG_PINMUX1_PINMUX1_31_28_GPIO0_0:(0x00000008u)进行移位操作来实现的,而移位这个值是SYSCFG_PINMUX1_PINMUX1_31_28_SHIFT:(0x0000001Cu)也就是十进制的28,为什么是28呢?可以看一下数据手册,对于GPIO0[0]这个配置寄存器,它所在的位就是第28位到31位,所以要将我们要赋值的8,也就是我们需要将它配置为GPIO口,就需要将这4位配置为8,我们将这4位移位28位移位到我们需要赋值的位,然后再跟刚刚保存下的值进行或的操作,然后就将8赋值给了相应的位,然后再把或的结果最后写到寄存器里,然后就完成了管脚复用的配置。

#define PINMUX1_GPIO0_0_ENABLE    (SYSCFG_PINMUX1_PINMUX1_31_28_GPIO0_0    << \
                                    SYSCFG_PINMUX1_PINMUX1_31_28_SHIFT)

可以看到在hw_syscfg0_C6748.h文件中对于每一个管脚的功能及相应配置的值都写了出来。其实比较好奇这个hw_syscfg0_C6748.h文件是自动生成的还是手工写的,如果要是手工写的话,工作量还挺大的。在startware里对于管脚复用都是使用这样的配置。当然也可以简单的使用HWREG(x)对某一个寄存器来整体赋值。这就是管教复用配置。
如果拿到早期版本的例程的话,可能会有这样一个文件,就是main.h文件,在新版的例程中,为了跟TI的书写风格统一,对于管脚复用的函数全部重写了,而且写成了TI在startware库中的风格,保持了一致。
main.h是自己写的一些关于C6748芯片的寄存器定义,只写了一部分,主要是SYSCFG寄存器和一些GPIO以及uPP,mcbsp寄存器的一些值,写成结构体的形式是方便直接对寄存器操作,当然在实际编译完成后,所执行的也是先读回来,然后修改,最后写入,不过这就是编译以后的事了,我们在执行的时候只需要对相应的寄存器进行操作就可以了。

通过结构体访问成员变量来设置寄存器的值,后期为了和TI的风格统一,改成了使用移位加掩码的方式来配置管脚复用,根据个人喜好不同,也可以使用main.h文件进行配置。

在cmd文件中对SYSCFG0分配了一个.Reg_SYSCFG0段。

SYSCFG0       o = 0x01C14000    l = 0x00001000  /* 4K    SYSCFG0 */

    .Reg_SYSCFG0    >  SYSCFG0       

然后在main.h中

// SYSCFG0存储空间映射
#pragma DATA_SECTION(SYSCFG0Regs,".Reg_SYSCFG0");
volatile struct hw_SYSCFG0Regs SYSCFG0Regs;

在CCS的Expressions工具栏下添加SYSCFG0Regs这个变量的值,双击Expressions使界面最大化,可以看到SYSCFG0Regs的起始地址就是0x01C14000,数据手册中SYSCFG寄存器的起始地址就是0x01C14000,通过cmd文件和DATA_SECTION这个预编译指令将我们定义一个变量的值来分配到系统的寄存器空间,这样对于变量值的改写就相当于对寄存器的值进行改写。

简单说一下,以下省略部分。。。。

在这里插入图片描述

12-3 输入输出模式

讲解怎么配置GPIO口的输入输出模式
在这里插入图片描述
既然叫GPIO口,那么它就既可以当输入的端口使用也可以当输出的端口使用,在上一部分视频教程中,已经讲过了最初的两个部分,首先通过PSC模块使能外设,然后需要进行管脚复用配置,将我们选定的几个GPIO口的功能配置为普通的GPIO口,当然这个关于外设使能和管脚复用没有完全的先后顺序。
在这之后需要配置管脚的方向,它到底是作为输入管脚来使用还是作为输出管脚来使用。如果配置了输入方向的话,每次只需要通过IN_DATA读取管脚的状态就可以了。如果我们将这个管脚配置成了输出模式,我们就有多种方式来改变它的状态,这也是DSP C6748的一大特点,也就是对它的置位操作、清零操作、输出操作是3个独立的寄存器来控制的,我们可以通过给相应的SET_DATA位置1来将GPIO口的输出状态驱动为高电平,也可以将相应的CLR_DATA位置1来将相应的管脚状态驱动为低电平,这里需要注意的是对于这两个寄存器相应的位需要的是写1,不管是SET还是CLR都是写1的。对于OUT_DATA这个寄存器就很好理解了,我们要让它输出1,就将寄存器相应管脚的那一位写1,如果要输出0就写0就可以了。同时,我们也可以读取这3个寄存器的值来判断当前IO口相应管脚的工作状态。这里需要注意的是对于DSP C6748 GPIO口来说,我们单可以使用它的1个IO口,也可以将一组IO口也就是GPIO Bank来整体使用。这里需要注意的一个小问题的话,如果我想知道这个IO口实际输入的值的话,也就是说这个IO口除了要对外输出,可能外部的设备也要给它一个相应的值的话,我们仍然需要读取IN_DATA这个寄存器来获取IO口实际的值。当然如果使用startware函数库的话,根本不需要考虑这些寄存器该怎么配置,只需要调取相应的库就可以了。这里顺带提一下,对于DSP C6748来说,TI官方没有为它提供CSL库,也就是Chip Support Library,但是TI给它提供了CSLR,之前也说过CSLR只是对一些寄存器的定义,如果要使用CSLR的话,在安装的PDK包里就包含了,使用CSLR主要也是通过对寄存器的读写,使用FILT类似的宏,它的功能跟我们前边讲过的HWREG宏是一样的,所以我们使用startware库还是相对方便,因为它不仅可以实现直接寄存器的读写,也可以为我们提供基于函数的方式来控制相应的外设。

在一下跟GPIO口有关的配置输入/输出模式的几个函数。
在这里插入图片描述
一共只有5个函数

// 管脚方向配置,设置GPIO口作为输入口还是输出口
// baseAdd: 模块基地址,这个基地址是固定的,就是SOCGPIO这个基地址
// pinNumber: 管脚号,从GPIO Bank0[0]管脚一直到GPIO Bank8[15]管脚,这里需要注意的是,对于这个参数的赋值是从1开始的,也就是GPIO Bank0[0]对应的值是1,而GPIO Bank8[15]对应的值是144
// pinDir: 配置管脚的方向是输入还是输出,这里需要注意的是对于DSP C6748的GPIO口来说,在它上电的时候,默认的IO口大部分都是输入方向的,如果要将它作为输入方向必须要执行这个函数进行配置,当然建议即使作为输入方向,也需要配置一下,这样可以使程序更严谨,因为有些IO口在上电后的状态是不确定的。
void GPIODirModeSet(unsigned int baseAdd, unsigned int pinNumber, unsigned int pinDir);
// 读取方向,主要功能是读取这个GPIO口的方向
unsigned int GPIODirModeGet(unsigned int baseAdd, unsigned int pinNumber);
// 设置完方向后对IO口进行读写
// 写函数,参数和前面相同,
void GPIOPinWrite(unsigned int baseAdd, unsigned int pinNumber, unsigned int bitValue);
// 读,函数返回一个int型变量
int GPIOPinRead(unsigned int baseAdd, unsigned int pinNumber);
// 可以对一个GPIO Bank中的某一个管脚输出高电平,而另一个管脚输出低电平
// setPins:需要置1的管脚,取值范围GPIO_BANK_PIN_n:0~15
// clrPins:需要置0的管脚,取值范围GPIO_BANK_PIN_n:0~15
void GPIOBankPinsWrite(unsigned int baseAdd, unsigned int bankNumber, unsigned int setPins, unsigned int clrPins);

baseAdd:对于DSP C6748来说一共有144个GPIO口,但是它被分为了GPIO Bank0~GPIO Bank8,使用一个固定的基地址会不会不方便,但是根据对于函数库里的函数原型来说,必须使用这样一个地址才能访问,否则就要自己修改相应的函数。

以GPIO_LED这个例程看怎么操作的。
以下讲解程序内容省略。。。。。。

可以使用CCS的快捷键进行注释
多行//注释方法
注释:Ctrl+/ 取消注释:Ctrl+/
多行/* */注释方法
注释:Ctrl+Shift+/

// 可以对一个GPIO Bank中的某一个管脚输出高电平,而另一个管脚输出低电平
// setPins:需要置1的管脚,取值范围GPIO_BANK_PIN_n:0~15
// clrPins:需要置0的管脚,取值范围GPIO_BANK_PIN_n:0~15
void GPIOBankPinsWrite(unsigned int baseAdd, unsigned int bankNumber, unsigned int setPins, unsigned int clrPins);
// 例子,放在GPIO_LED中,可以实现对一个管脚置位,一个管脚清0
GPIOBankPinsWrite(SOC_GPIO_0_REGS, 0, GPIO_BANK_PIN_0, GPIO_BANK_PIN_2);

12-4 中断

在这里插入图片描述首先使能外设,然后配置管脚复用,之后将相应的管脚方向配置为输入,这里需要注意的一点是,GPIO口在上电之后大部分IO的默认状态就是输入状态,所以可以不必专门配置,为了严谨,还是要将相应的管脚配置为输入方向,然后使能GPIO Bank中断,需要注意的是,我们的DSP C6748一共有144个IO口,这144个IO口分为GPIO Bank0到GPIO Bank8这几组Bank,而中断事件最多只有127个,所以在C6748的中断系统中,是以Bank为单位产生中断的,所以在这里需要使能相应的GPIO Bank中断,然后设置相应管脚的中断触发类型,包括上升沿触发,下降沿触发以及上升沿下降沿触发,以及无触发类型,这里需要注意的是DSP C6748的GPIO口只支持边沿触发的方式,所以我们要通过边缘触发的话必须要指定一种触发类型,如果不指定触发类型的话,只能通过查询相应GPIO口输入状态位来判断当前GPIO口的电平状态。之后我们就需要映射中断并注册中断服务函数,最后使能DSP全局中断,这样的话我们整个GPIO口的中断流程就完成了。

在驱动库中跟GPIO中断相关的一些函数:
在这里插入图片描述

// 设置中断类型,设置单一GPIO管脚的中断触发类型
// 类型分为:上升沿、下降沿、上升沿及下降沿、无边沿触发
void GPIOIntTypeSet(unsigned int baseAdd, unsigned int pinNumber, unsigned int intType);
// 读取中断类型
unsigned int GPIOIntTypeGet(unsigned int baseAdd, unsigned int pinNumber);
// 查询某一个GPIO管脚的中断状态
// 这里需要注意的是,C6748的中断事件是以Bank为单位来决定这一组Bank GPIO口的中断状态,所以在进入GPIO中断服务函数以后,需要通过GPIOPinIntStatus函数来判断到底是由GPIO Bank哪一个管脚触发的中断,所以需要做一个判断
unsigned int GPIOPinIntStatus(unsigned int baseAdd, unsigned int pinNumber);
// 清除相应的管脚中断
void GPIOPinIntClear(unsigned int baseAdd, unsigned int pinNumber);
// 使能中断
void GPIOBankIntEnable(unsigned int baseAdd, unsigned int bankNumber);
// 禁用中断
void GPIOBankIntDisable(unsigned int baseAdd, unsigned int bankNumber);

baseAdd:GPIO的基地址是一个固定的值,不需要改变,后边的参数如果是管脚号,管脚号是从1开始的,数字范围是从1到144。

以两个例程讲解C6748中中断的使用。
按键中断GPIO_KEY例程
在需要使用GPIO口的时候引用gpio.h头文件,使用中断的话要引用interrupt.h头文件。先从主函数中看起,如果在函数中调用了某一个函数,需要对函数先做声明。如果函数中被调用的函数的函数体写在了函数前面,就不需要再做额外声明了。

中断事件详情请参考
TMS320C6748 DSP Technical Reference Manual 83页-86页

/****************************************************************************/
/*                                                                          */
/*              GPIO 管脚中断初始化                                         */
/*                                                                          */
/****************************************************************************/
void GPIOBankPinInterruptInit(void)
{
    // 底板按键中断
    // 配置 USER0 KEY GPIO0[6] 为下降沿触发
    GPIOIntTypeSet(SOC_GPIO_0_REGS, 7, GPIO_INT_TYPE_FALLEDGE);     // 底板SW5  USER0 KEY GPIO0[6]
    // 配置 USER1 KEY GPIO6[1] 为上升沿及下降沿触发
    GPIOIntTypeSet(SOC_GPIO_0_REGS, 98, GPIO_INT_TYPE_BOTHEDGE);    // 底板SW6  USER1 KEY GPIO6[1]

    // 使能 GPIO BANK 中断
    GPIOBankIntEnable(SOC_GPIO_0_REGS, 0);                  // USER0 KEY GPIO0
    GPIOBankIntEnable(SOC_GPIO_0_REGS, 6);                  // USER1 KEY GPIO6

	// 注册中断服务函数
	IntRegister(C674X_MASK_INT4, USER0KEYIsr);
	IntRegister(C674X_MASK_INT5, USER1KEYIsr);

	// 映射中断到 DSP 可屏蔽中断
	IntEventMap(C674X_MASK_INT4, SYS_INT_GPIO_B0INT);
	IntEventMap(C674X_MASK_INT5, SYS_INT_GPIO_B6INT);

	// 使能 DSP 可屏蔽中断
	IntEnable(C674X_MASK_INT4);
	IntEnable(C674X_MASK_INT5);
}

映射中断到 DSP 可屏蔽中断:DSP C6748或者说所有的C6000系列DSP一共有4到15这几个可屏蔽中断,中断优先级是4最高,15最低。

中断服务函数内容:

/****************************************************************************/
/*                                                                          */
/*              中断服务函数                                                */
/*                                                                          */
/****************************************************************************/
void USER0KEYIsr(void)
{
	// 软件断点 方便调试
	// SW_BREAKPOINT;

    // 禁用 GPIO BANK 0 中断
    GPIOBankIntDisable(SOC_GPIO_0_REGS, 0);

    // 清除 GPIO BANK 0 中断状态
    IntEventClear(SYS_INT_GPIO_B0INT);
    // 最重要的一点,使用GPIOPinIntStatus判断是不是GPIO0[6]这个IO产生的中断
    // 如果在一个GPIO Bank中有多个管脚要相应中断事件的话,要做一个判断,到底是哪个管脚产生了中断事件
    if(GPIOPinIntStatus(SOC_GPIO_0_REGS, 7) == GPIO_INT_PEND)
    {
		// 清除 GPIO0[6] 中断状态
		GPIOPinIntClear(SOC_GPIO_0_REGS, 7);
        // 清除LED循环闪烁标志位
		Flag = 0;
		// 控制台打印: Stop flashing!
		printf("Stop flashing!\n");
    }

	// 使能 GPIO BANK 0 中断
    GPIOBankIntEnable(SOC_GPIO_0_REGS, 0);
}

void USER1KEYIsr(void)
{
	// 软件断点 方便调试
	//SW_BREAKPOINT;

    // 禁用 GPIO BANK 6 中断
    GPIOBankIntDisable(SOC_GPIO_0_REGS, 6);

    // 清除 GPIO BANK 6 中断状态     // 清除系统事件状态
    IntEventClear(SYS_INT_GPIO_B6INT);
    
	// 最重要的一点,使用GPIOPinIntStatus判断是不是GPIO6[1]这个IO产生的中断
    // 如果在一个GPIO Bank中有多个管脚要相应中断事件的话,要做一个判断,到底是哪个管脚产生了中断事件
    if(GPIOPinIntStatus(SOC_GPIO_0_REGS, 98) == GPIO_INT_PEND)
    {
		// 清除 GPIO6[1] 中断状态    // 清除相应的GPIO外设管脚状态
		GPIOPinIntClear(SOC_GPIO_0_REGS, 98);
		// 设置LED循环闪烁标志位
		Flag = 1;
		// 控制台打印: Start flashing!
		printf("Start flashing!\n");
    }

	// 使能 GPIO BANK 6 中断
    GPIOBankIntEnable(SOC_GPIO_0_REGS, 6);
}
    // 清除 GPIO BANK 6 中断状态     // 清除系统事件状态
    IntEventClear(SYS_INT_GPIO_B6INT);
// 和
		// 清除 GPIO6[1] 中断状态    // 清除相应的GPIO外设管脚状态
		GPIOPinIntClear(SOC_GPIO_0_REGS, 98);

以上两行代码,即使不对它做清除也不会影响到下一次中断的产生,这里需要注意的是,针对这个例程,去掉这两句话没有任何问题,但是如果这个程序比较复杂,比如说这个管脚的中断状态在其他的程序流程中也需要来判断的话,如果不清除这个事件的话,相应的标志位就会一直为1,这样的话,在程序的其他流程中,如果要做判断的话,得不到正确的结果。所以还是建议执行这两句操作。

关于以下两句:

    // 禁用 GPIO BANK 0 中断
    GPIOBankIntDisable(SOC_GPIO_0_REGS, 0);
    // 和
    // 使能 GPIO BANK 0 中断
    GPIOBankIntEnable(SOC_GPIO_0_REGS, 0);

一般情况下这两句也不是必须的,但是有一个问题需要注意,比如说我们将GPIO口的中断类型设置为双边沿触发,也就是上升沿和下降沿都触发一次中断,如果当我的按键按下的时候会产生一个下降沿,这个时候会进入一次中断服务函数,如果在中断服务函数中禁用的相应的Bank中断,那么在按键释放,也就是弹起来的时候所产生的上升沿就不会再触发这个中断了。这是什么意思呢?也就是说如果我们对这个按键没有做硬件防抖的措施的话,我们可以在中断服务函数禁用之前关闭相应的Bank中断,这样的话就不会因为按键抖动的原因来多次进入中断服务函数了。
这里需要注意的是,因为我们的两个按键位于不同的GPIO Bank,所以在使用这两个中断的时候占用了两个中断,一个是可屏蔽中断4,一个是可屏蔽中断5,但是就像我们在讲中断那一部分的时候说过,如果我们的中断不够用了,比如说对于所有的C6000系列的DSP来说,它一共只有4到15这几个可屏蔽中断,如果我们产生的中断很多怎么办呢?那么就需要用到中断组合事件,当然这只是中断组合事件的一个应用的理由,还有一个理由就是如果我们的两个事件之间满足一个或的关系,也可以使用中断组合事件。
下面就看一下GPIO_KEY_TIMER_EventCombine这个例程,它的主要功能是演示按键及定时器中断组合事件
主要讲一下关于组合事件的配置,

/****************************************************************************/
/*                                                                          */
/*              主函数                                                      */
/*                                                                          */
/****************************************************************************/
int main(void)
{
	// 外设使能配置
	PSCInit();
	
	// GPIO 管脚复用配置
	GPIOBankPinMuxSet();

	// GPIO 管脚初始化
	GPIOBankPinInit();

	// DSP 中断初始化
	InterruptInit();

	// 组合事件中断初始化
	EventCombineInterruptInit();

	// 定时器 / 计数器初始化
	TimerInit();

	// 主循环
	for(;;)
	{

	}
}

看一下组合事件中断初始化这个函数:

/****************************************************************************/
/*                                                                          */
/*              组合事件中断初始化                                          */
/*                                                                          */
/****************************************************************************/
void EventCombineInterruptInit(void)
{
    // 底板按键中断
    // 配置 USER1 KEY GPIO6[1] 为上升沿及下降沿触发
    GPIOIntTypeSet(SOC_GPIO_0_REGS, 98, GPIO_INT_TYPE_BOTHEDGE);

    // 使能 GPIO BANK 中断
    GPIOBankIntEnable(SOC_GPIO_0_REGS, 6);                  // USER1 KEY GPIO6

	// 使能 定时器 / 计数器 中断
	TimerIntEnable(SOC_TMR_1_REGS, TMR_INT_TMR34_NON_CAPT_MODE);

	// 映射中断到 DSP 可屏蔽中断
	IntEventCombineInit(ECM0_UNUSED, C674X_MASK_INT4, ECM2_UNUSED, ECM3_UNUSED);

	// 注册中断服务函数
    IntEventCombineRegister(SYS_INT_GPIO_B6INT, USER1KEYIsr);
    IntEventCombineRegister(SYS_INT_T64P1_TINT34, TimerIsr);

	// 添加事件
	IntEventCombineAdd(SYS_INT_GPIO_B6INT);
	IntEventCombineAdd(SYS_INT_T64P1_TINT34);
}

以下是不同的地方,我们需要将组合事件映射中断到DSP的中断,在这里,组合事件一共有(ECM0_UNUSED, C674X_MASK_INT4, ECM2_UNUSED, ECM3_UNUSED),分别为0、1、2、3这4个组合事件

	// 映射中断到 DSP 可屏蔽中断
	IntEventCombineInit(ECM0_UNUSED, C674X_MASK_INT4, ECM2_UNUSED, ECM3_UNUSED);

我们将其中的组合事件1映射到了C6748的可屏蔽中断4(C674X_MASK_INT4),为什么要这样选择呢?我们来看一下DSP C6748的数据手册,这里查看TMS320C674x DSP Megamodule Reference Guide (Rev. A).pdf手册,当中的中断这一章节
在这里插入图片描述
可以看出C674x一共有EVT0、EVT1、EVT2、EVT3这4个组合事件,它每一个组合事件对应的相应的我们单一事件的某几个事件,比如说EVT0对应的就是EVT4到EVT31,这是什么意思呢?意思就是说,对于组合事件0来说,最多允许事件4、事件5、事件6一直到事件31这些事件同时产生中断,当然我们也可以通过相应的中断屏蔽来屏蔽我们的一些不需要产生中断的事件来只保留我们需要产生组合事件的中断的事件,比如说我选择了事件4和事件15,而将其他事件都屏蔽掉,那么我们当事件4或事件15有一个事件被触发的时候,都会触发一个相应的组合事件的中断,对于后面3个组合事件也是同样的道理。
也就是说我们不能把事件4和事件63来作为一个组合中断或者说组合事件来产生,只能是我们位于某一个组合事件所对应的一些单一事件。就像EVT0对应EVT4到EVT31,EVT1对应EVT32到EVT63,EVT2对应EVT64到EVT95,EVT3对应EVT96到EVT127,那么这些事件到底代表什么意思呢?可以看一下TMS320C6748 DSP Technical Reference Manual (Rev. A).pdf
在这里插入图片描述
在这个表格中说明了某个事件所对应的产生事件的源,可以看到默认EVT0到EVT3事件是给组合事件来使用的,而从4到127是可以供我们所选择的一些外设或者是内部的事件。
在我们的这个例程中,我们需要将GPIO Bank6和定时器1来作为一个组合事件来处理,所以我们来看一下这张表格
在这里插入图片描述
可以看到GPIO Bank6的中断事件的事件号是62
在这里插入图片描述
T64P1_TINT34的中断事件是48
T64P1_TINT12的中断事件是40,不管40、48还是62,它们都位于组合事件1所能产生中断事件的范围内,也就是位于EVT32到EVT63之间,包括32和63,所以我们就可以将GPIO Bank6的中断事件和定时器1的中断事件来做一个组合事件。因为我们只用到了这一个组合事件,所以我们将它分配给可屏蔽中断4就可以了,而对于其他3个组合事件,我们不使用,所以使用UNUSED这个宏就可以了。

然后我们分别为两个事件来注册相应的中断服务函数

	// 注册中断服务函数
    IntEventCombineRegister(SYS_INT_GPIO_B6INT, USER1KEYIsr);
    IntEventCombineRegister(SYS_INT_T64P1_TINT34, TimerIsr);

最后我们再将这两个事件添加到组合事件当中

	// 添加事件
	IntEventCombineAdd(SYS_INT_GPIO_B6INT);
	IntEventCombineAdd(SYS_INT_T64P1_TINT34);

这里需要说一下,在我们注册中断服务函数到添加事件的时候,我们startware函数库已经为我们做了屏蔽相应事件,也就是说除了我们添加的这两个事件,其他的事件都是处于屏蔽状态的,也就是说其他事件的触发不会产生中断的,这个是由于库函数已经自动为我们做了相应的处理。所以,当然,在库函数中还为我们使能了相应中断,所以在这里不需要手动来添加使能中断的语句了。

组合事件是怎样一个流程呢?
首先是CPU检测到这个组合事件所有的子事件有任何一个子事件产生或者说被触发,都触发这个中断。这里需要注意的是,这些事件的关系是或的关系,也就是说任何一个事件被触发都会触发相应的中断,然后就是startware中的库函数来匹配相应的中断事件号,来找到我们所注册的中断服务函数,然后跳转到相应的中断服务函数来执行相应的语句。这就是跟我们使用普通事件来触发中断的一些区别。

这里有一个非常重要的内容要提醒大家。
就是在使用startware库中的中断管理的库函数的时候,一定不要为自己的中断服务函数添加interrupt这个关键字,你可能使用过其他的CPU在编程的时候会使用interrupt这个关键字,这个关键字的主要功能是告诉编译器或者编译工具链在我的函数返回的时候添加一个返回指令,比如说对于C6748或者说所有的C6000系列DSP来说,在中断服务函数返回的时候会执行BIRP,或者说BNRP这样一个指令,主要作用就是返回到我们正常的程序流程中,如果不添加这个关键字就没有这样一个指令,但是我们在使用startware的库函数来管理中断的时候,它会在库函数中为我们添加了这条代码,或者说是在库函数中已经使用了这个关键字修饰,所以在我们自己的函数中一定不能再使用这个关键字再修饰,否则会导致中断出现不可预知的错误。

你可能会有疑问,在讲解中断的时候会提到中断向量表这样一个概念,中断向量表主要是我们中断函数的一些入口,那么可能会发现在这两个例程中自始至终没有对中断向量表执行任何的操作,那么是怎么实现的呢?
下面就简单介绍一下startware中关于中断的一些相关函数,解答一下这个问题。

打开startware的安装路径
在这里插入图片描述
system_config目录,这个目录就是包含system config库函数的源文件,注意是源文件,这个库函数主要有两个功能,一个是缓存的管理,另一个就是我们所说的中断的管理,可以看到源文件比较简单,只有3个源文件,cache.c是缓存相关的,另外两个interrupt.c和intvecs.asm就是和中断有关的
在这里插入图片描述
interrupt.c是跟中断相关的函数,intvecs.asm就是我们要说的中断向量表,打开intvecs.asm

;
; File: intvecs.asm
;
; Brief: Contains interrupt vector table and fetch packets
;
; Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
; ALL RIGHTS RESERVED

;**********************************************************
;				Global Symbols
;**********************************************************
	.global _intcVectorTable
	.global _c_int00
	.global _c674x_nmi_isr
	.global _c674x_rsvd_int2_isr
	.global _c674x_rsvd_int3_isr
	.global _c674x_mask_int4_isr
	.global _c674x_mask_int5_isr
	.global _c674x_mask_int6_isr
	.global _c674x_mask_int7_isr
	.global _c674x_mask_int8_isr
	.global _c674x_mask_int9_isr
	.global _c674x_mask_int10_isr
	.global _c674x_mask_int11_isr
	.global _c674x_mask_int12_isr
	.global _c674x_mask_int13_isr
	.global _c674x_mask_int14_isr
	.global _c674x_mask_int15_isr

;**********************************************************
;				Interrupt Fetch Packet
;**********************************************************
VEC_ENTRY .macro addr
	STW B0,*--B15
	MVKL addr,B0
	MVKH addr,B0
	B B0
	LDW *B15++,B0
	NOP 2
	NOP
	NOP
	.endm

;**********************************************************
;				Interrupt Vector Table
;**********************************************************
	.align 1024
_intcVectorTable:
	VEC_ENTRY _c_int00
	VEC_ENTRY _c674x_nmi_isr
	VEC_ENTRY _c674x_rsvd_int2_isr
	VEC_ENTRY _c674x_rsvd_int3_isr
	VEC_ENTRY _c674x_mask_int4_isr
	VEC_ENTRY _c674x_mask_int5_isr
	VEC_ENTRY _c674x_mask_int6_isr
	VEC_ENTRY _c674x_mask_int7_isr
	VEC_ENTRY _c674x_mask_int8_isr
	VEC_ENTRY _c674x_mask_int9_isr
	VEC_ENTRY _c674x_mask_int10_isr
	VEC_ENTRY _c674x_mask_int11_isr
	VEC_ENTRY _c674x_mask_int12_isr
	VEC_ENTRY _c674x_mask_int13_isr
	VEC_ENTRY _c674x_mask_int14_isr
	VEC_ENTRY _c674x_mask_int15_isr

可以看到它是一个.asm格式的文件,这个文件就是汇编源文件,这个源文件中定义了一些符号以及执行一些指令。这里需要注意这些符号:

;**********************************************************
;				Interrupt Vector Table
;**********************************************************
	.align 1024
_intcVectorTable:
	VEC_ENTRY _c_int00
	VEC_ENTRY _c674x_nmi_isr
	VEC_ENTRY _c674x_rsvd_int2_isr
	VEC_ENTRY _c674x_rsvd_int3_isr
	VEC_ENTRY _c674x_mask_int4_isr
	VEC_ENTRY _c674x_mask_int5_isr
	VEC_ENTRY _c674x_mask_int6_isr
	VEC_ENTRY _c674x_mask_int7_isr
	VEC_ENTRY _c674x_mask_int8_isr
	VEC_ENTRY _c674x_mask_int9_isr
	VEC_ENTRY _c674x_mask_int10_isr
	VEC_ENTRY _c674x_mask_int11_isr
	VEC_ENTRY _c674x_mask_int12_isr
	VEC_ENTRY _c674x_mask_int13_isr
	VEC_ENTRY _c674x_mask_int14_isr
	VEC_ENTRY _c674x_mask_int15_isr

它就是对于C6000系列DSP或者说是C6748来说的一些中断函数的函数名,因为我们的C语言中的函数如果要在汇编中调用的话,需要在前边加下划线,可以看到这张表格的顺序就是按优先级来排列的。
优先级最高的是C语言的初始化函数:c_int00,它的优先级为0,然后就是不可屏蔽中断函数:c674x_nmi_isr,它的优先级为1,之后就是可屏蔽中断,中间

	VEC_ENTRY _c674x_rsvd_int2_isr
	VEC_ENTRY _c674x_rsvd_int3_isr

为2个保留的位置,这两个位置不对应任何的中断,从第4个开始才是我们的可屏蔽中断,一共占用4到15。

再看一下interrupt.c这个源文件

/******************************************************************************
**                      EXTERNALLY DEFINED FUNCTIONS
******************************************************************************/
#ifdef __TI_EABI__
extern void _intcVectorTable (void);
#else
extern void intcVectorTable (void);
#endif

首先这里引用了中断向量表,在这个源文件中主要就是像初始化DSP中断控制器:void IntDSPINTCInit (void),在这里主要的功能就是把我们中断向量表的地址来赋值给相应的寄存器,

/******************************************************************************
**                      API INTERRUPT FUNCTIONS
******************************************************************************/
/**
 * \function IntDSPINTCInit
 *
 * \brief    This API is used to setup the DSP Interrupt Controller (INTC)
 *           and should be called before using the DSP INTC. All CPU
 *           maskable interrupts will be disabled after calling this API and
 *           the user should proceed to setup the required interrupts for
 *           processing.
 *
 * \param    None
 *
 * \return   None
 */
 void IntDSPINTCInit (void)
{
    unsigned int step = 0;

    /* Set ISRs to default "do-nothing" routine */
    while(step != C674X_INT_COUNT)
        c674xISRtbl[step++] = IntDefaultHandler;

    /* Set interrupt service table pointer to the vector table */
#ifdef __TI_EABI__
    ISTP = (unsigned int)_intcVectorTable;
#else
    ISTP = (unsigned int)intcVectorTable;
#endif

    /* Clear pending CPU maskable interrupts (if any) */
    ICR = 0xFFF0;

    /* Enable NMIE bit to allow CPU maskable interrupts */
    IER = (1 << C674X_NMI);
}

这里需要注意的是,像ISTP、ISTP、ICR、IER这些中断相关的寄存器,它是位于C6748的核心寄存器中,什么意思呢?也就是说这些寄存器我们不能通过内存映射的地址来访问的,我们可以使用一个关键字叫create_register也就是c_register这样一个关键字来创建这些寄存器,但是我们也可以通过引用c6x.h这个头文件,在这个头文件中为我们预先做了一些声明,所以我们就可以直接使用相应的名字来访问这些寄存器。
可以看到在初始化DSP中断控制器主要执行的就是将中断向量表的地址赋值给ISTP

/* Set interrupt service table pointer to the vector table */
#ifdef __TI_EABI__
    ISTP = (unsigned int)_intcVectorTable;
#else
    ISTP = (unsigned int)intcVectorTable;
#endif

然后清除所有可能存在的中断标志

    /* Clear pending CPU maskable interrupts (if any) */
    ICR = 0xFFF0;

然后使能不可屏蔽中断

    /* Enable NMIE bit to allow CPU maskable interrupts */
    IER = (1 << C674X_NMI);
}

这里需要注意的是,在之前也提到过,如果不可屏蔽中断被禁用的话,所有的可屏蔽中断也不会响应,所以必须要使能不可屏蔽中断。

然后就是中断注册这个函数

/**
 * \function IntRegister
 *
 * \brief    Registers an interrupt service routine in the interrupt
 *           vector table for CPU maskable interrupts, NMI, or 
 *           reserved interrupts.
 *
 * \param    cpuINT - CPU maskable interrupt number (4-15), NMI (1),
 *           or reserved interrupt (2-3)
 * \param    userISR - Function pointer to the ISR
 *
 * \return   None
 */
void IntRegister (unsigned int cpuINT, void (*userISR)(void))
{
    /* Check the CPU maskable interrupt number */
    ASSERT(((cpuINT >= 1) && (cpuINT <= 15)));
    
    /* Assign the user's ISR to the CPU maskable interrupt */
    c674xISRtbl[cpuINT] = userISR;
}

回头看一下这个代码,在我们的例程中是调用这个函数来注册中断服务函数,先看一下按键中断GPIO_KEY这个例程

/****************************************************************************/
/*                                                                          */
/*              GPIO 管脚中断初始化                                         */
/*                                                                          */
/****************************************************************************/
void GPIOBankPinInterruptInit(void)
{
    // 底板按键中断
    // 配置 USER0 KEY GPIO0[6] 为下降沿触发
    GPIOIntTypeSet(SOC_GPIO_0_REGS, 7, GPIO_INT_TYPE_FALLEDGE);     // 底板SW5  USER0 KEY GPIO0[6]
    // 配置 USER1 KEY GPIO6[1] 为上升沿及下降沿触发
    GPIOIntTypeSet(SOC_GPIO_0_REGS, 98, GPIO_INT_TYPE_BOTHEDGE);    // 底板SW6  USER1 KEY GPIO6[1]

    // 使能 GPIO BANK 中断
    GPIOBankIntEnable(SOC_GPIO_0_REGS, 0);                  // USER0 KEY GPIO0
    GPIOBankIntEnable(SOC_GPIO_0_REGS, 6);                  // USER1 KEY GPIO6

	// 注册中断服务函数
	IntRegister(C674X_MASK_INT4, USER0KEYIsr);
	IntRegister(C674X_MASK_INT5, USER1KEYIsr);

	// 映射中断到 DSP 可屏蔽中断
	IntEventMap(C674X_MASK_INT4, SYS_INT_GPIO_B0INT);
	IntEventMap(C674X_MASK_INT5, SYS_INT_GPIO_B6INT);

	// 使能 DSP 可屏蔽中断
	IntEnable(C674X_MASK_INT4);
	IntEnable(C674X_MASK_INT5);
}

这里调用了

	// 注册中断服务函数
	IntRegister(C674X_MASK_INT4, USER0KEYIsr);
	IntRegister(C674X_MASK_INT5, USER1KEYIsr);

来注册中断服务函数,看一下源代码可以知道

void IntRegister (unsigned int cpuINT, void (*userISR)(void))

这里的第二的参数是将函数指针传递过来,什么是函数指针?也就是指向函数的指针,我可以通过这个指针来访问这个函数,然后将相应的函数指针存放在数组c674xISRtbl[cpuINT]里面。
将滚动条拉到最后

#ifdef __TI_EABI__
interrupt void _c674x_nmi_isr (void)
#else
interrupt void c674x_nmi_isr (void)
#endif
{
    c674xISRtbl[1]();
}

#ifdef __TI_EABI__
interrupt void _c674x_rsvd_int2_isr (void)
#else
interrupt void c674x_rsvd_int2_isr (void)
#endif
{
    c674xISRtbl[2]();
}

#ifdef __TI_EABI__
interrupt void _c674x_rsvd_int3_isr (void)
#else
interrupt void c674x_rsvd_int3_isr (void)
#endif
{
    c674xISRtbl[3]();
}

#ifdef __TI_EABI__
interrupt void _c674x_mask_int4_isr (void)
#else
interrupt void c674x_mask_int4_isr (void)
#endif
{
    c674xISRtbl[4]();
}

#ifdef __TI_EABI__
interrupt void _c674x_mask_int5_isr (void)
#else
interrupt void c674x_mask_int5_isr (void)
#endif
{
    c674xISRtbl[5]();
}

#ifdef __TI_EABI__
interrupt void _c674x_mask_int6_isr (void)
#else
interrupt void c674x_mask_int6_isr (void)
#endif
{
    c674xISRtbl[6]();
}

#ifdef __TI_EABI__
interrupt void _c674x_mask_int7_isr (void)
#else
interrupt void c674x_mask_int7_isr (void)
#endif
{
    c674xISRtbl[7]();
}

#ifdef __TI_EABI__
interrupt void _c674x_mask_int8_isr (void)
#else
interrupt void c674x_mask_int8_isr (void)
#endif
{
    c674xISRtbl[8]();
}

#ifdef __TI_EABI__
interrupt void _c674x_mask_int9_isr (void)
#else
interrupt void c674x_mask_int9_isr (void)
#endif
{
    c674xISRtbl[9]();
}

#ifdef __TI_EABI__
interrupt void _c674x_mask_int10_isr (void)
#else
interrupt void c674x_mask_int10_isr (void)
#endif
{
    c674xISRtbl[10]();
}

#ifdef __TI_EABI__
interrupt void _c674x_mask_int11_isr (void)
#else
interrupt void c674x_mask_int11_isr (void)
#endif
{
    c674xISRtbl[11]();
}

#ifdef __TI_EABI__
interrupt void _c674x_mask_int12_isr (void)
#else
interrupt void c674x_mask_int12_isr (void)
#endif
{
    c674xISRtbl[12]();
}

#ifdef __TI_EABI__
interrupt void _c674x_mask_int13_isr (void)
#else
interrupt void c674x_mask_int13_isr (void)
#endif
{
    c674xISRtbl[13]();
}

#ifdef __TI_EABI__
interrupt void _c674x_mask_int14_isr (void)
#else
interrupt void c674x_mask_int14_isr (void)
#endif
{
    c674xISRtbl[14]();
}

#ifdef __TI_EABI__
interrupt void _c674x_mask_int15_isr (void)
#else
interrupt void c674x_mask_int15_isr (void)
#endif
{
    c674xISRtbl[15]();
}

可以看到在这些函数中,就是跟我们在中断向量表中对应的函数名,就是在库函数中所实际执行的中断服务函数,中断服务函数调用了相应的函数指针,也就是我们通过IntRegister函数注册的那个函数,而这些中断服务函数都是使用了interrupt关键字来修饰的。我想到这里就应该明白了,在使用startware当中的中断管理的库来说,我们将我们自己的中断服务函数注册到,也就是说传递给库函数,然后在库函数中通过库函数所预先定义好的中断服务函数来间接的调用我们自己所编写的中断服务函数,所以这就是我们不能够为我们自己所写的中断服务函数加interrupt关键字的原因。
其他函数的使用直接看这个文件就可以了。

12-5 EDMA3

在这一期视频中讲解GPIO触发EDMA事件,在我们例程中是通过GPIO口的按键中断,在中断中闪烁一下核心板LED同时触发EDMA事件将一个字符串复制到另一个字符串,当然在例程所演示的工程非常简单。在实际应用中非常有用,比如说在一个使用DSP C6748与FPGA结合的系统中,FPGA作为数据采集前端,在采集完数据后,就需要通过一个中断信号来告诉DSP,然后DSP再通过EDMA将数据从FPGA中读取出来送到将要处理的功能模块中,当然这只是一个简单的应用场景,也可以使用这种方式来实现更多更高级的功能。在这只演示简单的实现,目的是抛砖引玉。来给大家对GPIO触发EDMA3事件有一个简单的认识。
在这里插入图片描述

打开GPIO_KEY_EDMA这个例程
这个程序主要是通过按键触发EDMA事件,双击main.c标签,使其最大化。看一个程序首先要从主函数看起,一般情况下根据书写习惯不同,主函数可能是当前源文件的第一个函数也可能是最后一个函数。此工程中将主函数放在了最后,放在最后的好处是对主函数内调用的函数都不需要预先声明了。

/****************************************************************************/
/*                                                                          */
/*              主函数                                                      */
/*                                                                          */
/****************************************************************************/
int main(void)
{
	// 外设使能配置
	PSCInit();

	// 管脚复用配置
	GPIOBankPinMuxSet();

	// GPIO 管脚初始化
	GPIOBankPinInit();

	// DSP 中断初始化
	InterruptInit();

	// GPIO 管脚中断初始化
	GPIOBankPinInterruptInit();

	// EDMA3 初始化
	EDMA3GpioInit();

	// 主循环
	for(;;)
	{

	}
}

首先因为当前的例程中用到了GPIO外设也用到了EDMA外设,在我们使用一个外设之前必须要对外设使能,也就是打开这个外设的时钟和电源开关,使这个外设处于工作状态,在这里使能这个外设。

/****************************************************************************/
/*                                                                          */
/*              PSC 初始化                                                  */
/*                                                                          */
/****************************************************************************/
void PSCInit(void)
{
	// 使能 GPIO 模块
	// 对相应外设模块的使能也可以在 BootLoader 中完成
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);

	// 使能 EDMA3CC_0
    PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_CC0, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);

    // 使能 EDMA3TC_0
    PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_TC0, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
}

这里先使能了GPIO口,然后使能EDMA3的两个模块,一个是EDMA3CC,一个是EDMA3TC。EDMA3CC是通道控制器的缩写,而EDMA3TC是传输控制模块的缩写。在使用EDMA3的时候这两个模块都必须要用到,所以在这里需要把这两个模块进行使能。

之后就是之前讲过的对GPIO中断的一些操作,首先管脚复用配置
这里只用到了核心板LED和底板按键,只需要配置这两个GPIO管脚

/****************************************************************************/
/*                                                                          */
/*              GPIO 管脚复用配置                                           */
/*                                                                          */
/****************************************************************************/
void GPIOBankPinMuxSet(void)
{
	// 配置相应的 GPIO 口功能为普通输入输出口
	// 核心板 LED
	GPIOBank6Pin13PinMuxSetup();        // 核心板FD1  GPIO6[13]

	// 底板按键
	GPIOBank0Pin6PinMuxSetup();         // 底板SW5  GPIO0[6]
}

GPIO以及DSP中断的初始化操作
DSP中断初始化比较固定,主要就是两个函数,一个是初始化DSP中断控制器,另外一个是使能DSP全局中断,使能DSP全局中断的时候这里需要注意,默认情况下是使能了所有的可屏蔽中断和不可屏蔽中断,因为在中断那一部分就讲过,如果想要可屏蔽中断工作的话必须使能不可屏蔽中断。

/****************************************************************************/
/*                                                                          */
/*              DSP 中断初始化                                              */
/*                                                                          */
/****************************************************************************/
void InterruptInit(void)
{
	// 初始化 DSP 中断控制器
	IntDSPINTCInit();

	// 使能 DSP 全局中断
	IntGlobalEnable();
}

然后就是GPIO管脚的中断初始化,在这里跟前面讲的一样,首先就是设置GPIO管脚的触发类型,然后使能相应Bank中断,注册中断服务函数,然后映射相应的事件到DSP可屏蔽中断,然后使能DSP的可屏蔽中断。

/****************************************************************************/
/*                                                                          */
/*              GPIO 管脚中断初始化                                         */
/*                                                                          */
/****************************************************************************/
void GPIOBankPinInterruptInit(void)
{
    // 底板按键中断
    // 配置 USER0 KEY GPIO0[6] 为下降沿触发
    GPIOIntTypeSet(SOC_GPIO_0_REGS, 7, GPIO_INT_TYPE_FALLEDGE);

    // 使能 GPIO BANK 中断
    GPIOBankIntEnable(SOC_GPIO_0_REGS, 0);                  // USER0 KEY GPIO0

	// 注册中断服务函数
	IntRegister(C674X_MASK_INT6, USER0KEYIsr);

	// 映射中断到 DSP 可屏蔽中断
	IntEventMap(C674X_MASK_INT6, SYS_INT_GPIO_B0INT);

	// 使能 DSP 可屏蔽中断
	IntEnable(C674X_MASK_INT6);
}

这里着重讲的是EDMA3的初始化操作,我们按住Ctrl键点击这个函数跳转到这个函数,在看这个函数之前,先看一下几个全局变量

/****************************************************************************/
/*                                                                          */
/*              全局变量                                                    */
/*                                                                          */
/****************************************************************************/
volatile char StringScr[] = "Tronlong GPIO KEY EDMA3 Application......\n\r";
volatile char StringDst[64];

// EDMA3 配置
unsigned int chType     = EDMA3_CHANNEL_TYPE_DMA;
unsigned int chNum      = EDMA3_CHA_GPIO_BNKINT0;
unsigned int tccNum     = EDMA3_CHA_GPIO_BNKINT0;
unsigned int trigMode   = EDMA3_TRIG_MODE_EVENT;
unsigned int evtQ       = 0;

在这里首先就是StringScr,也就是我们要复制的这个字符串,然后是被复制到的目标字符串StringDst,下面几个是对于EDMA3的配置,chType:通道类型,可以选择EDMA3_CHANNEL_TYPE_DMA通道,也可以选择EDMA3_CHANNEL_TYPE_QDMA通道;下面是通道号chNum和tcctccNum的序号,这里因为是要通过一个事件来触发EDMA事件,这里把它们都配置为EDMA3_CHA_GPIO_BNKINT0,因为当前这个案件的GPIO口是位于Bank0的第6个管脚,然后就是设置触发类型,我们可以看一下触发类型,EDMA3_TRIG_MODE_MANUAL、EDMA3_TRIG_MODE_QDMA和EDMA3_TRIG_MODE_EVENT即:手动触发、QDMA和事件触发,因为在这里需要通过按键中断事件来触发EDMA,所以这里选择的触发模式为事件触发EDMA3_TRIG_MODE_EVENT;evtQ是指定消息队列,或者说是事件队列。

接下来看一下EDMA3GpioInit,这是对EDMA3的初始化操作,这里顺带解释一下EDMA3是什么意思,EDMA是增强型直接内存存取,而3就是第三代的意思,C674x系列CPU使用的是第三代的EDMA,包括以后的C66系列也是使用的EDMA3,而之前的C64系列和C62系列DSP使用的EDMA2,也就是第二代EDMA,在EDMA的配置当中最重要的就是对于参数RAM(PaRAM)的配置,参数RAM(PaRAM)是一块内存区域,这段区域存储的是我们对于EDMA使用的一些配置操作,或者说一些变量,这些变量是只针对EDMA来配置的。在使用之前我们需要先申请一个EDMA通道,使用EDMA3RequestChannel来申请一个通道,然后就是配置参数RAM,首先最重要的两个参数就是源地址srcAddr和目的地址destAddr,源地址就是我们要赋值数据或者是传输数据起始的,就是我们要将哪里的数据复制,而目的地址就是我们要复制到的变量、存储区域,可以写成变量的形式,对变量取地址,也可以使用一个32位的地址,这里需要注意这个地址是(unsigned int)型,也就是无符号整型,之后是3个参数aCntbCntcCnt,因为在C6748的EDMA当中支持一维传输、二维传输和三维传输。什么是一维传输呢?简单来说它就相当于一个一维向量,或者是一维的数组,二维就是二维向量或二维数组,三维也是类似的。一般情况下我们也可以将二维的传输模式所传输的数据叫做一个帧,因为这里我们只是简单的复制一个字符串,所以在这里我们只使用一维的传输方式就能满足我们的需要,这里需要注意的是这三个参数,它的类型是(unsigned short)型,也就是短整型,所以它的取值范围是0到65535,也就是说不管一维、二维还是三维,这个参数值最大是64K-1,也就是说我们如果使用一维数据传输的话,最大只能传输64KB的数据,使用二维传输的话,也就是64K*64K,使用三维就是64K的三次方。64K的三次方是256M,一般情况下是完全满足我们的需要,因为在C6748中所支持的DDR2或mDDR的内存大小也就是256M。

/****************************************************************************/
/*                                                                          */
/*              EDMA3 初始化                                                */
/*                                                                          */
/****************************************************************************/
void EDMA3GpioInit()
{
    EDMA3CCPaRAMEntry paramSet;

    unsigned int acnt = 64;	// 一维
    unsigned int bcnt = 1;		// 二维
    unsigned int ccnt = 1;		// 三维

    // 申请 EDMA3 通道
    EDMA3RequestChannel(SOC_EDMA30CC_0_REGS, chType, chNum, tccNum, evtQ);

	// 配置参数 RAM
	paramSet.srcAddr = (unsigned int)(&StringScr);
	paramSet.destAddr = (unsigned int)(&StringDst);
	paramSet.aCnt = (unsigned short)acnt;
	paramSet.bCnt = (unsigned short)bcnt;
	paramSet.cCnt = (unsigned short)ccnt;
	// 设置 SRC / DES 索引
	paramSet.srcBIdx = (short)acnt;
	paramSet.destBIdx = (short)acnt;
	// A Sync 传输模式(一维传输模式)
	paramSet.srcCIdx = (short)acnt;
	paramSet.destCIdx = (short)acnt;
	paramSet.linkAddr = (unsigned short)0xFFFFu;
	paramSet.bCntReload = (unsigned short)0u;
	paramSet.opt = 0u;
	// Src 及 Dest 使用自增(INCR)模式
	paramSet.opt &= 0xFFFFFFFCu;
	// 配置 TCC
	paramSet.opt |= ((tccNum << EDMA3CC_OPT_TCC_SHIFT) & EDMA3CC_OPT_TCC);

	// 写参数 RAM
	EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, chNum, &paramSet);

	// 使能传输
	EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, chNum, trigMode);
}

下面配置索引(设置 SRC / DES 索引),

	// 设置 SRC / DES 索引
	paramSet.srcBIdx = (short)acnt;
	paramSet.destBIdx = (short)acnt;

这个索引也是由源索引srcBIdx 和目的索引destBIdx组成,这里需要注意的是,这个参数仅适用于二维传输的,我们刚刚提过,在二维传输当中,这个二维数组或者是这个二维向量可以相当于一个数据的帧,这个源和目标就指定了我这个数据帧的偏移,比如说一维数组的长度在这里配置的是64个字节,也就是说这64个字节传输完以后,在二维数据传输的时候我要偏移多少个字节再进行第二次的数据传输。比如说在这里设置为64个字节,那么我们在传完一个一维数组的时候,地址再偏移64个,再传输第二的一维数组或者一维向量,源和目的都可以指定,这样的话就增加了二维传输模式的灵活性,也就是说我在一维数组偏移的地址可以跟二维不同,什么意思呢?大家可以看一下我们提供的EDMA的二维数据有一个转置的功能,它就是通过二维数组来实现的,实现了矩阵的转置,而且这里需要注意的是,这里是一个有符号的short型,也就是它的取值范围是从负值到正值的,也就是说我们这个可以是递增的模式也可以是递减的模式,这样大大增加了使用的灵活性。

而下边这两个也是索引,不过这两个跟上边两个相同的功能,但是这个是针对三维传输的,这里指定的三维传输也就是比如说我们二维传输的时候,这个数据当做一个帧,在三维传输的时候指定就是这一个帧的偏移,因为在这里我们将bcnt设置为了1,所以二维数据里面也只有一个一维数组,也就是64,所以这里的偏移也是64,当然在我们这个例程中只用到了一维传输,所以这些值实际上也没有太大的意义。

	// A Sync 传输模式(一维传输模式)
	paramSet.srcCIdx = (short)acnt;
	paramSet.destCIdx = (short)acnt;

下面这个参数是链接地址,或者叫连接地址更合适一点,它的功能主要是我们在使用EDMA的时候,如果我们希望实现类似于乒乓的操作,也就是说使能了EDMA通道以后,EDMA就可以类似于乒乓的操作来循环读取数据,这样就需要使用linkAddr,它的功能就是在执行完当前的EDMA传输,也就是aCntbCntcCnt都自检为0的时候,然后就跳转到下一个参数RAM的地址来进行下一次传输,在通常情况下我们配置3个参数RAM就可以实现一个循环,也就是说一旦使能了EDMA传输,它就可以以这个循环方式一直执行下去,直到我们停止它。
(连接地址0xFFFF代表一个NULL连接)

	paramSet.linkAddr = (unsigned short)0xFFFFu;

下面这个参数也是对于三维传输才有用的,这是一个bCnt重载值,在传输的时候,我们每传输完相应的数据,相应的计数值aCntbCntcCnt就会自减,这个功能就是当我们在三维传输的时候,传输完一个帧的数据或者传输完一个二维数组的数据的时候,因为bCnt已经减为0了,所以这个时候就需要再将bCnt值重载为相应的值,然后再执行一次二维数据的传输,因为对于三维数据的传输就可以认为是多个二维数据帧的传输。

paramSet.bCntReload = (unsigned short)0u;

然后是对opt选项的配置,第一个是将它全部置0,然后配置 Src 及 Dest 使用自增(INCR)模式,之后配置TCC通道,因为这里我们需要GPIO口来触发,所以我们将相应的位配置为我们设定的TCC通道tccNum也就是EDMA3_CHA_GPIO_BNKINT0,最后与EDMA3CC_OPT_TCC的目的是为了保证只有那几位被操作而其他的位不改变。

	paramSet.opt = 0u;
	// Src 及 Dest 使用自增(INCR)模式
	paramSet.opt &= 0xFFFFFFFCu;
	// 配置 TCC
	paramSet.opt |= ((tccNum << EDMA3CC_OPT_TCC_SHIFT) & EDMA3CC_OPT_TCC);

然后将参数RAM写到内存当中:

	// 写参数 RAM
	EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, chNum, &paramSet);

然后使能EDMA的传输:

	// 使能传输
	EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, chNum, trigMode);

这样的话,当我们的中断被触发的时候就执行了一次EDMA传输,这里需要注意的是,从严谨的考虑,我们需要在EDMA传输的时候也要判断到底是哪一个中断触发的这个事件,因为不管是中断和EDMA都是对于整个GPIO Bank来说的,而不是对某一个具体的GPIO管脚来说的。
这里还需要着重强调一点的是,EDMA事件是在中断发生的同时触发EDMA事件的,所以说在使用EDMA时候必须要使能相应的中断。

/****************************************************************************/
/*                                                                          */
/*              中断服务函数                                                */
/*                                                                          */
/****************************************************************************/
void USER0KEYIsr(void)
{
    // 禁用 GPIO BANK 6 中断
    GPIOBankIntDisable(SOC_GPIO_0_REGS, 0);

    // 清除 GPIO BANK 6 中断事件
    IntEventClear(SYS_INT_GPIO_B6INT);

    if(GPIOPinIntStatus(SOC_GPIO_0_REGS, 7) == GPIO_INT_PEND)
    {
		// 清除中断状态
		GPIOPinIntClear(SOC_GPIO_0_REGS, 7);

		// 核心板 LED
		unsigned int i;
		GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_HIGH);
		for(i=0x00FFFFFF;i>0;i--);                          // 延时
		GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_LOW);
    }

	// 使能 GPIO BANK 6 中断
    GPIOBankIntEnable(SOC_GPIO_0_REGS, 0);

	// 释放之前分配的 EDMA3 通道
	EDMA3FreeChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA, chNum, trigMode, tccNum, evtQ);

	// EDMA3 初始化
	EDMA3GpioInit();
}

在中断服务函数里我们只是简单的闪烁了一下LED,这里需要注意的是,在我的程序当中只是为了给大家演示,所以在这里执行了一个对LED点亮,然后再延时一段时间再熄灭的操作,在一般情况下,不应该在中断服务函数中执行耗时这么长的代码或者说语句,因为DSP的可屏蔽中断来说,如果在中断服务函数执行当中是不可以被打断的,所以这样会使我们在实际应用当中会导致某些中断不能够被及时响应,在一般情况下不能在中断服务函数内使用执行这么长时间的语句,当然,在这里只是做演示来使用的。

		// 核心板 LED
		unsigned int i;
		GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_HIGH);
		for(i=0x00FFFFFF;i>0;i--);                          // 延时
		GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_LOW);

然后在中断服务函数中执行了释放之前分配的 EDMA3 通道的操作,然后对EDMA重新初始化。

	// 释放之前分配的 EDMA3 通道
	EDMA3FreeChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA, chNum, trigMode, tccNum, evtQ);

	// EDMA3 初始化
	EDMA3GpioInit();

这里需要注意的是,在C6748的很多外设它都有自己的EDMA或者DMA,比如说USB有cppiDMA,uPP接口有uPP内置的DMA,网络有自己的DMA,显示也有自己的DMA,而EDMA主要是对于其他的外设,需要注意的是,并不是所有的事件或者说所有的外设产生的事件都可以在触发中断的同时触发EDMA的操作。在这个例程中,为了简化EDMA的操作,或者EDMA的配置,所以很简单,在这里没有使用EDMA3的传输完成中断和传输错误中断。
程序简单的好处是帮助大家更好的理解EDMA的原理。

12-6 单步调试及测量代码执行时间

在这里插入图片描述
在这一期视频讲解一下CCS怎么进行Debug调试以及怎么测量代码的执行时间。在一般情况下,尤其对DSP这样的处理器,在做算法计算的时候我们还是比较关系它的执行效率的,比如执行一个快速傅里叶变换fft运算,比如说计算128个点、256个点、512个点、甚至16K、32K、64K个点的时候到底需要多长时间,这是我们比较关心的问题,那么就讲解一下怎么测量时间。
从测量的方式来讲,主要分为两种测量方式:一种是使用硬件测量的方式,一种是使用软件测量的方式。所谓硬件测量的方式通常情况下需要借助外部设备的,比如说最常用的示波器,或者点亮LED进行测量,比如在代码执行之前将LED点亮,之后再将LED熄灭,测量执行时间,如果比较复杂的话还可以使用逻辑分析仪来进行辅助测量,使用硬件测量方式的好处是比较准确,因为它是代码实际体现在设备中所执行的时间,同样存在问题,就是测量不方便,需要借助外部仪器,当然如果的代码执行时间很长,通过LED的亮灭用秒表估计就可以粗略测量出来。还有一个问题就是如果代码执行周期很短,这样的话在测量上就比较困难。软件测量主要是使用CPU内部或者是其他外设内部的定时器/计数器模块,来计数整个代码执行的周期,然后再根据相应CPU或模块运行的频率来推算出执行的时间。使用软件测量的方法,可能会受到代码执行的一定影响,但是由于对于C6748内部有一个专门用于计数的计数器,所以从理论上讲它的计数还是十分准确的,尤其是它可以计数一些很短的执行周期,而且使用软件测量要比硬件方便快捷很多,操作难度也低了很多。
下面主要以软件的方式来讲解一下,首先打开CCS集成开发环境,打开GPIO_LED工程。
在这里插入图片描述
点击RUN→Debug(F11键),这里注意工程名字是粗体,并且后面有[Active-Debug]这样的字符,执行Debug时才是调试的当前工程。当然在进入Debug模式下需要将开发板连接好,保证开发板连接和供电正常。还有就是保证仿真器配置文件设置正确。这样就进入了CCS Debug模式。

首先,简单介绍一下Debug工具栏。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Debug调试窗口:
1、Resume(F8):开始运行我们的程序直到遇到下一个断电,如果我们的程序中没有断点的话那么它就会一直在运行;
2、Suspend(Alt+F8):暂停当前运行的程序,按下按钮时,程序就会停在当前PC指针所指向的语句;
3、Terminate(Ctrl+F2):终止当前运行的Debug程序;
后边的几个按钮是跟单步运行有关的
4、Step Into(F5):跳到当前语句的函数内部来执行;
5、Step Over(F6):只执行当前语句但是不进入它的内部;
6、Assembly Step Into(Ctrl+Shift+F5):对汇编来说的,跳到当前语句的函数内部来执行;
7、Assembly Step Over(Ctrl+Shift+F6):对汇编来说的,只执行当前语句但是不进入它的内部;
8、Step Return(F7):返回到上一个状态

鼠标双击代码行数字前边,会生成仿真的软件断点。
除了这几个单步调试按钮以外还有一个
9、CPU Reset按钮:下拉有两个选项
在这里插入图片描述
CPU Reset(Ctrl+Shift+R):CPU 复位,只复位CPU;
System Reset(Ctrl+Shift+S):系统复位,复位CPU内部所有模块,包括CPU和所有外设;
在CCS中执行的复位功能是warm reset(热复位),而且CCS为我们提供了CPU复位和系统复位两种复位方式。
这里可以简单测试一下:
在SYSCFG0寄存器内有20个和管脚复用相关的寄存器
在这里插入图片描述
将PINMUX0从0x00000000改成0x88888888,这就相当于把PINMUX0所对应的管脚配置为GPIO口,按一下回车或者鼠标点击一下其它行就可以生效。这里需要注意的是我们要勾选窗口上的持续刷新按钮(Continue Refresh),这样CCS才会通过仿真器实时从CPU内部获得各个寄存器的状态信息。这里执行一下CPU Reset按钮,可以看到当前程序指针指到内部ROM中。
在这里插入图片描述
但是我们看一下PINMUX0的值还是0x88888888,说明在当前情况下,CPU Reset只复位了CPU但是没有复位整个系统;下面执行一下System Reset,可以看到PINMUX0的值全部清0,这也是在默认情况下PINMUX值全部为0,也就是未配置的状态(Not Config)。
在这里插入图片描述
因为我们执行了复位操作,所以必须要对CPU进行重新初始化,这里选择脚本进行重新初始化,然后同时需要通过Load按钮重新加载我们的应用程序。
在这里插入图片描述
然后同时需要通过Load按钮重新加载我们的应用程序。
在这里插入图片描述
可以看到现在我们的程序加载完毕。

下面介绍一种比较简单的测量代码执行周期的方法,首先需要定位到我们要测量的代码或者是语句,比如说我们现在测量

	// 管脚复用配置
	GPIOBankPinMuxSet();

这个函数执行多长时间,首先在这个函数前设置一个断点,然后在它的下一个语句前也设置一个断点,然后点击绿色的Resume(F8)按钮,程序执行到GPIOBankPinMuxSet();函数前边。
在这里插入图片描述
点击菜单栏Run→Clock→Enable,可以看到在CCS状态栏下方出现一个时钟标记,后面跟一个:0,这个时候再点击一下绿色按钮Resume(F8),程序执行到下一个断点出,而我们的时钟指向了一个数字,这个数字就是我们刚刚所执行这个语句所占用的时钟周期,也就是CPU使用多少个周期执行完上边的GPIOBankPinMuxSet();这个函数,视频中是1328个周期,实际自己仿真的是857个周期,在我们的CPU运行在456MHz的时候,我们每一个时钟周期就是 1 456 ∗ 1 0 6 n s \frac{1}{456*10^{6}}ns 4561061ns,我们就求出执行时间是多少个ns。
在这里插入图片描述
双击(CCS6是右击)这个数字使它清0,再在下个地方设置断点,
在这里插入图片描述
这里需要注意的是,有的时候,有些语句是不能设置断点的,可以看到刚刚在双击for这个循环的时候,CCS自动把断点设置在了for内的第一个语句前边。如果这样不是很方便,就可以使用创龙为大家写的宏:

/****************************************************************************/
/*                                                                          */
/*              宏定义                                                      */
/*                                                                          */
/****************************************************************************/
// 软件断点
#define SW_BREAKPOINT   asm(" SWBP 0 ");

这个宏执行一条汇编语句asm(" SWBP 0 ");,这是一个断点的语句,使用这个方式设置一个断点比我们使用CCS可能会更灵活一点,因为它可以在任何我们需要中断的地方执行这条语句,程序就一定会中断在那里。
取消for循环内的第一个断点,点击绿色按钮Resume(F8)让程序继续运行,点击暂停,程序停止在了Delay函数内,设置两个断点,将计数清0,再执行绿色按钮Resume(F8),可以看到程序执行这个for循环执行了多少个周期。
在这里插入图片描述
这里传递了一个参数n,这个n是多少呢?将鼠标移到这里,可以看到n的值。
在这里插入图片描述
也可以根据变量调试窗口看到n的值:
在这里插入图片描述
这样我们就可以通过CCS来测量周期了。

如果我们需要在我们的程序代码来测量这个周期并打印出来,应该怎么做?如果我们需要在代码中测量相应的函数或者语句的执行周期的话,我们需要用到几个寄存器,主要是3组寄存器,我们使用任意一组均可。

运行GPIO_LED程序后,打开Registers窗口。
在这里插入图片描述
第一组寄存器是位于CPU核心寄存器(Core Registers)的TSCL和TSCH,
在这里插入图片描述
在默认情况下,这两个寄存器的值都是0,它实际上是两个计数器,是一个64位的计数器,因为我们的寄存器都是32位的,所以它使用两个寄存器来表示这一个64位的数。这个计数器我们在对它写任意值的时候它会开始计数,然后一旦开始就不会停止,因为它是一个只读的寄存器,我们可以通过在我们执行代码之前读一下这两个计数器的值写到相应变量里面,然后在我们的语句执行完之后再读一下这两个寄存器的值,然后将它们的差值计算一下,就是我们中间需要测量语句执行的周期。

还有两个寄存器组是位于PLL0和PLL1当中的,这两个寄存器是EMUCNT0和EMUCNT1,它仍然是一个64位的计数器,只不过因为这个计数器是位于PLL模块,所以它的计数时钟频率是跟相应的外设(也就是PLL锁相环外设的工作频率有关),同样这两个寄存器也是只读的,我们对它写任意一个数开始,一旦开始就不会停止,之后只能读取她的值。
在这里插入图片描述
随便写一个值开始计数。默认情况下PLL的频率是CPU的四分之一,所以它的计数频率也是CPU核心两个计数器的四分之一。所以它的速度就相对会慢一些。

同样在PLL1中也有两个这样的计数器,功能是一样的。
在这里插入图片描述
测量代码执行周期可以用这三组计数器的任意一组,或者同时使用也是没有问题的,但是一般情况下推荐使用CPU内部的计数器,而且在TI的许多算法库,比如说数字信号处理算法库DSPlib以及数学函数库mathlib中,TI在测试默认代码执行速度都是使用的CPU核心内部的两个计数器来测量的。
下面讲解一下该怎么使用,点击Terminate(Ctrl+F2)停止这一次在线调试。

因为TSCL和TSCH两个寄存器是位于CPU核心内部的,它没有映射到统一的内存编址上,所以我们对它的访问不能通过内存地址来访问。这里我们可以使用这样一个关键字来创建一个寄存器变量,cregister(create register)

/****************************************************************************/
/*                                                                          */
/*              全局变量                                                    */
/*                                                                          */
/****************************************************************************/
cregister TSCL;

这样就可以创建一个寄存器变量,我们就可以通过这样一个值来访问这个寄存器,注意这个名字必须是跟寄存器一样的。当然我们也可以不必手动创建,我们可以引用编译器或者编译工具链为我们提供的头文件,在这个头文件当中已经默认为我们声明好了这些寄存器,这个头文件名就是c6x.h

#include <c6x.h>

在这里最好使用<>,因为它是属于编译工具为我们提供的内部的一个头文件,可以打开这个头文件到底有什么

上面是我们使用编译工具的版本,这里除了一些寄存器变量的声明还有一些常用的函数,可以看到每个函数前面都有一个下划线_开头,这代表这些函数属于内联函数,这些函数我们是跟编译工具有关的。这些函数有很多,包括常用的数学函数。

后面声明了很多寄存器变量:

#if defined(_TMS320C6400_PLUS) || defined(_TMS320C6740) || defined(_TMS320C6600) || \
    defined(_TI_C6X_TESLA)
extern __cregister volatile unsigned int REP;
extern __cregister volatile unsigned int TSCL;
extern __cregister volatile unsigned int TSCH;
extern __cregister volatile unsigned int ARP;
extern __cregister volatile unsigned int ILC;
extern __cregister volatile unsigned int RILC;
extern __cregister volatile unsigned int PCE1;
extern __cregister volatile unsigned int DNUM;
extern __cregister volatile unsigned int SSR;
extern __cregister volatile unsigned int GPLYA;
extern __cregister volatile unsigned int GPLYB;
extern __cregister volatile unsigned int TSR;
extern __cregister volatile unsigned int ITSR;
extern __cregister volatile unsigned int NTSR;
extern __cregister volatile unsigned int ECR;
extern __cregister volatile unsigned int EFR;
extern __cregister volatile unsigned int IERR;

extern __cregister volatile unsigned int DMSG;
extern __cregister volatile unsigned int CMSG;
extern __cregister volatile unsigned int DT_DMA_ADDR;
extern __cregister volatile unsigned int DT_DMA_DATA;
extern __cregister volatile unsigned int DT_DMA_CNTL;
extern __cregister volatile unsigned int TCU_CNTL;
extern __cregister volatile unsigned int RTDX_REC_CNTL;
extern __cregister volatile unsigned int RTDX_XMT_CNTL;
extern __cregister volatile unsigned int RTDX_CFG;
extern __cregister volatile unsigned int RTDX_RDATA;
extern __cregister volatile unsigned int RTDX_WDATA;
extern __cregister volatile unsigned int RTDX_RADDR;
extern __cregister volatile unsigned int RTDX_WADDR;
extern __cregister volatile unsigned int MFREG0;
extern __cregister volatile unsigned int DBG_STAT;
extern __cregister volatile unsigned int BRK_EN;
extern __cregister volatile unsigned int HWBP0_CNT;
extern __cregister volatile unsigned int HWBP0;
extern __cregister volatile unsigned int HWBP1;
extern __cregister volatile unsigned int HWBP2;
extern __cregister volatile unsigned int HWBP3;
extern __cregister volatile unsigned int OVERLAY;
extern __cregister volatile unsigned int PC_PROF;
extern __cregister volatile unsigned int ATSR;
extern __cregister volatile unsigned int TRR;
extern __cregister volatile unsigned int TCRR;
#endif

前面要有相应的宏定义,后边外部声明的寄存器变量才会有效。
定义宏在工程属性,编译器属性内定义宏,把宏添加进去
在这里插入图片描述
现在就可以在程序中使用计数器了。

首先需要给这两个寄存器赋值,赋任意值就可以,这里赋值0,这样就启动了计数器。
在执行函数之前我们可以读一下这两个计数器的值,这时候我们需要声明一个变量。

/****************************************************************************/
/*                                                                          */
/*              主函数                                                      */
/*                                                                          */
/****************************************************************************/
int main(void)
{
	// 将测量前的变量分别声明
	unsigned int beforeL, beforeH;
	// 将要存储执行完计数值的变量分别声明
	unsigned int afterL, afterH;

	// 给计数器赋任意值,启动计数器
	TSCL = 0;
	TSCH = 0;

	beforeL = TSCL;
	// 外设使能配置
	PSCInit();

	afterL = TSCL;
	printf("%d\n", afterL - beforeL);

	// GPIO 管脚复用配置
	GPIOBankPinMuxSet();

	// GPIO 管脚初始化
	GPIOBankPinInit();

	// 主循环
	for(;;)
	{
		// 使用调试器Debug仿真时通过CCS的Console窗口打印
		printf("LED 亮!\n");
		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(0x00FFFFFF);
		// 使用调试器Debug仿真时通过CCS的Console窗口打印
		printf("LED 灭!\n");
		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(0x00FFFFFF);

//		// 延时
//		Delay(0x00FFFFFA);
//    	GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_LOW);    // D10 灭 GPIO0[2]
//		GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_HIGH);   // D7  亮 GPIO0[0]
//
//		//延时
//		Delay(0x0000000A);
//		GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_LOW);    // D7  灭 GPIO0[0]
//		GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_HIGH);   // D6  亮 GPIO0[5]
//
//		// 延时
//		Delay(0x00FFFFFA);
//		GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_LOW);    // D6  灭 GPIO0[5]
//		GPIOPinWrite(SOC_GPIO_0_REGS, 2, GPIO_PIN_HIGH);   // D9  亮 GPIO0[1]
//
//		// 延时
//		Delay(0x0000000A);
//		GPIOPinWrite(SOC_GPIO_0_REGS, 2, GPIO_PIN_LOW);    // D9  灭 GPIO0[1]
//		GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_HIGH);   // D10 亮 GPIO0[2]
	}
}

使用printf函数打印计数器前后的差值,在这里要注意使用printf函数需要引用一个头文件,就是c语言当中的标准输入输出头文件<stdio.h>,还需要注意的是,如果要使用这个printf函数,确保堆栈空间足够,如果堆栈空间设置的太小也有可能不能够正常输出。
编译一下这个程序。

顺带提一下Build Project、Clean Project、Rebuild Project的区别。

  1. Build Project:构建当前工程,编译当前工程。
  2. Clean Project:清除已有的编译生成的文件。
  3. Rebuild Project:重新编译,相当于先执行了Clean Project,然后再执行Build Project这两步。
    这里需要注意的是,如果程序中引用的库被替换了或者被更新了的话,必须执行Rebuild Project或者是执行Clean Project然后Build Project这样的操作,这样的话库的更新才会被应用到当前工程,而且有的时候如果你是从别的地方拿来的程序,可能跟当前配置的环境变量不一样,如果直接编译的话可能会遇到错误,这里建议使用Rebuild Project这个编译选项。
    可以看到程序中有两个警告,这个警告是刚刚声明的两个变量beforeH、afterH虽然声明了但是没有使用。

在我们进行测试之前我们最好对开发板进行一次硬件复位,为什么要这样做,是因为虽然我们这两个计数器是64位的,但是如果经过长时间运行的话依然有溢出的可能性,为了确保我们得到准确的结果,我们进行复位操作。因为刚才已经对寄存器进行赋值,它已经开始计数,对于这两个计数器来说一旦启动是不能停止的,所以执行一次硬件复位这样我们能够得到准确的结果。
复位结束后点击RUN→Debug进入调试模式。通过设置断点,显示Run→Clock→Enable,通过打印的结果和软件的结果对比,发现二者相差不多。

你可能会说刚刚只用到了一个变量,也就是低32位,但是如果我们的执行周期比较长,我们可能还会用到高32位,那么该怎么使用呢?这里需要使用c6x.h文件中的一个函数,就是_itoll,可以看一下后面的注释,它的功能是将两个整型的数合并为一个长整型数。

long long _itoll(unsigned, unsigned); /* Create a long long from 2 ints */

将两个32位的unsigned型数合并成一个64位的long long型的数,这里就可以使用这个函数。

修改代码为:

/****************************************************************************/
/*                                                                          */
/*              主函数                                                      */
/*                                                                          */
/****************************************************************************/
int main(void)
{
	// 将测量前的变量分别声明
	unsigned int beforeL, beforeH;
	// 将要存储执行完计数值的变量分别声明
	unsigned int afterL, afterH;
	// 存储64位的长整型
    long long before;
    long long after;

	// 给计数器赋任意值,启动计数器
    TSCL = 0;
    TSCH = 0;

    beforeL = TSCL;
    beforeH = TSCH;
    // 合成64位数据
	before = _itoll(beforeH, beforeL);
	// 外设使能配置
	PSCInit();

	afterL = TSCL;
	afterH = TSCH;
	// 合成64位数据
	after = _itoll(afterH, afterL);
	printf("%d\n", after - before);

	// GPIO 管脚复用配置
	GPIOBankPinMuxSet();

	// GPIO 管脚初始化
	GPIOBankPinInit();

	// 主循环
	for(;;)
	{
		// 使用调试器Debug仿真时通过CCS的Console窗口打印
		printf("LED 亮!\n");
		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(0x00FFFFFF);
		// 使用调试器Debug仿真时通过CCS的Console窗口打印
		printf("LED 灭!\n");
		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(0x00FFFFFF);
	}
}

还需要注意的问题,在执行赋值语句的时候本身也会占用一定的时间周期,尤其是我们在执行这个_itoll函数的时候,所以在测量时候从严禁的角度来说要将它占用的时钟周期去掉,所以这段代码可以改为:

	// 给计数器赋任意值,启动计数器
    TSCL = 0;
    TSCH = 0;

    beforeL = TSCL;
    beforeH = TSCH;

	// 外设使能配置
	PSCInit();

	afterL = TSCL;
	afterH = TSCH;
    // 合成64位数据
	before = _itoll(beforeH, beforeL);
	// 合成64位数据
	after = _itoll(afterH, afterL);

	printf("%d\n", after - before);

这样可能更准确;
还有就是执行

    beforeL = TSCL;
    beforeH = TSCH;
    
    afterL = TSCL;
	afterH = TSCH;

也会占用时间,也要将其减去,那么怎么办呢?我们可以再设置一个变量来除去它们在赋值当中执行的时间周期

	// 将测量前的变量分别声明
	unsigned int beforeL, beforeH;
	// 将要存储执行完计数值的变量分别声明
	unsigned int afterL, afterH;
	unsigned long long over;
	// 存储64位的长整型
	unsigned long long before;
	unsigned long long after;

	// 给计数器赋任意值,启动计数器
    TSCL = 0;
    TSCH = 0;

    beforeL = TSCL;
    beforeH = TSCH;
    afterL = TSCL;
    afterH = TSCH;
    before = _itoll(beforeH, beforeL);
    after = _itoll(afterH, afterL);
	over = after - before;

    beforeL = TSCL;
    beforeH = TSCH;
	// 外设使能配置
	PSCInit();
	afterL = TSCL;
	afterH = TSCH;
    // 合成64位数据
    before = _itoll(beforeH, beforeL);
    // 合成64位数据
    after = _itoll(afterH, afterL);
	printf("%d\n", after - before - over);

	// GPIO 管脚复用配置
	GPIOBankPinMuxSet();

	// GPIO 管脚初始化
	GPIOBankPinInit();

这样显得更严谨一些。

Debug调试的时候如果找不到源码,可以点击调试中的Locate File找到路径或者将
在这里插入图片描述
放到所提示的路径。

StartWare库中TI默认提供了两个版本编译出来的二进制库文件:cgt和cgt_ccs。
在这里插入图片描述
这有两个目录,cgt是code generation tools,代码生成工具,也就是编译工具链,而cgt这个目录中的库文件是根据Makefile文件来执行的编译;

cgt_ccs里的文件是通过ccs工程来编译的,实际上它们没有太大的区别,但是ccs工程编译的文件我们就可以将相应的工程导入来重新编译,这样的话我们在使用ccs在仿真这个库的时候就会从你编译的路径来找这个文件,当然在这种情况下仅适用于使用debug的库。

你可能好奇我们的工程是通过什么方式来找这个文件?
我们就可以通过保留工程编译的时候由.c文件生成的汇编文件来看一下,首先需要打开这个选项,因为默认情况下生成的汇编文件是被删除的。
在这里插入图片描述

在这里插入图片描述
保留生成的汇编语言文件(-k),将这个勾打上;
或者在Build选项当中添加编译选项,
在这里插入图片描述
添加一个-k,点击OK。
编译这个工程,编译完成后会在Debug目录下对应的main.c文件就会生成对应的main.asm汇编文件。
打开这个汇编文件,

;******************************************************************************
;* TMS320C6x C/C++ Codegen                                         PC v7.4.16 *
;* Date/Time created: Sat Mar 07 20:52:17 2020                                *
;******************************************************************************
	.compiler_opts --abi=eabi --c64p_l1d_workaround=off --endian=little --hll_source=on --long_precision_bits=32 --mem_model:code=near --mem_model:const=data --mem_model:data=far_aggregates --object_format=elf --silicon_version=6740 --symdebug:dwarf --symdebug:dwarf_version=3 

;******************************************************************************
;* GLOBAL FILE PARAMETERS                                                     *
;*                                                                            *
;*   Architecture      : TMS320C674x                                          *
;*   Optimization      : Disabled                                             *
;*   Optimizing for    : Compile time, Ease of Development                    *
;*                       Based on options: no -o, no -ms                      *
;*   Endian            : Little                                               *
;*   Interrupt Thrshld : Disabled                                             *
;*   Data Access Model : Far Aggregate Data                                   *
;*   Pipelining        : Disabled                                             *
;*   Memory Aliases    : Presume are aliases (pessimistic)                    *
;*   Debug Info        : DWARF Debug                                          *
;*                                                                            *
;******************************************************************************

	.asg	A15, FP
	.asg	B14, DP
	.asg	B15, SP
	.global	$bss


$C$DW$CU	.dwtag  DW_TAG_compile_unit
	.dwattr $C$DW$CU, DW_AT_name("../main.c")
	.dwattr $C$DW$CU, DW_AT_producer("TI TMS320C6x C/C++ Codegen PC v7.4.16 Copyright (c) 1996-2015 Texas Instruments Incorporated")
	.dwattr $C$DW$CU, DW_AT_TI_version(0x01)
	.dwattr $C$DW$CU, DW_AT_comp_dir("C:\TMS320C6748\Demo\StarterWare\Application\GPIO_LED\Debug")

$C$DW$1	.dwtag  DW_TAG_subprogram, DW_AT_name("_itoll")
	.dwattr $C$DW$1, DW_AT_TI_symbol_name("_itoll")
	.dwattr $C$DW$1, DW_AT_type(*$C$DW$T$14)
	.dwattr $C$DW$1, DW_AT_declaration
	.dwattr $C$DW$1, DW_AT_external
	.dwattr $C$DW$1, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/c6x.h")
	.dwattr $C$DW$1, DW_AT_decl_line(0xdf)
	.dwattr $C$DW$1, DW_AT_decl_column(0x0b)
$C$DW$2	.dwtag  DW_TAG_formal_parameter
	.dwattr $C$DW$2, DW_AT_type(*$C$DW$T$11)
$C$DW$3	.dwtag  DW_TAG_formal_parameter
	.dwattr $C$DW$3, DW_AT_type(*$C$DW$T$11)
	.dwendtag $C$DW$1


$C$DW$4	.dwtag  DW_TAG_subprogram, DW_AT_name("GPIOBank0Pin1PinMuxSetup")
	.dwattr $C$DW$4, DW_AT_TI_symbol_name("GPIOBank0Pin1PinMuxSetup")
	.dwattr $C$DW$4, DW_AT_declaration
	.dwattr $C$DW$4, DW_AT_external
	.dwattr $C$DW$4, DW_AT_decl_file("../../../Include/StarterWare/Drivers/c674x/c6748/TL6748.h")
	.dwattr $C$DW$4, DW_AT_decl_line(0x1e)
	.dwattr $C$DW$4, DW_AT_decl_column(0x0d)

$C$DW$5	.dwtag  DW_TAG_subprogram, DW_AT_name("GPIOBank0Pin2PinMuxSetup")
	.dwattr $C$DW$5, DW_AT_TI_symbol_name("GPIOBank0Pin2PinMuxSetup")
	.dwattr $C$DW$5, DW_AT_declaration
	.dwattr $C$DW$5, DW_AT_external
	.dwattr $C$DW$5, DW_AT_decl_file("../../../Include/StarterWare/Drivers/c674x/c6748/TL6748.h")
	.dwattr $C$DW$5, DW_AT_decl_line(0x1f)
	.dwattr $C$DW$5, DW_AT_decl_column(0x0d)

$C$DW$6	.dwtag  DW_TAG_subprogram, DW_AT_name("GPIOBank0Pin5PinMuxSetup")
	.dwattr $C$DW$6, DW_AT_TI_symbol_name("GPIOBank0Pin5PinMuxSetup")
	.dwattr $C$DW$6, DW_AT_declaration
	.dwattr $C$DW$6, DW_AT_external
	.dwattr $C$DW$6, DW_AT_decl_file("../../../Include/StarterWare/Drivers/c674x/c6748/TL6748.h")
	.dwattr $C$DW$6, DW_AT_decl_line(0x20)
	.dwattr $C$DW$6, DW_AT_decl_column(0x0d)

$C$DW$7	.dwtag  DW_TAG_subprogram, DW_AT_name("GPIOBank6Pin12PinMuxSetup")
	.dwattr $C$DW$7, DW_AT_TI_symbol_name("GPIOBank6Pin12PinMuxSetup")
	.dwattr $C$DW$7, DW_AT_declaration
	.dwattr $C$DW$7, DW_AT_external
	.dwattr $C$DW$7, DW_AT_decl_file("../../../Include/StarterWare/Drivers/c674x/c6748/TL6748.h")
	.dwattr $C$DW$7, DW_AT_decl_line(0x23)
	.dwattr $C$DW$7, DW_AT_decl_column(0x0d)

$C$DW$8	.dwtag  DW_TAG_subprogram, DW_AT_name("GPIOBank6Pin13PinMuxSetup")
	.dwattr $C$DW$8, DW_AT_TI_symbol_name("GPIOBank6Pin13PinMuxSetup")
	.dwattr $C$DW$8, DW_AT_declaration
	.dwattr $C$DW$8, DW_AT_external
	.dwattr $C$DW$8, DW_AT_decl_file("../../../Include/StarterWare/Drivers/c674x/c6748/TL6748.h")
	.dwattr $C$DW$8, DW_AT_decl_line(0x24)
	.dwattr $C$DW$8, DW_AT_decl_column(0x0d)

$C$DW$9	.dwtag  DW_TAG_subprogram, DW_AT_name("PSCModuleControl")
	.dwattr $C$DW$9, DW_AT_TI_symbol_name("PSCModuleControl")
	.dwattr $C$DW$9, DW_AT_type(*$C$DW$T$10)
	.dwattr $C$DW$9, DW_AT_declaration
	.dwattr $C$DW$9, DW_AT_external
	.dwattr $C$DW$9, DW_AT_decl_file("../../../Include/StarterWare/Drivers/psc.h")
	.dwattr $C$DW$9, DW_AT_decl_line(0x3a)
	.dwattr $C$DW$9, DW_AT_decl_column(0x05)
$C$DW$10	.dwtag  DW_TAG_formal_parameter
	.dwattr $C$DW$10, DW_AT_type(*$C$DW$T$11)
$C$DW$11	.dwtag  DW_TAG_formal_parameter
	.dwattr $C$DW$11, DW_AT_type(*$C$DW$T$11)
$C$DW$12	.dwtag  DW_TAG_formal_parameter
	.dwattr $C$DW$12, DW_AT_type(*$C$DW$T$11)
$C$DW$13	.dwtag  DW_TAG_formal_parameter
	.dwattr $C$DW$13, DW_AT_type(*$C$DW$T$11)
	.dwendtag $C$DW$9


$C$DW$14	.dwtag  DW_TAG_subprogram, DW_AT_name("GPIODirModeSet")
	.dwattr $C$DW$14, DW_AT_TI_symbol_name("GPIODirModeSet")
	.dwattr $C$DW$14, DW_AT_declaration
	.dwattr $C$DW$14, DW_AT_external
	.dwattr $C$DW$14, DW_AT_decl_file("../../../Include/StarterWare/Drivers/gpio.h")
	.dwattr $C$DW$14, DW_AT_decl_line(0x77)
	.dwattr $C$DW$14, DW_AT_decl_column(0x06)
$C$DW$15	.dwtag  DW_TAG_formal_parameter
	.dwattr $C$DW$15, DW_AT_type(*$C$DW$T$11)
$C$DW$16	.dwtag  DW_TAG_formal_parameter
	.dwattr $C$DW$16, DW_AT_type(*$C$DW$T$11)
$C$DW$17	.dwtag  DW_TAG_formal_parameter
	.dwattr $C$DW$17, DW_AT_type(*$C$DW$T$11)
	.dwendtag $C$DW$14


$C$DW$18	.dwtag  DW_TAG_subprogram, DW_AT_name("GPIOPinWrite")
	.dwattr $C$DW$18, DW_AT_TI_symbol_name("GPIOPinWrite")
	.dwattr $C$DW$18, DW_AT_declaration
	.dwattr $C$DW$18, DW_AT_external
	.dwattr $C$DW$18, DW_AT_decl_file("../../../Include/StarterWare/Drivers/gpio.h")
	.dwattr $C$DW$18, DW_AT_decl_line(0x7a)
	.dwattr $C$DW$18, DW_AT_decl_column(0x06)
$C$DW$19	.dwtag  DW_TAG_formal_parameter
	.dwattr $C$DW$19, DW_AT_type(*$C$DW$T$11)
$C$DW$20	.dwtag  DW_TAG_formal_parameter
	.dwattr $C$DW$20, DW_AT_type(*$C$DW$T$11)
$C$DW$21	.dwtag  DW_TAG_formal_parameter
	.dwattr $C$DW$21, DW_AT_type(*$C$DW$T$11)
	.dwendtag $C$DW$18


$C$DW$22	.dwtag  DW_TAG_subprogram, DW_AT_name("printf")
	.dwattr $C$DW$22, DW_AT_TI_symbol_name("printf")
	.dwattr $C$DW$22, DW_AT_type(*$C$DW$T$10)
	.dwattr $C$DW$22, DW_AT_declaration
	.dwattr $C$DW$22, DW_AT_external
	.dwattr $C$DW$22, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdio.h")
	.dwattr $C$DW$22, DW_AT_decl_line(0xbe)
	.dwattr $C$DW$22, DW_AT_decl_column(0x19)
$C$DW$23	.dwtag  DW_TAG_formal_parameter
	.dwattr $C$DW$23, DW_AT_type(*$C$DW$T$47)
$C$DW$24	.dwtag  DW_TAG_unspecified_parameters
	.dwendtag $C$DW$22

;	C:\ti\ccsv6\tools\compiler\c6000_7.4.16\bin\acpia6x.exe -@C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\1498414 
	.sect	".text"
	.clink
	.global	main

$C$DW$25	.dwtag  DW_TAG_subprogram, DW_AT_name("main")
	.dwattr $C$DW$25, DW_AT_low_pc(main)
	.dwattr $C$DW$25, DW_AT_high_pc(0x00)
	.dwattr $C$DW$25, DW_AT_TI_symbol_name("main")
	.dwattr $C$DW$25, DW_AT_external
	.dwattr $C$DW$25, DW_AT_type(*$C$DW$T$10)
	.dwattr $C$DW$25, DW_AT_TI_begin_file("../main.c")
	.dwattr $C$DW$25, DW_AT_TI_begin_line(0x35)
	.dwattr $C$DW$25, DW_AT_TI_begin_column(0x05)
	.dwattr $C$DW$25, DW_AT_decl_file("../main.c")
	.dwattr $C$DW$25, DW_AT_decl_line(0x35)
	.dwattr $C$DW$25, DW_AT_decl_column(0x05)
	.dwattr $C$DW$25, DW_AT_TI_max_frame_size(0x40)
	.dwpsn	file "../main.c",line 54,column 1,is_stmt,address main,isa 0

	.dwfde $C$DW$CIE, main

;******************************************************************************
;* FUNCTION NAME: main                                                        *
;*                                                                            *
;*   Regs Modified     : A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,B0,B1,B2,B3,B4,B5,B6,  *
;*                           B7,B8,B9,SP,A16,A17,A18,A19,A20,A21,A22,A23,A24, *
;*                           A25,A26,A27,A28,A29,A30,A31,B16,B17,B18,B19,B20, *
;*                           B21,B22,B23,B24,B25,B26,B27,B28,B29,B30,B31      *
;*   Regs Used         : A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,B0,B1,B2,B3,B4,B5,B6,  *
;*                           B7,B8,B9,DP,SP,A16,A17,A18,A19,A20,A21,A22,A23,  *
;*                           A24,A25,A26,A27,A28,A29,A30,A31,B16,B17,B18,B19, *
;*                           B20,B21,B22,B23,B24,B25,B26,B27,B28,B29,B30,B31  *
;*   Local Frame Size  : 16 Args + 44 Auto + 4 Save = 64 byte                 *
;******************************************************************************
main:
;** --------------------------------------------------------------------------*
	.dwcfi	cfa_offset, 0
           STW     .D2T2   B3,*SP--(64)      ; |54| 
	.dwcfi	cfa_offset, 64
	.dwcfi	save_reg_to_mem, 19, 0
$C$DW$26	.dwtag  DW_TAG_variable, DW_AT_name("beforeL")
	.dwattr $C$DW$26, DW_AT_TI_symbol_name("beforeL")
	.dwattr $C$DW$26, DW_AT_type(*$C$DW$T$11)
	.dwattr $C$DW$26, DW_AT_location[DW_OP_breg31 20]
$C$DW$27	.dwtag  DW_TAG_variable, DW_AT_name("beforeH")
	.dwattr $C$DW$27, DW_AT_TI_symbol_name("beforeH")
	.dwattr $C$DW$27, DW_AT_type(*$C$DW$T$11)
	.dwattr $C$DW$27, DW_AT_location[DW_OP_breg31 24]
$C$DW$28	.dwtag  DW_TAG_variable, DW_AT_name("afterL")
	.dwattr $C$DW$28, DW_AT_TI_symbol_name("afterL")
	.dwattr $C$DW$28, DW_AT_type(*$C$DW$T$11)
	.dwattr $C$DW$28, DW_AT_location[DW_OP_breg31 28]
$C$DW$29	.dwtag  DW_TAG_variable, DW_AT_name("afterH")
	.dwattr $C$DW$29, DW_AT_TI_symbol_name("afterH")
	.dwattr $C$DW$29, DW_AT_type(*$C$DW$T$11)
	.dwattr $C$DW$29, DW_AT_location[DW_OP_breg31 32]
$C$DW$30	.dwtag  DW_TAG_variable, DW_AT_name("over")
	.dwattr $C$DW$30, DW_AT_TI_symbol_name("over")
	.dwattr $C$DW$30, DW_AT_type(*$C$DW$T$15)
	.dwattr $C$DW$30, DW_AT_location[DW_OP_breg31 40]
$C$DW$31	.dwtag  DW_TAG_variable, DW_AT_name("before")
	.dwattr $C$DW$31, DW_AT_TI_symbol_name("before")
	.dwattr $C$DW$31, DW_AT_type(*$C$DW$T$15)
	.dwattr $C$DW$31, DW_AT_location[DW_OP_breg31 48]
$C$DW$32	.dwtag  DW_TAG_variable, DW_AT_name("after")
	.dwattr $C$DW$32, DW_AT_TI_symbol_name("after")
	.dwattr $C$DW$32, DW_AT_type(*$C$DW$T$15)
	.dwattr $C$DW$32, DW_AT_location[DW_OP_breg31 56]
	.dwpsn	file "../main.c",line 65,column 5,is_stmt,isa 0
           ZERO    .L2     B4                ; |65| 
           MVC     .S2     B4,TSCL           ; |65| 
           NOP             1
	.dwpsn	file "../main.c",line 66,column 5,is_stmt,isa 0
           MVC     .S2     B4,TSCH           ; |66| 
           NOP             1
	.dwpsn	file "../main.c",line 68,column 5,is_stmt,isa 0
           MVC     .S2     TSCL,B4           ; |68| 
           STW     .D2T2   B4,*+SP(20)       ; |68| 
	.dwpsn	file "../main.c",line 69,column 5,is_stmt,isa 0
           MVC     .S2     TSCH,B4           ; |69| 
           STW     .D2T2   B4,*+SP(24)       ; |69| 
	.dwpsn	file "../main.c",line 70,column 5,is_stmt,isa 0
           MVC     .S2     TSCL,B4           ; |70| 
           STW     .D2T2   B4,*+SP(28)       ; |70| 
	.dwpsn	file "../main.c",line 71,column 5,is_stmt,isa 0
           MVC     .S2     TSCH,B4           ; |71| 
           STW     .D2T2   B4,*+SP(32)       ; |71| 
	.dwpsn	file "../main.c",line 72,column 5,is_stmt,isa 0
           LDW     .D2T2   *+SP(24),B5       ; |72| 
           LDW     .D2T2   *+SP(20),B4       ; |72| 
           NOP             4
           STDW    .D2T2   B5:B4,*+SP(48)    ; |72| 
	.dwpsn	file "../main.c",line 73,column 5,is_stmt,isa 0
           LDW     .D2T2   *+SP(32),B5       ; |73| 
           LDW     .D2T2   *+SP(28),B4       ; |73| 
           NOP             4
           STDW    .D2T2   B5:B4,*+SP(56)    ; |73| 
	.dwpsn	file "../main.c",line 74,column 2,is_stmt,isa 0
           LDDW    .D2T1   *+SP(56),A7:A6    ; |74| 
           LDDW    .D2T2   *+SP(48),B5:B4    ; |74| 
           NOP             4
           SUBU    .L1X    A6,B4,A5:A4       ; |74| 

           EXT     .S1     A5,24,24,A5       ; |74| 
||         SUB     .L1X    A7,B5,A3          ; |74| 

           ADD     .L1     A3,A5,A5          ; |74| 
           STDW    .D2T1   A5:A4,*+SP(40)    ; |74| 
	.dwpsn	file "../main.c",line 76,column 5,is_stmt,isa 0
           MVC     .S2     TSCL,B4           ; |76| 
           STW     .D2T2   B4,*+SP(20)       ; |76| 
	.dwpsn	file "../main.c",line 77,column 5,is_stmt,isa 0
           MVC     .S2     TSCH,B4           ; |77| 
           STW     .D2T2   B4,*+SP(24)       ; |77| 
	.dwpsn	file "../main.c",line 80,column 2,is_stmt,isa 0
$C$DW$33	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$33, DW_AT_low_pc(0x00)
	.dwattr $C$DW$33, DW_AT_name("PSCInit")
	.dwattr $C$DW$33, DW_AT_TI_call
           CALLP   .S2     PSCInit,B3
$C$RL0:    ; CALL OCCURS {PSCInit} {0}       ; |80| 
	.dwpsn	file "../main.c",line 82,column 2,is_stmt,isa 0
           MVC     .S2     TSCL,B4           ; |82| 
           STW     .D2T2   B4,*+SP(28)       ; |82| 
	.dwpsn	file "../main.c",line 83,column 2,is_stmt,isa 0
           MVC     .S2     TSCH,B4           ; |83| 
           STW     .D2T2   B4,*+SP(32)       ; |83| 
	.dwpsn	file "../main.c",line 85,column 5,is_stmt,isa 0
           LDW     .D2T2   *+SP(20),B4       ; |85| 
           LDW     .D2T2   *+SP(24),B5       ; |85| 
           NOP             4
           STDW    .D2T2   B5:B4,*+SP(48)    ; |85| 
	.dwpsn	file "../main.c",line 87,column 5,is_stmt,isa 0
           LDW     .D2T2   *+SP(32),B5       ; |87| 
           LDW     .D2T2   *+SP(28),B4       ; |87| 
           NOP             4
           STDW    .D2T2   B5:B4,*+SP(56)    ; |87| 
	.dwpsn	file "../main.c",line 89,column 2,is_stmt,isa 0
           LDDW    .D2T2   *+SP(48),B7:B6    ; |89| 
           LDDW    .D2T2   *+SP(56),B9:B8    ; |89| 
           LDDW    .D2T2   *+SP(40),B17:B16  ; |89| 
           MVKL    .S1     $C$SL1+0,A3
           MVKH    .S1     $C$SL1+0,A3
           STW     .D2T1   A3,*+SP(4)        ; |89| 
           SUBU    .L2     B8,B6,B5:B4       ; |89| 

           EXT     .S2     B5,24,24,B5       ; |89| 
||         SUB     .L2     B9,B7,B6          ; |89| 

           ADD     .S2     B6,B5,B6          ; |89| 
||         SUBU    .L2     B4,B16,B5:B4      ; |89| 

           SUB     .L2     B6,B17,B5         ; |89| 
||         EXT     .S2     B5,24,24,B6       ; |89| 

           ADD     .L2     B5,B6,B5          ; |89| 
$C$DW$34	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$34, DW_AT_low_pc(0x00)
	.dwattr $C$DW$34, DW_AT_name("printf")
	.dwattr $C$DW$34, DW_AT_TI_call

           CALLP   .S2     printf,B3
||         STDW    .D2T2   B5:B4,*+SP(8)     ; |89| 

$C$RL1:    ; CALL OCCURS {printf} {0}        ; |89| 
	.dwpsn	file "../main.c",line 92,column 2,is_stmt,isa 0
$C$DW$35	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$35, DW_AT_low_pc(0x00)
	.dwattr $C$DW$35, DW_AT_name("GPIOBankPinMuxSet")
	.dwattr $C$DW$35, DW_AT_TI_call
           CALLP   .S2     GPIOBankPinMuxSet,B3
$C$RL2:    ; CALL OCCURS {GPIOBankPinMuxSet} {0}  ; |92| 
	.dwpsn	file "../main.c",line 95,column 2,is_stmt,isa 0
$C$DW$36	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$36, DW_AT_low_pc(0x00)
	.dwattr $C$DW$36, DW_AT_name("GPIOBankPinInit")
	.dwattr $C$DW$36, DW_AT_TI_call
           CALLP   .S2     GPIOBankPinInit,B3
$C$RL3:    ; CALL OCCURS {GPIOBankPinInit} {0}  ; |95| 
;*----------------------------------------------------------------------------*
;*   SOFTWARE PIPELINE INFORMATION
;*      Disqualified loop: Software pipelining disabled
;*      Disqualified loop: Loop contains a call
;*      Disqualified loop: Loop contains non-pipelinable instructions
;*      Disqualified loop: Loop contains a call
;*      Disqualified loop: Loop contains non-pipelinable instructions
;*      Disqualified loop: Loop contains a call
;*      Disqualified loop: Loop contains non-pipelinable instructions
;*      Disqualified loop: Loop contains a call
;*      Disqualified loop: Loop contains non-pipelinable instructions
;*      Disqualified loop: Loop contains a call
;*      Disqualified loop: Loop contains non-pipelinable instructions
;*      Disqualified loop: Loop contains a call
;*      Disqualified loop: Loop contains non-pipelinable instructions
;*      Disqualified loop: Loop contains a call
;*      Disqualified loop: Loop contains non-pipelinable instructions
;*      Disqualified loop: Loop contains a call
;*      Disqualified loop: Loop contains non-pipelinable instructions
;*      Disqualified loop: Loop contains a call
;*      Disqualified loop: Loop contains non-pipelinable instructions
;*      Disqualified loop: Loop contains a call
;*      Disqualified loop: Loop contains non-pipelinable instructions
;*      Disqualified loop: Loop contains a call
;*      Disqualified loop: Loop contains non-pipelinable instructions
;*      Disqualified loop: Loop contains control code
;*      Disqualified loop: Bad loop structure
;*----------------------------------------------------------------------------*
$C$L1:    
$C$DW$L$main$2$B:
	.dwpsn	file "../main.c",line 101,column 3,is_stmt,isa 0
           MVKL    .S2     $C$SL2+0,B4
           MVKH    .S2     $C$SL2+0,B4
$C$DW$37	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$37, DW_AT_low_pc(0x00)
	.dwattr $C$DW$37, DW_AT_name("printf")
	.dwattr $C$DW$37, DW_AT_TI_call

           CALLP   .S2     printf,B3
||         STW     .D2T2   B4,*+SP(4)        ; |101| 

$C$RL4:    ; CALL OCCURS {printf} {0}        ; |101| 
	.dwpsn	file "../main.c",line 102,column 3,is_stmt,isa 0
           MVKL    .S1     0x1e26000,A4
$C$DW$38	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$38, DW_AT_low_pc(0x00)
	.dwattr $C$DW$38, DW_AT_name("GPIOPinWrite")
	.dwattr $C$DW$38, DW_AT_TI_call

           CALLP   .S2     GPIOPinWrite,B3
||         MVKH    .S1     0x1e26000,A4
||         MVK     .L1     0x1,A6            ; |102| 
||         MVK     .L2     0x6,B4            ; |102| 

$C$RL5:    ; CALL OCCURS {GPIOPinWrite} {0}  ; |102| 
	.dwpsn	file "../main.c",line 103,column 3,is_stmt,isa 0
           MVKL    .S1     0x1e26000,A4
$C$DW$39	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$39, DW_AT_low_pc(0x00)
	.dwattr $C$DW$39, DW_AT_name("GPIOPinWrite")
	.dwattr $C$DW$39, DW_AT_TI_call

           CALLP   .S2     GPIOPinWrite,B3
||         MVKH    .S1     0x1e26000,A4
||         MVK     .L2     0x2,B4            ; |103| 
||         MVK     .L1     0x1,A6            ; |103| 

$C$RL6:    ; CALL OCCURS {GPIOPinWrite} {0}  ; |103| 
	.dwpsn	file "../main.c",line 104,column 3,is_stmt,isa 0
           MVKL    .S1     0x1e26000,A4
$C$DW$40	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$40, DW_AT_low_pc(0x00)
	.dwattr $C$DW$40, DW_AT_name("GPIOPinWrite")
	.dwattr $C$DW$40, DW_AT_TI_call

           CALLP   .S2     GPIOPinWrite,B3
||         MVKH    .S1     0x1e26000,A4
||         MVK     .L2     0x3,B4            ; |104| 
||         MVK     .L1     0x1,A6            ; |104| 

$C$RL7:    ; CALL OCCURS {GPIOPinWrite} {0}  ; |104| 
	.dwpsn	file "../main.c",line 105,column 3,is_stmt,isa 0

           MVKL    .S1     0x1e26000,A4
||         MVK     .S2     0x6e,B4           ; |105| 

$C$DW$41	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$41, DW_AT_low_pc(0x00)
	.dwattr $C$DW$41, DW_AT_name("GPIOPinWrite")
	.dwattr $C$DW$41, DW_AT_TI_call

           CALLP   .S2     GPIOPinWrite,B3
||         MVKH    .S1     0x1e26000,A4
||         MVK     .L1     0x1,A6            ; |105| 

$C$RL8:    ; CALL OCCURS {GPIOPinWrite} {0}  ; |105| 
	.dwpsn	file "../main.c",line 106,column 3,is_stmt,isa 0

           MVKL    .S1     0x1e26000,A4
||         MVK     .S2     0x6d,B4           ; |106| 

$C$DW$42	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$42, DW_AT_low_pc(0x00)
	.dwattr $C$DW$42, DW_AT_name("GPIOPinWrite")
	.dwattr $C$DW$42, DW_AT_TI_call

           CALLP   .S2     GPIOPinWrite,B3
||         MVKH    .S1     0x1e26000,A4
||         MVK     .L1     0x1,A6            ; |106| 

$C$RL9:    ; CALL OCCURS {GPIOPinWrite} {0}  ; |106| 
	.dwpsn	file "../main.c",line 107,column 3,is_stmt,isa 0
           ZERO    .L1     A4
$C$DW$43	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$43, DW_AT_low_pc(0x00)
	.dwattr $C$DW$43, DW_AT_name("Delay")
	.dwattr $C$DW$43, DW_AT_TI_call

           CALLP   .S2     Delay,B3
||         SET     .S1     A4,0x0,0x17,A4

$C$RL10:   ; CALL OCCURS {Delay} {0}         ; |107| 
	.dwpsn	file "../main.c",line 109,column 3,is_stmt,isa 0
           MVKL    .S2     $C$SL3+0,B4
           MVKH    .S2     $C$SL3+0,B4
$C$DW$44	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$44, DW_AT_low_pc(0x00)
	.dwattr $C$DW$44, DW_AT_name("printf")
	.dwattr $C$DW$44, DW_AT_TI_call

           CALLP   .S2     printf,B3
||         STW     .D2T2   B4,*+SP(4)        ; |109| 

$C$RL11:   ; CALL OCCURS {printf} {0}        ; |109| 
	.dwpsn	file "../main.c",line 110,column 3,is_stmt,isa 0
           MVKL    .S1     0x1e26000,A4
$C$DW$45	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$45, DW_AT_low_pc(0x00)
	.dwattr $C$DW$45, DW_AT_name("GPIOPinWrite")
	.dwattr $C$DW$45, DW_AT_TI_call

           CALLP   .S2     GPIOPinWrite,B3
||         MVKH    .S1     0x1e26000,A4
||         ZERO    .L1     A6                ; |110| 
||         MVK     .L2     0x6,B4            ; |110| 

$C$RL12:   ; CALL OCCURS {GPIOPinWrite} {0}  ; |110| 
	.dwpsn	file "../main.c",line 111,column 3,is_stmt,isa 0
           MVKL    .S1     0x1e26000,A4
$C$DW$46	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$46, DW_AT_low_pc(0x00)
	.dwattr $C$DW$46, DW_AT_name("GPIOPinWrite")
	.dwattr $C$DW$46, DW_AT_TI_call

           CALLP   .S2     GPIOPinWrite,B3
||         MVKH    .S1     0x1e26000,A4
||         MVK     .L2     0x2,B4            ; |111| 
||         ZERO    .L1     A6                ; |111| 

$C$RL13:   ; CALL OCCURS {GPIOPinWrite} {0}  ; |111| 
	.dwpsn	file "../main.c",line 112,column 3,is_stmt,isa 0
           MVKL    .S1     0x1e26000,A4
$C$DW$47	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$47, DW_AT_low_pc(0x00)
	.dwattr $C$DW$47, DW_AT_name("GPIOPinWrite")
	.dwattr $C$DW$47, DW_AT_TI_call

           CALLP   .S2     GPIOPinWrite,B3
||         MVKH    .S1     0x1e26000,A4
||         MVK     .L2     0x3,B4            ; |112| 
||         ZERO    .L1     A6                ; |112| 

$C$RL14:   ; CALL OCCURS {GPIOPinWrite} {0}  ; |112| 
$C$DW$L$main$2$E:
;** --------------------------------------------------------------------------*
$C$DW$L$main$3$B:
	.dwpsn	file "../main.c",line 113,column 3,is_stmt,isa 0

           MVKL    .S1     0x1e26000,A4
||         MVK     .S2     0x6e,B4           ; |113| 

$C$DW$48	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$48, DW_AT_low_pc(0x00)
	.dwattr $C$DW$48, DW_AT_name("GPIOPinWrite")
	.dwattr $C$DW$48, DW_AT_TI_call

           CALLP   .S2     GPIOPinWrite,B3
||         MVKH    .S1     0x1e26000,A4
||         ZERO    .L1     A6                ; |113| 

$C$RL15:   ; CALL OCCURS {GPIOPinWrite} {0}  ; |113| 
	.dwpsn	file "../main.c",line 114,column 3,is_stmt,isa 0

           MVKL    .S1     0x1e26000,A4
||         MVK     .S2     0x6d,B4           ; |114| 

$C$DW$49	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$49, DW_AT_low_pc(0x00)
	.dwattr $C$DW$49, DW_AT_name("GPIOPinWrite")
	.dwattr $C$DW$49, DW_AT_TI_call

           CALLP   .S2     GPIOPinWrite,B3
||         MVKH    .S1     0x1e26000,A4
||         ZERO    .L1     A6                ; |114| 

$C$RL16:   ; CALL OCCURS {GPIOPinWrite} {0}  ; |114| 
	.dwpsn	file "../main.c",line 115,column 3,is_stmt,isa 0
           ZERO    .L1     A4
$C$DW$50	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$50, DW_AT_low_pc(0x00)
	.dwattr $C$DW$50, DW_AT_name("Delay")
	.dwattr $C$DW$50, DW_AT_TI_call

           CALLP   .S2     Delay,B3
||         SET     .S1     A4,0x0,0x17,A4

$C$RL17:   ; CALL OCCURS {Delay} {0}         ; |115| 
	.dwpsn	file "../main.c",line 136,column 2,is_stmt,isa 0
           BNOP    .S1     $C$L1,5           ; |136| 
           ; BRANCH OCCURS {$C$L1}           ; |136| 
$C$DW$L$main$3$E:
;** --------------------------------------------------------------------------*
	.dwcfi	cfa_offset, 0
	.dwcfi	restore_reg, 19
	.dwcfi	cfa_offset, 0

$C$DW$51	.dwtag  DW_TAG_TI_loop
	.dwattr $C$DW$51, DW_AT_name("C:\TMS320C6748\Demo\StarterWare\Application\GPIO_LED\Debug\main.asm:$C$L1:1:1583585537")
	.dwattr $C$DW$51, DW_AT_TI_begin_file("../main.c")
	.dwattr $C$DW$51, DW_AT_TI_begin_line(0x62)
	.dwattr $C$DW$51, DW_AT_TI_end_line(0x88)
$C$DW$52	.dwtag  DW_TAG_TI_loop_range
	.dwattr $C$DW$52, DW_AT_low_pc($C$DW$L$main$2$B)
	.dwattr $C$DW$52, DW_AT_high_pc($C$DW$L$main$2$E)
$C$DW$53	.dwtag  DW_TAG_TI_loop_range
	.dwattr $C$DW$53, DW_AT_low_pc($C$DW$L$main$3$B)
	.dwattr $C$DW$53, DW_AT_high_pc($C$DW$L$main$3$E)
	.dwendtag $C$DW$51

	.dwattr $C$DW$25, DW_AT_TI_end_file("../main.c")
	.dwattr $C$DW$25, DW_AT_TI_end_line(0x89)
	.dwattr $C$DW$25, DW_AT_TI_end_column(0x01)
	.dwendentry
	.dwendtag $C$DW$25

	.sect	".text"
	.clink
	.global	PSCInit

$C$DW$54	.dwtag  DW_TAG_subprogram, DW_AT_name("PSCInit")
	.dwattr $C$DW$54, DW_AT_low_pc(PSCInit)
	.dwattr $C$DW$54, DW_AT_high_pc(0x00)
	.dwattr $C$DW$54, DW_AT_TI_symbol_name("PSCInit")
	.dwattr $C$DW$54, DW_AT_external
	.dwattr $C$DW$54, DW_AT_TI_begin_file("../main.c")
	.dwattr $C$DW$54, DW_AT_TI_begin_line(0x90)
	.dwattr $C$DW$54, DW_AT_TI_begin_column(0x06)
	.dwattr $C$DW$54, DW_AT_decl_file("../main.c")
	.dwattr $C$DW$54, DW_AT_decl_line(0x90)
	.dwattr $C$DW$54, DW_AT_decl_column(0x06)
	.dwattr $C$DW$54, DW_AT_TI_max_frame_size(0x08)
	.dwpsn	file "../main.c",line 145,column 1,is_stmt,address PSCInit,isa 0

	.dwfde $C$DW$CIE, PSCInit

;******************************************************************************
;* FUNCTION NAME: PSCInit                                                     *
;*                                                                            *
;*   Regs Modified     : A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,B0,B1,B2,B3,B4,B5,B6,  *
;*                           B7,B8,B9,SP,A16,A17,A18,A19,A20,A21,A22,A23,A24, *
;*                           A25,A26,A27,A28,A29,A30,A31,B16,B17,B18,B19,B20, *
;*                           B21,B22,B23,B24,B25,B26,B27,B28,B29,B30,B31      *
;*   Regs Used         : A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,B0,B1,B2,B3,B4,B5,B6,  *
;*                           B7,B8,B9,DP,SP,A16,A17,A18,A19,A20,A21,A22,A23,  *
;*                           A24,A25,A26,A27,A28,A29,A30,A31,B16,B17,B18,B19, *
;*                           B20,B21,B22,B23,B24,B25,B26,B27,B28,B29,B30,B31  *
;*   Local Frame Size  : 0 Args + 0 Auto + 4 Save = 4 byte                    *
;******************************************************************************
PSCInit:
;** --------------------------------------------------------------------------*
	.dwcfi	cfa_offset, 0
           STW     .D2T2   B3,*SP--(8)       ; |145| 
	.dwcfi	cfa_offset, 8
	.dwcfi	save_reg_to_mem, 19, 0
	.dwpsn	file "../main.c",line 148,column 5,is_stmt,isa 0

           MVKL    .S1     0x1e27000,A4
||         MVK     .L2     0x3,B4            ; |148| 

$C$DW$55	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$55, DW_AT_low_pc(0x00)
	.dwattr $C$DW$55, DW_AT_name("PSCModuleControl")
	.dwattr $C$DW$55, DW_AT_TI_call

           CALLP   .S2     PSCModuleControl,B3
||         MVKH    .S1     0x1e27000,A4
||         MV      .L2     B4,B6             ; |148| 
||         ZERO    .L1     A6                ; |148| 

$C$RL18:   ; CALL OCCURS {PSCModuleControl} {0}  ; |148| 
	.dwpsn	file "../main.c",line 149,column 1,is_stmt,isa 0
           LDW     .D2T2   *++SP(8),B3       ; |149| 
           NOP             4
	.dwcfi	cfa_offset, 0
	.dwcfi	restore_reg, 19
	.dwcfi	cfa_offset, 0
$C$DW$56	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$56, DW_AT_low_pc(0x00)
	.dwattr $C$DW$56, DW_AT_TI_return
           RETNOP  .S2     B3,5              ; |149| 
           ; BRANCH OCCURS {B3}              ; |149| 
	.dwattr $C$DW$54, DW_AT_TI_end_file("../main.c")
	.dwattr $C$DW$54, DW_AT_TI_end_line(0x95)
	.dwattr $C$DW$54, DW_AT_TI_end_column(0x01)
	.dwendentry
	.dwendtag $C$DW$54

	.sect	".text"
	.clink
	.global	GPIOBankPinMuxSet

$C$DW$57	.dwtag  DW_TAG_subprogram, DW_AT_name("GPIOBankPinMuxSet")
	.dwattr $C$DW$57, DW_AT_low_pc(GPIOBankPinMuxSet)
	.dwattr $C$DW$57, DW_AT_high_pc(0x00)
	.dwattr $C$DW$57, DW_AT_TI_symbol_name("GPIOBankPinMuxSet")
	.dwattr $C$DW$57, DW_AT_external
	.dwattr $C$DW$57, DW_AT_TI_begin_file("../main.c")
	.dwattr $C$DW$57, DW_AT_TI_begin_line(0x9c)
	.dwattr $C$DW$57, DW_AT_TI_begin_column(0x06)
	.dwattr $C$DW$57, DW_AT_decl_file("../main.c")
	.dwattr $C$DW$57, DW_AT_decl_line(0x9c)
	.dwattr $C$DW$57, DW_AT_decl_column(0x06)
	.dwattr $C$DW$57, DW_AT_TI_max_frame_size(0x08)
	.dwpsn	file "../main.c",line 157,column 1,is_stmt,address GPIOBankPinMuxSet,isa 0

	.dwfde $C$DW$CIE, GPIOBankPinMuxSet

;******************************************************************************
;* FUNCTION NAME: GPIOBankPinMuxSet                                           *
;*                                                                            *
;*   Regs Modified     : A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,B0,B1,B2,B3,B4,B5,B6,  *
;*                           B7,B8,B9,SP,A16,A17,A18,A19,A20,A21,A22,A23,A24, *
;*                           A25,A26,A27,A28,A29,A30,A31,B16,B17,B18,B19,B20, *
;*                           B21,B22,B23,B24,B25,B26,B27,B28,B29,B30,B31      *
;*   Regs Used         : A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,B0,B1,B2,B3,B4,B5,B6,  *
;*                           B7,B8,B9,DP,SP,A16,A17,A18,A19,A20,A21,A22,A23,  *
;*                           A24,A25,A26,A27,A28,A29,A30,A31,B16,B17,B18,B19, *
;*                           B20,B21,B22,B23,B24,B25,B26,B27,B28,B29,B30,B31  *
;*   Local Frame Size  : 0 Args + 0 Auto + 4 Save = 4 byte                    *
;******************************************************************************
GPIOBankPinMuxSet:
;** --------------------------------------------------------------------------*
	.dwcfi	cfa_offset, 0
           STW     .D2T2   B3,*SP--(8)       ; |157| 
	.dwcfi	cfa_offset, 8
	.dwcfi	save_reg_to_mem, 19, 0
	.dwpsn	file "../main.c",line 161,column 2,is_stmt,isa 0
$C$DW$58	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$58, DW_AT_low_pc(0x00)
	.dwattr $C$DW$58, DW_AT_name("GPIOBank6Pin12PinMuxSetup")
	.dwattr $C$DW$58, DW_AT_TI_call
           CALLP   .S2     GPIOBank6Pin12PinMuxSetup,B3
$C$RL19:   ; CALL OCCURS {GPIOBank6Pin12PinMuxSetup} {0}  ; |161| 
	.dwpsn	file "../main.c",line 162,column 2,is_stmt,isa 0
$C$DW$59	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$59, DW_AT_low_pc(0x00)
	.dwattr $C$DW$59, DW_AT_name("GPIOBank6Pin13PinMuxSetup")
	.dwattr $C$DW$59, DW_AT_TI_call
           CALLP   .S2     GPIOBank6Pin13PinMuxSetup,B3
$C$RL20:   ; CALL OCCURS {GPIOBank6Pin13PinMuxSetup} {0}  ; |162| 
	.dwpsn	file "../main.c",line 166,column 2,is_stmt,isa 0
$C$DW$60	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$60, DW_AT_low_pc(0x00)
	.dwattr $C$DW$60, DW_AT_name("GPIOBank0Pin1PinMuxSetup")
	.dwattr $C$DW$60, DW_AT_TI_call
           CALLP   .S2     GPIOBank0Pin1PinMuxSetup,B3
$C$RL21:   ; CALL OCCURS {GPIOBank0Pin1PinMuxSetup} {0}  ; |166| 
	.dwpsn	file "../main.c",line 167,column 2,is_stmt,isa 0
$C$DW$61	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$61, DW_AT_low_pc(0x00)
	.dwattr $C$DW$61, DW_AT_name("GPIOBank0Pin2PinMuxSetup")
	.dwattr $C$DW$61, DW_AT_TI_call
           CALLP   .S2     GPIOBank0Pin2PinMuxSetup,B3
$C$RL22:   ; CALL OCCURS {GPIOBank0Pin2PinMuxSetup} {0}  ; |167| 
	.dwpsn	file "../main.c",line 168,column 2,is_stmt,isa 0
$C$DW$62	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$62, DW_AT_low_pc(0x00)
	.dwattr $C$DW$62, DW_AT_name("GPIOBank0Pin5PinMuxSetup")
	.dwattr $C$DW$62, DW_AT_TI_call
           CALLP   .S2     GPIOBank0Pin5PinMuxSetup,B3
$C$RL23:   ; CALL OCCURS {GPIOBank0Pin5PinMuxSetup} {0}  ; |168| 
	.dwpsn	file "../main.c",line 169,column 1,is_stmt,isa 0
           LDW     .D2T2   *++SP(8),B3       ; |169| 
           NOP             4
	.dwcfi	cfa_offset, 0
	.dwcfi	restore_reg, 19
	.dwcfi	cfa_offset, 0
$C$DW$63	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$63, DW_AT_low_pc(0x00)
	.dwattr $C$DW$63, DW_AT_TI_return
           RETNOP  .S2     B3,5              ; |169| 
           ; BRANCH OCCURS {B3}              ; |169| 
	.dwattr $C$DW$57, DW_AT_TI_end_file("../main.c")
	.dwattr $C$DW$57, DW_AT_TI_end_line(0xa9)
	.dwattr $C$DW$57, DW_AT_TI_end_column(0x01)
	.dwendentry
	.dwendtag $C$DW$57

	.sect	".text"
	.clink
	.global	GPIOBankPinInit

$C$DW$64	.dwtag  DW_TAG_subprogram, DW_AT_name("GPIOBankPinInit")
	.dwattr $C$DW$64, DW_AT_low_pc(GPIOBankPinInit)
	.dwattr $C$DW$64, DW_AT_high_pc(0x00)
	.dwattr $C$DW$64, DW_AT_TI_symbol_name("GPIOBankPinInit")
	.dwattr $C$DW$64, DW_AT_external
	.dwattr $C$DW$64, DW_AT_TI_begin_file("../main.c")
	.dwattr $C$DW$64, DW_AT_TI_begin_line(0xb0)
	.dwattr $C$DW$64, DW_AT_TI_begin_column(0x06)
	.dwattr $C$DW$64, DW_AT_decl_file("../main.c")
	.dwattr $C$DW$64, DW_AT_decl_line(0xb0)
	.dwattr $C$DW$64, DW_AT_decl_column(0x06)
	.dwattr $C$DW$64, DW_AT_TI_max_frame_size(0x08)
	.dwpsn	file "../main.c",line 177,column 1,is_stmt,address GPIOBankPinInit,isa 0

	.dwfde $C$DW$CIE, GPIOBankPinInit

;******************************************************************************
;* FUNCTION NAME: GPIOBankPinInit                                             *
;*                                                                            *
;*   Regs Modified     : A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,B0,B1,B2,B3,B4,B5,B6,  *
;*                           B7,B8,B9,SP,A16,A17,A18,A19,A20,A21,A22,A23,A24, *
;*                           A25,A26,A27,A28,A29,A30,A31,B16,B17,B18,B19,B20, *
;*                           B21,B22,B23,B24,B25,B26,B27,B28,B29,B30,B31      *
;*   Regs Used         : A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,B0,B1,B2,B3,B4,B5,B6,  *
;*                           B7,B8,B9,DP,SP,A16,A17,A18,A19,A20,A21,A22,A23,  *
;*                           A24,A25,A26,A27,A28,A29,A30,A31,B16,B17,B18,B19, *
;*                           B20,B21,B22,B23,B24,B25,B26,B27,B28,B29,B30,B31  *
;*   Local Frame Size  : 0 Args + 0 Auto + 4 Save = 4 byte                    *
;******************************************************************************
GPIOBankPinInit:
;** --------------------------------------------------------------------------*
	.dwcfi	cfa_offset, 0
           STW     .D2T2   B3,*SP--(8)       ; |177| 
	.dwcfi	cfa_offset, 8
	.dwcfi	save_reg_to_mem, 19, 0
	.dwpsn	file "../main.c",line 196,column 5,is_stmt,isa 0

           MVKL    .S1     0x1e26000,A4
||         MVK     .S2     0x6e,B4           ; |196| 

$C$DW$65	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$65, DW_AT_low_pc(0x00)
	.dwattr $C$DW$65, DW_AT_name("GPIODirModeSet")
	.dwattr $C$DW$65, DW_AT_TI_call

           CALLP   .S2     GPIODirModeSet,B3
||         MVKH    .S1     0x1e26000,A4
||         ZERO    .L1     A6                ; |196| 

$C$RL24:   ; CALL OCCURS {GPIODirModeSet} {0}  ; |196| 
	.dwpsn	file "../main.c",line 197,column 2,is_stmt,isa 0

           MVKL    .S1     0x1e26000,A4
||         MVK     .S2     0x6d,B4           ; |197| 

$C$DW$66	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$66, DW_AT_low_pc(0x00)
	.dwattr $C$DW$66, DW_AT_name("GPIODirModeSet")
	.dwattr $C$DW$66, DW_AT_TI_call

           CALLP   .S2     GPIODirModeSet,B3
||         MVKH    .S1     0x1e26000,A4
||         ZERO    .L1     A6                ; |197| 

$C$RL25:   ; CALL OCCURS {GPIODirModeSet} {0}  ; |197| 
	.dwpsn	file "../main.c",line 205,column 5,is_stmt,isa 0
           MVKL    .S1     0x1e26000,A4
$C$DW$67	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$67, DW_AT_low_pc(0x00)
	.dwattr $C$DW$67, DW_AT_name("GPIODirModeSet")
	.dwattr $C$DW$67, DW_AT_TI_call

           CALLP   .S2     GPIODirModeSet,B3
||         MVKH    .S1     0x1e26000,A4
||         MVK     .L2     0x6,B4            ; |205| 
||         ZERO    .L1     A6                ; |205| 

$C$RL26:   ; CALL OCCURS {GPIODirModeSet} {0}  ; |205| 
	.dwpsn	file "../main.c",line 206,column 5,is_stmt,isa 0
           MVKL    .S1     0x1e26000,A4
$C$DW$68	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$68, DW_AT_low_pc(0x00)
	.dwattr $C$DW$68, DW_AT_name("GPIODirModeSet")
	.dwattr $C$DW$68, DW_AT_TI_call

           CALLP   .S2     GPIODirModeSet,B3
||         MVKH    .S1     0x1e26000,A4
||         MVK     .L2     0x2,B4            ; |206| 
||         ZERO    .L1     A6                ; |206| 

$C$RL27:   ; CALL OCCURS {GPIODirModeSet} {0}  ; |206| 
	.dwpsn	file "../main.c",line 207,column 5,is_stmt,isa 0
           MVKL    .S1     0x1e26000,A4
$C$DW$69	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$69, DW_AT_low_pc(0x00)
	.dwattr $C$DW$69, DW_AT_name("GPIODirModeSet")
	.dwattr $C$DW$69, DW_AT_TI_call

           CALLP   .S2     GPIODirModeSet,B3
||         MVKH    .S1     0x1e26000,A4
||         MVK     .L2     0x3,B4            ; |207| 
||         ZERO    .L1     A6                ; |207| 

$C$RL28:   ; CALL OCCURS {GPIODirModeSet} {0}  ; |207| 
	.dwpsn	file "../main.c",line 209,column 1,is_stmt,isa 0
           LDW     .D2T2   *++SP(8),B3       ; |209| 
           NOP             4
	.dwcfi	cfa_offset, 0
	.dwcfi	restore_reg, 19
	.dwcfi	cfa_offset, 0
$C$DW$70	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$70, DW_AT_low_pc(0x00)
	.dwattr $C$DW$70, DW_AT_TI_return
           RETNOP  .S2     B3,5              ; |209| 
           ; BRANCH OCCURS {B3}              ; |209| 
	.dwattr $C$DW$64, DW_AT_TI_end_file("../main.c")
	.dwattr $C$DW$64, DW_AT_TI_end_line(0xd1)
	.dwattr $C$DW$64, DW_AT_TI_end_column(0x01)
	.dwendentry
	.dwendtag $C$DW$64

	.sect	".text"
	.clink
	.global	Delay

$C$DW$71	.dwtag  DW_TAG_subprogram, DW_AT_name("Delay")
	.dwattr $C$DW$71, DW_AT_low_pc(Delay)
	.dwattr $C$DW$71, DW_AT_high_pc(0x00)
	.dwattr $C$DW$71, DW_AT_TI_symbol_name("Delay")
	.dwattr $C$DW$71, DW_AT_external
	.dwattr $C$DW$71, DW_AT_TI_begin_file("../main.c")
	.dwattr $C$DW$71, DW_AT_TI_begin_line(0xd8)
	.dwattr $C$DW$71, DW_AT_TI_begin_column(0x06)
	.dwattr $C$DW$71, DW_AT_decl_file("../main.c")
	.dwattr $C$DW$71, DW_AT_decl_line(0xd8)
	.dwattr $C$DW$71, DW_AT_decl_column(0x06)
	.dwattr $C$DW$71, DW_AT_TI_max_frame_size(0x08)
	.dwpsn	file "../main.c",line 217,column 1,is_stmt,address Delay,isa 0

	.dwfde $C$DW$CIE, Delay
$C$DW$72	.dwtag  DW_TAG_formal_parameter, DW_AT_name("n")
	.dwattr $C$DW$72, DW_AT_TI_symbol_name("n")
	.dwattr $C$DW$72, DW_AT_type(*$C$DW$T$11)
	.dwattr $C$DW$72, DW_AT_location[DW_OP_reg4]

;******************************************************************************
;* FUNCTION NAME: Delay                                                       *
;*                                                                            *
;*   Regs Modified     : B0,B4,SP                                             *
;*   Regs Used         : A4,B0,B3,B4,SP                                       *
;*   Local Frame Size  : 0 Args + 8 Auto + 0 Save = 8 byte                    *
;******************************************************************************
Delay:
;** --------------------------------------------------------------------------*
	.dwcfi	cfa_offset, 0
           SUB     .L2     SP,8,SP           ; |217| 
	.dwcfi	cfa_offset, 8
$C$DW$73	.dwtag  DW_TAG_variable, DW_AT_name("n")
	.dwattr $C$DW$73, DW_AT_TI_symbol_name("n")
	.dwattr $C$DW$73, DW_AT_type(*$C$DW$T$11)
	.dwattr $C$DW$73, DW_AT_location[DW_OP_breg31 4]
$C$DW$74	.dwtag  DW_TAG_variable, DW_AT_name("i")
	.dwattr $C$DW$74, DW_AT_TI_symbol_name("i")
	.dwattr $C$DW$74, DW_AT_type(*$C$DW$T$11)
	.dwattr $C$DW$74, DW_AT_location[DW_OP_breg31 8]
           STW     .D2T1   A4,*+SP(4)        ; |217| 
	.dwpsn	file "../main.c",line 220,column 6,is_stmt,isa 0
           MV      .L2X    A4,B4
           STW     .D2T2   B4,*+SP(8)        ; |220| 
	.dwpsn	file "../main.c",line 220,column 10,is_stmt,isa 0
           MV      .L2     B4,B0
   [!B0]   BNOP    .S1     $C$L3,5           ; |220| 
           ; BRANCHCC OCCURS {$C$L3}         ; |220| 
;*----------------------------------------------------------------------------*
;*   SOFTWARE PIPELINE INFORMATION
;*      Disqualified loop: Software pipelining disabled
;*----------------------------------------------------------------------------*
$C$L2:    
$C$DW$L$Delay$2$B:
	.dwpsn	file "../main.c",line 220,column 14,is_stmt,isa 0
           SUB     .L2     B4,1,B4           ; |220| 
           STW     .D2T2   B4,*+SP(8)        ; |220| 
	.dwpsn	file "../main.c",line 220,column 10,is_stmt,isa 0
           MV      .L2     B4,B0
   [ B0]   BNOP    .S1     $C$L2,5           ; |220| 
           ; BRANCHCC OCCURS {$C$L2}         ; |220| 
$C$DW$L$Delay$2$E:
;** --------------------------------------------------------------------------*
	.dwpsn	file "../main.c",line 221,column 1,is_stmt,isa 0
;** --------------------------------------------------------------------------*
$C$L3:    
           ADD     .L2     8,SP,SP           ; |221| 
	.dwcfi	cfa_offset, 0
	.dwcfi	cfa_offset, 0
$C$DW$75	.dwtag  DW_TAG_TI_branch
	.dwattr $C$DW$75, DW_AT_low_pc(0x00)
	.dwattr $C$DW$75, DW_AT_TI_return
           RETNOP  .S2     B3,5              ; |221| 
           ; BRANCH OCCURS {B3}              ; |221| 

$C$DW$76	.dwtag  DW_TAG_TI_loop
	.dwattr $C$DW$76, DW_AT_name("C:\TMS320C6748\Demo\StarterWare\Application\GPIO_LED\Debug\main.asm:$C$L2:1:1583585537")
	.dwattr $C$DW$76, DW_AT_TI_begin_file("../main.c")
	.dwattr $C$DW$76, DW_AT_TI_begin_line(0xdc)
	.dwattr $C$DW$76, DW_AT_TI_end_line(0xdc)
$C$DW$77	.dwtag  DW_TAG_TI_loop_range
	.dwattr $C$DW$77, DW_AT_low_pc($C$DW$L$Delay$2$B)
	.dwattr $C$DW$77, DW_AT_high_pc($C$DW$L$Delay$2$E)
	.dwendtag $C$DW$76

	.dwattr $C$DW$71, DW_AT_TI_end_file("../main.c")
	.dwattr $C$DW$71, DW_AT_TI_end_line(0xdd)
	.dwattr $C$DW$71, DW_AT_TI_end_column(0x01)
	.dwendentry
	.dwendtag $C$DW$71

;******************************************************************************
;* STRINGS                                                                    *
;******************************************************************************
	.sect	".const:.string"
$C$SL1:	.string	"%d",10,0
$C$SL2:	.string	"LED ",193,193,"!",10,0
$C$SL3:	.string	"LED ",195,240,"!",10,0
;*****************************************************************************
;* UNDEFINED EXTERNAL REFERENCES                                             *
;*****************************************************************************
	.global	GPIOBank0Pin1PinMuxSetup
	.global	GPIOBank0Pin2PinMuxSetup
	.global	GPIOBank0Pin5PinMuxSetup
	.global	GPIOBank6Pin12PinMuxSetup
	.global	GPIOBank6Pin13PinMuxSetup
	.global	PSCModuleControl
	.global	GPIODirModeSet
	.global	GPIOPinWrite
	.global	printf

;******************************************************************************
;* BUILD ATTRIBUTES                                                           *
;******************************************************************************
	.battr "TI", Tag_File, 1, Tag_Long_Precision_Bits(2)
	.battr "TI", Tag_File, 1, Tag_Bitfield_layout(2)
	.battr "TI", Tag_File, 1, Tag_ABI_enum_size(2)
	.battr "c6xabi", Tag_File, 1, Tag_ABI_wchar_t(1)
	.battr "c6xabi", Tag_File, 1, Tag_ABI_array_object_alignment(0)
	.battr "c6xabi", Tag_File, 1, Tag_ABI_array_object_align_expected(0)
	.battr "c6xabi", Tag_File, 1, Tag_ABI_PIC(0)
	.battr "c6xabi", Tag_File, 1, Tag_ABI_PID(0)
	.battr "c6xabi", Tag_File, 1, Tag_ABI_DSBT(0)
	.battr "c6xabi", Tag_File, 1, Tag_ABI_stack_align_needed(0)
	.battr "c6xabi", Tag_File, 1, Tag_ABI_stack_align_preserved(0)
	.battr "TI", Tag_File, 1, Tag_Tramps_Use_SOC(1)

;******************************************************************************
;* TYPE INFORMATION                                                           *
;******************************************************************************

$C$DW$T$21	.dwtag  DW_TAG_enumeration_type
	.dwattr $C$DW$T$21, DW_AT_byte_size(0x04)
$C$DW$78	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_CC0"), DW_AT_const_value(0x00)
	.dwattr $C$DW$78, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$78, DW_AT_decl_line(0x3c)
	.dwattr $C$DW$78, DW_AT_decl_column(0x05)
$C$DW$79	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_TC0"), DW_AT_const_value(0x01)
	.dwattr $C$DW$79, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$79, DW_AT_decl_line(0x3d)
	.dwattr $C$DW$79, DW_AT_decl_column(0x05)
$C$DW$80	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_TC1"), DW_AT_const_value(0x02)
	.dwattr $C$DW$80, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$80, DW_AT_decl_line(0x3e)
	.dwattr $C$DW$80, DW_AT_decl_column(0x05)
$C$DW$81	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_EMIFA"), DW_AT_const_value(0x03)
	.dwattr $C$DW$81, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$81, DW_AT_decl_line(0x3f)
	.dwattr $C$DW$81, DW_AT_decl_column(0x05)
$C$DW$82	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_SPI0"), DW_AT_const_value(0x04)
	.dwattr $C$DW$82, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$82, DW_AT_decl_line(0x40)
	.dwattr $C$DW$82, DW_AT_decl_column(0x05)
$C$DW$83	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_MMCSD0"), DW_AT_const_value(0x05)
	.dwattr $C$DW$83, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$83, DW_AT_decl_line(0x41)
	.dwattr $C$DW$83, DW_AT_decl_column(0x05)
$C$DW$84	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_AINTC"), DW_AT_const_value(0x06)
	.dwattr $C$DW$84, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$84, DW_AT_decl_line(0x42)
	.dwattr $C$DW$84, DW_AT_decl_column(0x05)
$C$DW$85	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_ARM_RAMROM"), DW_AT_const_value(0x07)
	.dwattr $C$DW$85, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$85, DW_AT_decl_line(0x43)
	.dwattr $C$DW$85, DW_AT_decl_column(0x05)
$C$DW$86	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_UART0"), DW_AT_const_value(0x09)
	.dwattr $C$DW$86, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$86, DW_AT_decl_line(0x44)
	.dwattr $C$DW$86, DW_AT_decl_column(0x05)
$C$DW$87	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_SCR0_SS"), DW_AT_const_value(0x0a)
	.dwattr $C$DW$87, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$87, DW_AT_decl_line(0x45)
	.dwattr $C$DW$87, DW_AT_decl_column(0x05)
$C$DW$88	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_SCR1_SS"), DW_AT_const_value(0x0b)
	.dwattr $C$DW$88, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$88, DW_AT_decl_line(0x46)
	.dwattr $C$DW$88, DW_AT_decl_column(0x05)
$C$DW$89	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_SCR2_SS"), DW_AT_const_value(0x0c)
	.dwattr $C$DW$89, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$89, DW_AT_decl_line(0x47)
	.dwattr $C$DW$89, DW_AT_decl_column(0x05)
$C$DW$90	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_PRU"), DW_AT_const_value(0x0d)
	.dwattr $C$DW$90, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$90, DW_AT_decl_line(0x48)
	.dwattr $C$DW$90, DW_AT_decl_column(0x05)
$C$DW$91	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_ARM"), DW_AT_const_value(0x0e)
	.dwattr $C$DW$91, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$91, DW_AT_decl_line(0x49)
	.dwattr $C$DW$91, DW_AT_decl_column(0x05)
$C$DW$92	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_DSP"), DW_AT_const_value(0x0f)
	.dwattr $C$DW$92, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$92, DW_AT_decl_line(0x4a)
	.dwattr $C$DW$92, DW_AT_decl_column(0x05)
	.dwendtag $C$DW$T$21

	.dwattr $C$DW$T$21, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$T$21, DW_AT_decl_line(0x3b)
	.dwattr $C$DW$T$21, DW_AT_decl_column(0x0e)
$C$DW$T$22	.dwtag  DW_TAG_typedef, DW_AT_name("Psc0Peripheral")
	.dwattr $C$DW$T$22, DW_AT_type(*$C$DW$T$21)
	.dwattr $C$DW$T$22, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$22, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$T$22, DW_AT_decl_line(0x4c)
	.dwattr $C$DW$T$22, DW_AT_decl_column(0x03)

$C$DW$T$23	.dwtag  DW_TAG_enumeration_type
	.dwattr $C$DW$T$23, DW_AT_byte_size(0x04)
$C$DW$93	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_CC1"), DW_AT_const_value(0x00)
	.dwattr $C$DW$93, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$93, DW_AT_decl_line(0x4f)
	.dwattr $C$DW$93, DW_AT_decl_column(0x05)
$C$DW$94	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_USB0"), DW_AT_const_value(0x01)
	.dwattr $C$DW$94, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$94, DW_AT_decl_line(0x50)
	.dwattr $C$DW$94, DW_AT_decl_column(0x05)
$C$DW$95	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_USB1"), DW_AT_const_value(0x02)
	.dwattr $C$DW$95, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$95, DW_AT_decl_line(0x51)
	.dwattr $C$DW$95, DW_AT_decl_column(0x05)
$C$DW$96	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_GPIO"), DW_AT_const_value(0x03)
	.dwattr $C$DW$96, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$96, DW_AT_decl_line(0x52)
	.dwattr $C$DW$96, DW_AT_decl_column(0x05)
$C$DW$97	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_UHPI"), DW_AT_const_value(0x04)
	.dwattr $C$DW$97, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$97, DW_AT_decl_line(0x53)
	.dwattr $C$DW$97, DW_AT_decl_column(0x05)
$C$DW$98	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_EMAC"), DW_AT_const_value(0x05)
	.dwattr $C$DW$98, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$98, DW_AT_decl_line(0x54)
	.dwattr $C$DW$98, DW_AT_decl_column(0x05)
$C$DW$99	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_DDR2_MDDR"), DW_AT_const_value(0x06)
	.dwattr $C$DW$99, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$99, DW_AT_decl_line(0x55)
	.dwattr $C$DW$99, DW_AT_decl_column(0x05)
$C$DW$100	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_MCASP0"), DW_AT_const_value(0x07)
	.dwattr $C$DW$100, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$100, DW_AT_decl_line(0x56)
	.dwattr $C$DW$100, DW_AT_decl_column(0x05)
$C$DW$101	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_SATA"), DW_AT_const_value(0x08)
	.dwattr $C$DW$101, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$101, DW_AT_decl_line(0x57)
	.dwattr $C$DW$101, DW_AT_decl_column(0x05)
$C$DW$102	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_VPIF"), DW_AT_const_value(0x09)
	.dwattr $C$DW$102, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$102, DW_AT_decl_line(0x58)
	.dwattr $C$DW$102, DW_AT_decl_column(0x05)
$C$DW$103	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_SPI1"), DW_AT_const_value(0x0a)
	.dwattr $C$DW$103, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$103, DW_AT_decl_line(0x59)
	.dwattr $C$DW$103, DW_AT_decl_column(0x05)
$C$DW$104	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_I2C1"), DW_AT_const_value(0x0b)
	.dwattr $C$DW$104, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$104, DW_AT_decl_line(0x5a)
	.dwattr $C$DW$104, DW_AT_decl_column(0x05)
$C$DW$105	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_UART1"), DW_AT_const_value(0x0c)
	.dwattr $C$DW$105, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$105, DW_AT_decl_line(0x5b)
	.dwattr $C$DW$105, DW_AT_decl_column(0x05)
$C$DW$106	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_UART2"), DW_AT_const_value(0x0d)
	.dwattr $C$DW$106, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$106, DW_AT_decl_line(0x5c)
	.dwattr $C$DW$106, DW_AT_decl_column(0x05)
$C$DW$107	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_MCBSP0"), DW_AT_const_value(0x0e)
	.dwattr $C$DW$107, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$107, DW_AT_decl_line(0x5d)
	.dwattr $C$DW$107, DW_AT_decl_column(0x05)
$C$DW$108	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_MCBSP1"), DW_AT_const_value(0x0f)
	.dwattr $C$DW$108, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$108, DW_AT_decl_line(0x5e)
	.dwattr $C$DW$108, DW_AT_decl_column(0x05)
$C$DW$109	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_LCDC"), DW_AT_const_value(0x10)
	.dwattr $C$DW$109, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$109, DW_AT_decl_line(0x5f)
	.dwattr $C$DW$109, DW_AT_decl_column(0x05)
$C$DW$110	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_EHRPWM"), DW_AT_const_value(0x11)
	.dwattr $C$DW$110, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$110, DW_AT_decl_line(0x60)
	.dwattr $C$DW$110, DW_AT_decl_column(0x05)
$C$DW$111	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_MMCSD1"), DW_AT_const_value(0x12)
	.dwattr $C$DW$111, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$111, DW_AT_decl_line(0x61)
	.dwattr $C$DW$111, DW_AT_decl_column(0x05)
$C$DW$112	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_UPP"), DW_AT_const_value(0x13)
	.dwattr $C$DW$112, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$112, DW_AT_decl_line(0x62)
	.dwattr $C$DW$112, DW_AT_decl_column(0x05)
$C$DW$113	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_ECAP0_1_2"), DW_AT_const_value(0x14)
	.dwattr $C$DW$113, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$113, DW_AT_decl_line(0x63)
	.dwattr $C$DW$113, DW_AT_decl_column(0x05)
$C$DW$114	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_TC2"), DW_AT_const_value(0x15)
	.dwattr $C$DW$114, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$114, DW_AT_decl_line(0x64)
	.dwattr $C$DW$114, DW_AT_decl_column(0x05)
$C$DW$115	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_SCRF0_SS"), DW_AT_const_value(0x18)
	.dwattr $C$DW$115, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$115, DW_AT_decl_line(0x65)
	.dwattr $C$DW$115, DW_AT_decl_column(0x05)
$C$DW$116	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_SCRF1_SS"), DW_AT_const_value(0x19)
	.dwattr $C$DW$116, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$116, DW_AT_decl_line(0x66)
	.dwattr $C$DW$116, DW_AT_decl_column(0x05)
$C$DW$117	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_SCRF2_SS"), DW_AT_const_value(0x1a)
	.dwattr $C$DW$117, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$117, DW_AT_decl_line(0x67)
	.dwattr $C$DW$117, DW_AT_decl_column(0x05)
$C$DW$118	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_SCRF6_SS"), DW_AT_const_value(0x1b)
	.dwattr $C$DW$118, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$118, DW_AT_decl_line(0x68)
	.dwattr $C$DW$118, DW_AT_decl_column(0x05)
$C$DW$119	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_SCRF7_SS"), DW_AT_const_value(0x1c)
	.dwattr $C$DW$119, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$119, DW_AT_decl_line(0x69)
	.dwattr $C$DW$119, DW_AT_decl_column(0x05)
$C$DW$120	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_SCRF8_SS"), DW_AT_const_value(0x1d)
	.dwattr $C$DW$120, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$120, DW_AT_decl_line(0x6a)
	.dwattr $C$DW$120, DW_AT_decl_column(0x05)
$C$DW$121	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_BR_F7"), DW_AT_const_value(0x1e)
	.dwattr $C$DW$121, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$121, DW_AT_decl_line(0x6b)
	.dwattr $C$DW$121, DW_AT_decl_column(0x05)
$C$DW$122	.dwtag  DW_TAG_enumerator, DW_AT_name("HW_PSC_SHRAM"), DW_AT_const_value(0x1f)
	.dwattr $C$DW$122, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$122, DW_AT_decl_line(0x6c)
	.dwattr $C$DW$122, DW_AT_decl_column(0x05)
	.dwendtag $C$DW$T$23

	.dwattr $C$DW$T$23, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$T$23, DW_AT_decl_line(0x4e)
	.dwattr $C$DW$T$23, DW_AT_decl_column(0x0e)
$C$DW$T$24	.dwtag  DW_TAG_typedef, DW_AT_name("Psc1Peripheral")
	.dwattr $C$DW$T$24, DW_AT_type(*$C$DW$T$23)
	.dwattr $C$DW$T$24, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$24, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_psc_C6748.h")
	.dwattr $C$DW$T$24, DW_AT_decl_line(0x6d)
	.dwattr $C$DW$T$24, DW_AT_decl_column(0x03)

$C$DW$T$20	.dwtag  DW_TAG_structure_type
	.dwattr $C$DW$T$20, DW_AT_byte_size(0x18)
$C$DW$123	.dwtag  DW_TAG_member
	.dwattr $C$DW$123, DW_AT_type(*$C$DW$T$10)
	.dwattr $C$DW$123, DW_AT_name("fd")
	.dwattr $C$DW$123, DW_AT_TI_symbol_name("fd")
	.dwattr $C$DW$123, DW_AT_data_member_location[DW_OP_plus_uconst 0x0]
	.dwattr $C$DW$123, DW_AT_accessibility(DW_ACCESS_public)
	.dwattr $C$DW$123, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdio.h")
	.dwattr $C$DW$123, DW_AT_decl_line(0x49)
	.dwattr $C$DW$123, DW_AT_decl_column(0x0b)
$C$DW$124	.dwtag  DW_TAG_member
	.dwattr $C$DW$124, DW_AT_type(*$C$DW$T$19)
	.dwattr $C$DW$124, DW_AT_name("buf")
	.dwattr $C$DW$124, DW_AT_TI_symbol_name("buf")
	.dwattr $C$DW$124, DW_AT_data_member_location[DW_OP_plus_uconst 0x4]
	.dwattr $C$DW$124, DW_AT_accessibility(DW_ACCESS_public)
	.dwattr $C$DW$124, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdio.h")
	.dwattr $C$DW$124, DW_AT_decl_line(0x4a)
	.dwattr $C$DW$124, DW_AT_decl_column(0x16)
$C$DW$125	.dwtag  DW_TAG_member
	.dwattr $C$DW$125, DW_AT_type(*$C$DW$T$19)
	.dwattr $C$DW$125, DW_AT_name("pos")
	.dwattr $C$DW$125, DW_AT_TI_symbol_name("pos")
	.dwattr $C$DW$125, DW_AT_data_member_location[DW_OP_plus_uconst 0x8]
	.dwattr $C$DW$125, DW_AT_accessibility(DW_ACCESS_public)
	.dwattr $C$DW$125, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdio.h")
	.dwattr $C$DW$125, DW_AT_decl_line(0x4b)
	.dwattr $C$DW$125, DW_AT_decl_column(0x16)
$C$DW$126	.dwtag  DW_TAG_member
	.dwattr $C$DW$126, DW_AT_type(*$C$DW$T$19)
	.dwattr $C$DW$126, DW_AT_name("bufend")
	.dwattr $C$DW$126, DW_AT_TI_symbol_name("bufend")
	.dwattr $C$DW$126, DW_AT_data_member_location[DW_OP_plus_uconst 0xc]
	.dwattr $C$DW$126, DW_AT_accessibility(DW_ACCESS_public)
	.dwattr $C$DW$126, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdio.h")
	.dwattr $C$DW$126, DW_AT_decl_line(0x4c)
	.dwattr $C$DW$126, DW_AT_decl_column(0x16)
$C$DW$127	.dwtag  DW_TAG_member
	.dwattr $C$DW$127, DW_AT_type(*$C$DW$T$19)
	.dwattr $C$DW$127, DW_AT_name("buff_stop")
	.dwattr $C$DW$127, DW_AT_TI_symbol_name("buff_stop")
	.dwattr $C$DW$127, DW_AT_data_member_location[DW_OP_plus_uconst 0x10]
	.dwattr $C$DW$127, DW_AT_accessibility(DW_ACCESS_public)
	.dwattr $C$DW$127, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdio.h")
	.dwattr $C$DW$127, DW_AT_decl_line(0x4d)
	.dwattr $C$DW$127, DW_AT_decl_column(0x16)
$C$DW$128	.dwtag  DW_TAG_member
	.dwattr $C$DW$128, DW_AT_type(*$C$DW$T$11)
	.dwattr $C$DW$128, DW_AT_name("flags")
	.dwattr $C$DW$128, DW_AT_TI_symbol_name("flags")
	.dwattr $C$DW$128, DW_AT_data_member_location[DW_OP_plus_uconst 0x14]
	.dwattr $C$DW$128, DW_AT_accessibility(DW_ACCESS_public)
	.dwattr $C$DW$128, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdio.h")
	.dwattr $C$DW$128, DW_AT_decl_line(0x4e)
	.dwattr $C$DW$128, DW_AT_decl_column(0x16)
	.dwendtag $C$DW$T$20

	.dwattr $C$DW$T$20, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdio.h")
	.dwattr $C$DW$T$20, DW_AT_decl_line(0x48)
	.dwattr $C$DW$T$20, DW_AT_decl_column(0x10)
$C$DW$T$25	.dwtag  DW_TAG_typedef, DW_AT_name("FILE")
	.dwattr $C$DW$T$25, DW_AT_type(*$C$DW$T$20)
	.dwattr $C$DW$T$25, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$25, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdio.h")
	.dwattr $C$DW$T$25, DW_AT_decl_line(0x4f)
	.dwattr $C$DW$T$25, DW_AT_decl_column(0x03)
$C$DW$T$4	.dwtag  DW_TAG_base_type
	.dwattr $C$DW$T$4, DW_AT_encoding(DW_ATE_boolean)
	.dwattr $C$DW$T$4, DW_AT_name("bool")
	.dwattr $C$DW$T$4, DW_AT_byte_size(0x01)
$C$DW$T$5	.dwtag  DW_TAG_base_type
	.dwattr $C$DW$T$5, DW_AT_encoding(DW_ATE_signed_char)
	.dwattr $C$DW$T$5, DW_AT_name("signed char")
	.dwattr $C$DW$T$5, DW_AT_byte_size(0x01)
$C$DW$T$34	.dwtag  DW_TAG_typedef, DW_AT_name("int8_t")
	.dwattr $C$DW$T$34, DW_AT_type(*$C$DW$T$5)
	.dwattr $C$DW$T$34, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$34, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$34, DW_AT_decl_line(0x2a)
	.dwattr $C$DW$T$34, DW_AT_decl_column(0x1d)
$C$DW$T$35	.dwtag  DW_TAG_typedef, DW_AT_name("int_least8_t")
	.dwattr $C$DW$T$35, DW_AT_type(*$C$DW$T$34)
	.dwattr $C$DW$T$35, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$35, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$35, DW_AT_decl_line(0x39)
	.dwattr $C$DW$T$35, DW_AT_decl_column(0x17)
$C$DW$T$6	.dwtag  DW_TAG_base_type
	.dwattr $C$DW$T$6, DW_AT_encoding(DW_ATE_unsigned_char)
	.dwattr $C$DW$T$6, DW_AT_name("unsigned char")
	.dwattr $C$DW$T$6, DW_AT_byte_size(0x01)
$C$DW$T$19	.dwtag  DW_TAG_pointer_type
	.dwattr $C$DW$T$19, DW_AT_type(*$C$DW$T$6)
	.dwattr $C$DW$T$19, DW_AT_address_class(0x20)
$C$DW$T$36	.dwtag  DW_TAG_typedef, DW_AT_name("tBoolean")
	.dwattr $C$DW$T$36, DW_AT_type(*$C$DW$T$6)
	.dwattr $C$DW$T$36, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$36, DW_AT_decl_file("../../../Include/StarterWare/Drivers/hw/hw_types.h")
	.dwattr $C$DW$T$36, DW_AT_decl_line(0x32)
	.dwattr $C$DW$T$36, DW_AT_decl_column(0x17)
$C$DW$T$37	.dwtag  DW_TAG_typedef, DW_AT_name("uint8_t")
	.dwattr $C$DW$T$37, DW_AT_type(*$C$DW$T$6)
	.dwattr $C$DW$T$37, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$37, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$37, DW_AT_decl_line(0x2b)
	.dwattr $C$DW$T$37, DW_AT_decl_column(0x1c)
$C$DW$T$38	.dwtag  DW_TAG_typedef, DW_AT_name("uint_least8_t")
	.dwattr $C$DW$T$38, DW_AT_type(*$C$DW$T$37)
	.dwattr $C$DW$T$38, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$38, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$38, DW_AT_decl_line(0x3a)
	.dwattr $C$DW$T$38, DW_AT_decl_column(0x16)
$C$DW$T$7	.dwtag  DW_TAG_base_type
	.dwattr $C$DW$T$7, DW_AT_encoding(DW_ATE_signed_char)
	.dwattr $C$DW$T$7, DW_AT_name("wchar_t")
	.dwattr $C$DW$T$7, DW_AT_byte_size(0x02)
$C$DW$T$8	.dwtag  DW_TAG_base_type
	.dwattr $C$DW$T$8, DW_AT_encoding(DW_ATE_signed)
	.dwattr $C$DW$T$8, DW_AT_name("short")
	.dwattr $C$DW$T$8, DW_AT_byte_size(0x02)
$C$DW$T$39	.dwtag  DW_TAG_typedef, DW_AT_name("int16_t")
	.dwattr $C$DW$T$39, DW_AT_type(*$C$DW$T$8)
	.dwattr $C$DW$T$39, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$39, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$39, DW_AT_decl_line(0x2c)
	.dwattr $C$DW$T$39, DW_AT_decl_column(0x1d)
$C$DW$T$40	.dwtag  DW_TAG_typedef, DW_AT_name("int_least16_t")
	.dwattr $C$DW$T$40, DW_AT_type(*$C$DW$T$39)
	.dwattr $C$DW$T$40, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$40, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$40, DW_AT_decl_line(0x3c)
	.dwattr $C$DW$T$40, DW_AT_decl_column(0x17)
$C$DW$T$9	.dwtag  DW_TAG_base_type
	.dwattr $C$DW$T$9, DW_AT_encoding(DW_ATE_unsigned)
	.dwattr $C$DW$T$9, DW_AT_name("unsigned short")
	.dwattr $C$DW$T$9, DW_AT_byte_size(0x02)
$C$DW$T$41	.dwtag  DW_TAG_typedef, DW_AT_name("uint16_t")
	.dwattr $C$DW$T$41, DW_AT_type(*$C$DW$T$9)
	.dwattr $C$DW$T$41, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$41, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$41, DW_AT_decl_line(0x2d)
	.dwattr $C$DW$T$41, DW_AT_decl_column(0x1c)
$C$DW$T$42	.dwtag  DW_TAG_typedef, DW_AT_name("uint_least16_t")
	.dwattr $C$DW$T$42, DW_AT_type(*$C$DW$T$41)
	.dwattr $C$DW$T$42, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$42, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$42, DW_AT_decl_line(0x3d)
	.dwattr $C$DW$T$42, DW_AT_decl_column(0x16)
$C$DW$T$10	.dwtag  DW_TAG_base_type
	.dwattr $C$DW$T$10, DW_AT_encoding(DW_ATE_signed)
	.dwattr $C$DW$T$10, DW_AT_name("int")
	.dwattr $C$DW$T$10, DW_AT_byte_size(0x04)
$C$DW$T$51	.dwtag  DW_TAG_typedef, DW_AT_name("fpos_t")
	.dwattr $C$DW$T$51, DW_AT_type(*$C$DW$T$10)
	.dwattr $C$DW$T$51, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$51, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdio.h")
	.dwattr $C$DW$T$51, DW_AT_decl_line(0x53)
	.dwattr $C$DW$T$51, DW_AT_decl_column(0x0d)
$C$DW$T$52	.dwtag  DW_TAG_typedef, DW_AT_name("int32_t")
	.dwattr $C$DW$T$52, DW_AT_type(*$C$DW$T$10)
	.dwattr $C$DW$T$52, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$52, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$52, DW_AT_decl_line(0x2e)
	.dwattr $C$DW$T$52, DW_AT_decl_column(0x1d)
$C$DW$T$53	.dwtag  DW_TAG_typedef, DW_AT_name("int_fast16_t")
	.dwattr $C$DW$T$53, DW_AT_type(*$C$DW$T$52)
	.dwattr $C$DW$T$53, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$53, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$53, DW_AT_decl_line(0x4b)
	.dwattr $C$DW$T$53, DW_AT_decl_column(0x17)
$C$DW$T$54	.dwtag  DW_TAG_typedef, DW_AT_name("int_fast32_t")
	.dwattr $C$DW$T$54, DW_AT_type(*$C$DW$T$52)
	.dwattr $C$DW$T$54, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$54, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$54, DW_AT_decl_line(0x4e)
	.dwattr $C$DW$T$54, DW_AT_decl_column(0x17)
$C$DW$T$55	.dwtag  DW_TAG_typedef, DW_AT_name("int_fast8_t")
	.dwattr $C$DW$T$55, DW_AT_type(*$C$DW$T$52)
	.dwattr $C$DW$T$55, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$55, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$55, DW_AT_decl_line(0x49)
	.dwattr $C$DW$T$55, DW_AT_decl_column(0x17)
$C$DW$T$56	.dwtag  DW_TAG_typedef, DW_AT_name("int_least32_t")
	.dwattr $C$DW$T$56, DW_AT_type(*$C$DW$T$52)
	.dwattr $C$DW$T$56, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$56, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$56, DW_AT_decl_line(0x3e)
	.dwattr $C$DW$T$56, DW_AT_decl_column(0x17)
$C$DW$T$57	.dwtag  DW_TAG_typedef, DW_AT_name("intptr_t")
	.dwattr $C$DW$T$57, DW_AT_type(*$C$DW$T$10)
	.dwattr $C$DW$T$57, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$57, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$57, DW_AT_decl_line(0x58)
	.dwattr $C$DW$T$57, DW_AT_decl_column(0x1a)
$C$DW$T$11	.dwtag  DW_TAG_base_type
	.dwattr $C$DW$T$11, DW_AT_encoding(DW_ATE_unsigned)
	.dwattr $C$DW$T$11, DW_AT_name("unsigned int")
	.dwattr $C$DW$T$11, DW_AT_byte_size(0x04)
$C$DW$T$59	.dwtag  DW_TAG_typedef, DW_AT_name("size_t")
	.dwattr $C$DW$T$59, DW_AT_type(*$C$DW$T$11)
	.dwattr $C$DW$T$59, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$59, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdio.h")
	.dwattr $C$DW$T$59, DW_AT_decl_line(0x45)
	.dwattr $C$DW$T$59, DW_AT_decl_column(0x19)
$C$DW$T$60	.dwtag  DW_TAG_typedef, DW_AT_name("uint32_t")
	.dwattr $C$DW$T$60, DW_AT_type(*$C$DW$T$11)
	.dwattr $C$DW$T$60, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$60, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$60, DW_AT_decl_line(0x2f)
	.dwattr $C$DW$T$60, DW_AT_decl_column(0x1c)
$C$DW$T$61	.dwtag  DW_TAG_typedef, DW_AT_name("uint_fast16_t")
	.dwattr $C$DW$T$61, DW_AT_type(*$C$DW$T$60)
	.dwattr $C$DW$T$61, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$61, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$61, DW_AT_decl_line(0x4c)
	.dwattr $C$DW$T$61, DW_AT_decl_column(0x16)
$C$DW$T$62	.dwtag  DW_TAG_typedef, DW_AT_name("uint_fast32_t")
	.dwattr $C$DW$T$62, DW_AT_type(*$C$DW$T$60)
	.dwattr $C$DW$T$62, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$62, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$62, DW_AT_decl_line(0x4f)
	.dwattr $C$DW$T$62, DW_AT_decl_column(0x16)
$C$DW$T$63	.dwtag  DW_TAG_typedef, DW_AT_name("uint_fast8_t")
	.dwattr $C$DW$T$63, DW_AT_type(*$C$DW$T$60)
	.dwattr $C$DW$T$63, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$63, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$63, DW_AT_decl_line(0x4a)
	.dwattr $C$DW$T$63, DW_AT_decl_column(0x16)
$C$DW$T$64	.dwtag  DW_TAG_typedef, DW_AT_name("uint_least32_t")
	.dwattr $C$DW$T$64, DW_AT_type(*$C$DW$T$60)
	.dwattr $C$DW$T$64, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$64, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$64, DW_AT_decl_line(0x3f)
	.dwattr $C$DW$T$64, DW_AT_decl_column(0x16)
$C$DW$T$65	.dwtag  DW_TAG_typedef, DW_AT_name("uintptr_t")
	.dwattr $C$DW$T$65, DW_AT_type(*$C$DW$T$11)
	.dwattr $C$DW$T$65, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$65, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$65, DW_AT_decl_line(0x59)
	.dwattr $C$DW$T$65, DW_AT_decl_column(0x1a)
$C$DW$T$12	.dwtag  DW_TAG_base_type
	.dwattr $C$DW$T$12, DW_AT_encoding(DW_ATE_signed)
	.dwattr $C$DW$T$12, DW_AT_name("__int40_t")
	.dwattr $C$DW$T$12, DW_AT_byte_size(0x08)
	.dwattr $C$DW$T$12, DW_AT_bit_size(0x28)
	.dwattr $C$DW$T$12, DW_AT_bit_offset(0x18)
$C$DW$T$66	.dwtag  DW_TAG_typedef, DW_AT_name("int40_t")
	.dwattr $C$DW$T$66, DW_AT_type(*$C$DW$T$12)
	.dwattr $C$DW$T$66, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$66, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$66, DW_AT_decl_line(0x31)
	.dwattr $C$DW$T$66, DW_AT_decl_column(0x21)
$C$DW$T$67	.dwtag  DW_TAG_typedef, DW_AT_name("int_fast40_t")
	.dwattr $C$DW$T$67, DW_AT_type(*$C$DW$T$66)
	.dwattr $C$DW$T$67, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$67, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$67, DW_AT_decl_line(0x51)
	.dwattr $C$DW$T$67, DW_AT_decl_column(0x17)
$C$DW$T$68	.dwtag  DW_TAG_typedef, DW_AT_name("int_least40_t")
	.dwattr $C$DW$T$68, DW_AT_type(*$C$DW$T$66)
	.dwattr $C$DW$T$68, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$68, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$68, DW_AT_decl_line(0x41)
	.dwattr $C$DW$T$68, DW_AT_decl_column(0x17)
$C$DW$T$13	.dwtag  DW_TAG_base_type
	.dwattr $C$DW$T$13, DW_AT_encoding(DW_ATE_unsigned)
	.dwattr $C$DW$T$13, DW_AT_name("unsigned __int40_t")
	.dwattr $C$DW$T$13, DW_AT_byte_size(0x08)
	.dwattr $C$DW$T$13, DW_AT_bit_size(0x28)
	.dwattr $C$DW$T$13, DW_AT_bit_offset(0x18)
$C$DW$T$69	.dwtag  DW_TAG_typedef, DW_AT_name("uint40_t")
	.dwattr $C$DW$T$69, DW_AT_type(*$C$DW$T$13)
	.dwattr $C$DW$T$69, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$69, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$69, DW_AT_decl_line(0x32)
	.dwattr $C$DW$T$69, DW_AT_decl_column(0x20)
$C$DW$T$70	.dwtag  DW_TAG_typedef, DW_AT_name("uint_fast40_t")
	.dwattr $C$DW$T$70, DW_AT_type(*$C$DW$T$69)
	.dwattr $C$DW$T$70, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$70, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$70, DW_AT_decl_line(0x52)
	.dwattr $C$DW$T$70, DW_AT_decl_column(0x16)
$C$DW$T$71	.dwtag  DW_TAG_typedef, DW_AT_name("uint_least40_t")
	.dwattr $C$DW$T$71, DW_AT_type(*$C$DW$T$69)
	.dwattr $C$DW$T$71, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$71, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$71, DW_AT_decl_line(0x42)
	.dwattr $C$DW$T$71, DW_AT_decl_column(0x16)
$C$DW$T$14	.dwtag  DW_TAG_base_type
	.dwattr $C$DW$T$14, DW_AT_encoding(DW_ATE_signed)
	.dwattr $C$DW$T$14, DW_AT_name("long long")
	.dwattr $C$DW$T$14, DW_AT_byte_size(0x08)
$C$DW$T$73	.dwtag  DW_TAG_typedef, DW_AT_name("int64_t")
	.dwattr $C$DW$T$73, DW_AT_type(*$C$DW$T$14)
	.dwattr $C$DW$T$73, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$73, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$73, DW_AT_decl_line(0x34)
	.dwattr $C$DW$T$73, DW_AT_decl_column(0x21)
$C$DW$T$74	.dwtag  DW_TAG_typedef, DW_AT_name("int_fast64_t")
	.dwattr $C$DW$T$74, DW_AT_type(*$C$DW$T$73)
	.dwattr $C$DW$T$74, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$74, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$74, DW_AT_decl_line(0x54)
	.dwattr $C$DW$T$74, DW_AT_decl_column(0x17)
$C$DW$T$75	.dwtag  DW_TAG_typedef, DW_AT_name("int_least64_t")
	.dwattr $C$DW$T$75, DW_AT_type(*$C$DW$T$73)
	.dwattr $C$DW$T$75, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$75, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$75, DW_AT_decl_line(0x44)
	.dwattr $C$DW$T$75, DW_AT_decl_column(0x17)
$C$DW$T$76	.dwtag  DW_TAG_typedef, DW_AT_name("intmax_t")
	.dwattr $C$DW$T$76, DW_AT_type(*$C$DW$T$14)
	.dwattr $C$DW$T$76, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$76, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$76, DW_AT_decl_line(0x5c)
	.dwattr $C$DW$T$76, DW_AT_decl_column(0x20)
$C$DW$T$15	.dwtag  DW_TAG_base_type
	.dwattr $C$DW$T$15, DW_AT_encoding(DW_ATE_unsigned)
	.dwattr $C$DW$T$15, DW_AT_name("unsigned long long")
	.dwattr $C$DW$T$15, DW_AT_byte_size(0x08)
$C$DW$T$77	.dwtag  DW_TAG_typedef, DW_AT_name("uint64_t")
	.dwattr $C$DW$T$77, DW_AT_type(*$C$DW$T$15)
	.dwattr $C$DW$T$77, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$77, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$77, DW_AT_decl_line(0x35)
	.dwattr $C$DW$T$77, DW_AT_decl_column(0x20)
$C$DW$T$78	.dwtag  DW_TAG_typedef, DW_AT_name("uint_fast64_t")
	.dwattr $C$DW$T$78, DW_AT_type(*$C$DW$T$77)
	.dwattr $C$DW$T$78, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$78, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$78, DW_AT_decl_line(0x55)
	.dwattr $C$DW$T$78, DW_AT_decl_column(0x16)
$C$DW$T$79	.dwtag  DW_TAG_typedef, DW_AT_name("uint_least64_t")
	.dwattr $C$DW$T$79, DW_AT_type(*$C$DW$T$77)
	.dwattr $C$DW$T$79, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$79, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$79, DW_AT_decl_line(0x45)
	.dwattr $C$DW$T$79, DW_AT_decl_column(0x16)
$C$DW$T$80	.dwtag  DW_TAG_typedef, DW_AT_name("uintmax_t")
	.dwattr $C$DW$T$80, DW_AT_type(*$C$DW$T$15)
	.dwattr $C$DW$T$80, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$80, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdint.h")
	.dwattr $C$DW$T$80, DW_AT_decl_line(0x5d)
	.dwattr $C$DW$T$80, DW_AT_decl_column(0x20)
$C$DW$T$16	.dwtag  DW_TAG_base_type
	.dwattr $C$DW$T$16, DW_AT_encoding(DW_ATE_float)
	.dwattr $C$DW$T$16, DW_AT_name("float")
	.dwattr $C$DW$T$16, DW_AT_byte_size(0x04)
$C$DW$T$81	.dwtag  DW_TAG_typedef, DW_AT_name("float32_t")
	.dwattr $C$DW$T$81, DW_AT_type(*$C$DW$T$16)
	.dwattr $C$DW$T$81, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$81, DW_AT_decl_file("C:\ti\ccsv6\tools\compiler\c6000_7.4.16\include\vect.h")
	.dwattr $C$DW$T$81, DW_AT_decl_line(0x30)
	.dwattr $C$DW$T$81, DW_AT_decl_column(0x0f)
$C$DW$T$17	.dwtag  DW_TAG_base_type
	.dwattr $C$DW$T$17, DW_AT_encoding(DW_ATE_float)
	.dwattr $C$DW$T$17, DW_AT_name("double")
	.dwattr $C$DW$T$17, DW_AT_byte_size(0x08)
$C$DW$T$82	.dwtag  DW_TAG_typedef, DW_AT_name("__float2_t")
	.dwattr $C$DW$T$82, DW_AT_type(*$C$DW$T$17)
	.dwattr $C$DW$T$82, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$82, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/c6x.h")
	.dwattr $C$DW$T$82, DW_AT_decl_line(0x5f)
	.dwattr $C$DW$T$82, DW_AT_decl_column(0x14)
$C$DW$T$18	.dwtag  DW_TAG_base_type
	.dwattr $C$DW$T$18, DW_AT_encoding(DW_ATE_float)
	.dwattr $C$DW$T$18, DW_AT_name("long double")
	.dwattr $C$DW$T$18, DW_AT_byte_size(0x08)
$C$DW$T$45	.dwtag  DW_TAG_base_type
	.dwattr $C$DW$T$45, DW_AT_encoding(DW_ATE_signed_char)
	.dwattr $C$DW$T$45, DW_AT_name("signed char")
	.dwattr $C$DW$T$45, DW_AT_byte_size(0x01)
$C$DW$T$46	.dwtag  DW_TAG_const_type
	.dwattr $C$DW$T$46, DW_AT_type(*$C$DW$T$45)
$C$DW$T$47	.dwtag  DW_TAG_pointer_type
	.dwattr $C$DW$T$47, DW_AT_type(*$C$DW$T$46)
	.dwattr $C$DW$T$47, DW_AT_address_class(0x20)
$C$DW$T$87	.dwtag  DW_TAG_pointer_type
	.dwattr $C$DW$T$87, DW_AT_type(*$C$DW$T$45)
	.dwattr $C$DW$T$87, DW_AT_address_class(0x20)
$C$DW$T$88	.dwtag  DW_TAG_typedef, DW_AT_name("va_list")
	.dwattr $C$DW$T$88, DW_AT_type(*$C$DW$T$87)
	.dwattr $C$DW$T$88, DW_AT_language(DW_LANG_C)
	.dwattr $C$DW$T$88, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/stdarg.h")
	.dwattr $C$DW$T$88, DW_AT_decl_line(0x2f)
	.dwattr $C$DW$T$88, DW_AT_decl_column(0x12)
	.dwattr $C$DW$CU, DW_AT_language(DW_LANG_C)

;***************************************************************
;* DWARF CIE ENTRIES                                           *
;***************************************************************

$C$DW$CIE	.dwcie 19
	.dwcfi	cfa_register, 31
	.dwcfi	cfa_offset, 0
	.dwcfi	undefined, 0
	.dwcfi	undefined, 1
	.dwcfi	undefined, 2
	.dwcfi	undefined, 3
	.dwcfi	undefined, 4
	.dwcfi	undefined, 5
	.dwcfi	undefined, 6
	.dwcfi	undefined, 7
	.dwcfi	undefined, 8
	.dwcfi	undefined, 9
	.dwcfi	same_value, 10
	.dwcfi	same_value, 11
	.dwcfi	same_value, 12
	.dwcfi	same_value, 13
	.dwcfi	same_value, 14
	.dwcfi	same_value, 15
	.dwcfi	undefined, 16
	.dwcfi	undefined, 17
	.dwcfi	undefined, 18
	.dwcfi	undefined, 19
	.dwcfi	undefined, 20
	.dwcfi	undefined, 21
	.dwcfi	undefined, 22
	.dwcfi	undefined, 23
	.dwcfi	undefined, 24
	.dwcfi	undefined, 25
	.dwcfi	same_value, 26
	.dwcfi	same_value, 27
	.dwcfi	same_value, 28
	.dwcfi	same_value, 29
	.dwcfi	same_value, 30
	.dwcfi	same_value, 31
	.dwcfi	same_value, 32
	.dwcfi	undefined, 33
	.dwcfi	undefined, 34
	.dwcfi	undefined, 35
	.dwcfi	undefined, 36
	.dwcfi	undefined, 37
	.dwcfi	undefined, 38
	.dwcfi	undefined, 39
	.dwcfi	undefined, 40
	.dwcfi	undefined, 41
	.dwcfi	undefined, 42
	.dwcfi	undefined, 43
	.dwcfi	undefined, 44
	.dwcfi	undefined, 45
	.dwcfi	undefined, 46
	.dwcfi	undefined, 47
	.dwcfi	undefined, 48
	.dwcfi	undefined, 49
	.dwcfi	undefined, 50
	.dwcfi	undefined, 51
	.dwcfi	undefined, 52
	.dwcfi	undefined, 53
	.dwcfi	undefined, 54
	.dwcfi	undefined, 55
	.dwcfi	undefined, 56
	.dwcfi	undefined, 57
	.dwcfi	undefined, 58
	.dwcfi	undefined, 59
	.dwcfi	undefined, 60
	.dwcfi	undefined, 61
	.dwcfi	undefined, 62
	.dwcfi	undefined, 63
	.dwcfi	undefined, 64
	.dwcfi	undefined, 65
	.dwcfi	undefined, 66
	.dwcfi	undefined, 67
	.dwcfi	undefined, 68
	.dwcfi	undefined, 69
	.dwcfi	undefined, 70
	.dwcfi	undefined, 71
	.dwcfi	undefined, 72
	.dwcfi	undefined, 73
	.dwcfi	undefined, 74
	.dwcfi	undefined, 75
	.dwcfi	undefined, 76
	.dwcfi	undefined, 77
	.dwcfi	undefined, 78
	.dwcfi	undefined, 79
	.dwcfi	undefined, 80
	.dwcfi	undefined, 81
	.dwcfi	undefined, 82
	.dwcfi	undefined, 83
	.dwcfi	undefined, 84
	.dwcfi	undefined, 85
	.dwcfi	undefined, 86
	.dwcfi	undefined, 87
	.dwcfi	undefined, 88
	.dwcfi	undefined, 89
	.dwcfi	undefined, 90
	.dwcfi	undefined, 91
	.dwcfi	undefined, 92
	.dwcfi	undefined, 93
	.dwcfi	undefined, 94
	.dwcfi	undefined, 95
	.dwcfi	undefined, 96
	.dwcfi	undefined, 97
	.dwcfi	undefined, 98
	.dwcfi	undefined, 99
	.dwcfi	undefined, 100
	.dwcfi	undefined, 101
	.dwcfi	undefined, 102
	.dwcfi	undefined, 103
	.dwcfi	undefined, 104
	.dwcfi	undefined, 105
	.dwcfi	undefined, 106
	.dwcfi	undefined, 107
	.dwcfi	undefined, 108
	.dwcfi	undefined, 109
	.dwcfi	undefined, 110
	.dwcfi	undefined, 111
	.dwcfi	undefined, 112
	.dwcfi	undefined, 113
	.dwcfi	undefined, 114
	.dwcfi	undefined, 115
	.dwcfi	undefined, 116
	.dwcfi	undefined, 117
	.dwcfi	undefined, 118
	.dwcfi	undefined, 119
	.dwcfi	undefined, 120
	.dwcfi	undefined, 121
	.dwcfi	undefined, 122
	.dwcfi	undefined, 123
	.dwcfi	undefined, 124
	.dwcfi	undefined, 125
	.dwcfi	undefined, 126
	.dwcfi	undefined, 127
	.dwendentry
	.dwendtag $C$DW$CU

这里包含一些选项,一些汇编语句,这里需要注意的是,你可以看到代码后边的路径跟每个电脑,或者说跟每个安装CCS具体电脑是有关系的,而且使用的是绝对路径,所以这个工程如果编译成Debug模式的话,CCS就是通过这些路径来找相应的文件的

$C$DW$1	.dwtag  DW_TAG_subprogram, DW_AT_name("_itoll")
	.dwattr $C$DW$1, DW_AT_TI_symbol_name("_itoll")
	.dwattr $C$DW$1, DW_AT_type(*$C$DW$T$14)
	.dwattr $C$DW$1, DW_AT_declaration
	.dwattr $C$DW$1, DW_AT_external
	.dwattr $C$DW$1, DW_AT_decl_file("C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include/c6x.h")
	.dwattr $C$DW$1, DW_AT_decl_line(0xdf)
	.dwattr $C$DW$1, DW_AT_decl_column(0x0b)

可以看到如果使用相对路径,这样的话,整个工程从你的电脑转移到其他电脑的话,程序也会找到相应的文件

$C$DW$6	.dwtag  DW_TAG_subprogram, DW_AT_name("GPIOBank0Pin5PinMuxSetup")
	.dwattr $C$DW$6, DW_AT_TI_symbol_name("GPIOBank0Pin5PinMuxSetup")
	.dwattr $C$DW$6, DW_AT_declaration
	.dwattr $C$DW$6, DW_AT_external
	.dwattr $C$DW$6, DW_AT_decl_file("../../../Include/StarterWare/Drivers/c674x/c6748/TL6748.h")
	.dwattr $C$DW$6, DW_AT_decl_line(0x20)
	.dwattr $C$DW$6, DW_AT_decl_column(0x0d)

但是如果你使用的是绝对路径,在编译之后就找不到相应的文件,所以如果要我们在CCS仿真时候找到相应文件相应的语句,我们就必须重新编译StartWare当中的库文件。

那么怎么编译呢?
首先我们需要将StartWare,cgt_ccs的工程导入,
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
路径为:

C:\ti\C6748_StarterWare_1_20_04_01\build\c674x\cgt_ccs

因为我们主要用到的是驱动库,所以找到驱动库,打钩,点击Finish完成添加。
在这里插入图片描述
这样驱动库就被导入到我们的工程里面。
一般情况下我们会看到一个警告,警告的目的是说这个工程
在这里插入图片描述
首先解决找不到路径的问题,这是由于文件结构导致的。
在这里插入图片描述
在这里设置了一个变量,变量地址是drivers工程的目录
在这里插入图片描述
在这里插入图片描述
头文件包含时要编辑方框内的包含路径,将
在这里插入图片描述
目录下的文件包含,如果不正确的时候可以根据路径的情况修改/..的数量,使包含到指定的路径。
然后发现只有一条警告了。
在这里插入图片描述
这句警告额目的是说这个工程在创建的时候所配置的编译工具链它的版本要比我们现在使用的旧,警告内容如下:
Description Resource Path Location Type This project was created using a version of compiler that is not currently installed: 7.2.1 [C6000]. Another version of the compiler will be used during build: 7.4.16. Go to 'Help > Check for Updates' page to check for updates and visit <a href="liveaction:OpenAppCenter">CCS App Center</a> to get the latest compilers. Go to 'Help > Install New Software...' to install older compilers. Alternatively, migrate the project to one of the available compiler versions by adjusting project properties. drivers_c674x_c6748 properties Problems
描述资源路径位置类型 此项目是使用当前未安装的编译器版本创建的:7.2.1 [C6000]。编译时将使用另一个版本的编译器:7.4.16。进入“帮助>检查更新”页面查看更新,并访问CCS应用中心获取最新编译器。去帮助>安装新软件…安装旧的编译器。或者,通过调整项目属性将项目迁移到一个可用的编译器版本。

我们可以通过工程的属性来修改这个版本,从7.2.1修改为7.4.16。
在这里插入图片描述
然后重新编译这个工程,点击Rebulid Project,电脑需要一段时间来重新编译。
Console命令行打印的log如下:

**** Build of configuration Debug for project drivers_c674x_c6748 ****

"C:\\ti\\ccsv6\\utils\\bin\\gmake" -k all 
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/cppi41dma.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="cppi41dma.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/cppi41dma.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/cppi41dma.c'
' '
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/edma.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="edma.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/edma.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/edma.c'
' '
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/ehrpwm.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="ehrpwm.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/ehrpwm.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/ehrpwm.c'
' '
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/emac.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="emac.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/emac.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/emac.c'
' '
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/emifa.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="emifa.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/emifa.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/emifa.c'
' '
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/gpio.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="gpio.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/gpio.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/gpio.c'
' '
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/i2c.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="i2c.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/i2c.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/i2c.c'
' '
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/lan8710a.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="lan8710a.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/lan8710a.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/lan8710a.c'
' '
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/lidd.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="lidd.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/lidd.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/lidd.c'
' '
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/mcasp.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="mcasp.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/mcasp.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/mcasp.c'
' '
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/mdio.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="mdio.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/mdio.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/mdio.c'
' '
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/psc.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="psc.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/psc.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/psc.c'
' '
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/raster.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="raster.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/raster.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/raster.c'
' '
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/rtc.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="rtc.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/rtc.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/rtc.c'
' '
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/spi.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="spi.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/spi.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/spi.c'
' '
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/timer.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="timer.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/timer.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/timer.c'
' '
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/uart.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="uart.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/uart.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/uart.c'
' '
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/usb.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="usb.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/usb.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/usb.c'
' '
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/usbphyGS60.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="usbphyGS60.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/usbphyGS60.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/usbphyGS60.c'
' '
'Building file: C:/ti/C6748_StarterWare_1_20_04_01/drivers/vpif.c'
'Invoking: C6000 Compiler'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/cl6x" -mv6740 --abi=eabi -g --include_path="C:/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/hw" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/include/c674x/c6748" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/grlib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/usblib/include" --include_path="C:/ti/C6748_StarterWare_1_20_04_01/nandlib/include" --gcc --define=c6748 --diag_warning=225 --preproc_with_compile --preproc_dependency="vpif.d"  "C:/ti/C6748_StarterWare_1_20_04_01/drivers/vpif.c"
'Finished building: C:/ti/C6748_StarterWare_1_20_04_01/drivers/vpif.c'
' '
'Building target: drivers.lib'
'Invoking: C6000 Archiver'
"C:/ti/ccsv6/tools/compiler/c6000_7.4.16/bin/ar6x" r "drivers.lib" "./cppi41dma.obj" "./edma.obj" "./ehrpwm.obj" "./emac.obj" "./emifa.obj" "./gpio.obj" "./i2c.obj" "./lan8710a.obj" "./lidd.obj" "./mcasp.obj" "./mdio.obj" "./psc.obj" "./raster.obj" "./rtc.obj" "./spi.obj" "./timer.obj" "./uart.obj" "./usb.obj" "./usbphyGS60.obj" "./vpif.obj"  
  ==>  new archive 'drivers.lib'
  ==>  building archive 'drivers.lib'
'Finished building target: drivers.lib'
' '
已复制         1 个文件。
' '

**** Build Finished ****

编译的输出窗口最后打印“已复制 1 个文件”,这是因为我们在这个工程当中CCS或者说TI默认在工程中加入了一个编译后的命令,它将编译后的库文件通过一个命令复制到相应的目录。
在这里插入图片描述
这里执行的是我们在Windows下的命令行命令:

@mkdir ..\..\..\..\..\..\binary\c674x\cgt_ccs\c6748\drivers\Debug & copy drivers.lib ..\..\..\..\..\..\binary\c674x\cgt_ccs\c6748\drivers\Debug\drivers.lib

首先创建一个目录,使用mkdir创建一个目录,然后将编译后的驱动库再放置到相应的目录,这样的话每次编译都将相应的库文件自动替换,我们可以通过重新编译这个库文件然后使用这个库文件来替代默认的TI库,这样的话在调试一些库函数的时候CCS就会自动找到库函数所对应的文件。

注意:
@mkdir ..\..\..\..\..\..\binary\c674x\cgt_ccs\c6748\drivers\Debug & copy drivers.lib ..\..\..\..\..\..\binary\c674x\cgt_ccs\c6748\drivers\Debug\drivers.lib
以上这个命令存在问题,这个命令会导致在C盘根目录下依次创建\binary\c674x\cgt_ccs\c6748\drivers\Debug文件夹并把drivers.lib复制进去。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点灯小能手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值