一、项目目的:

  1. 开发环境安装、硬件的连接方法;
  2. 项目文件的构成;
  3. GPIO的寄存器的配置方法;
  4. 学习使用 TMS320DM6437 的通用 IO 端口控制指示灯;
  5. 断点的设置及运用。

    二、项目内容:

    1、安装步骤

    为了顺利安装和使用 Code Composer Studio(CCS)软件,请按照以下步骤进行操作。本指南假定用户将 CCS 安装在默认目录 C:\,并建议用户按默认安装目录安装
    ⑴ 将项目箱附带的教学光盘插入计算机光盘驱动器。
    ⑵将光盘资料拷贝到本地磁盘,找到 CCS5 软件目录。
    ⑶双击其中的“ccs_setup_5.x.0.00090.exe”,进入安装程序。 注意:安装之前需关闭所有杀毒软件和防火墙 安装路径和 CCS 软件存放路径不要有中文。

    ⑷选择安装路径,建议使用默认路径。

    ⑸ 选择安装模式。

    ⑹ 选择支持的芯片,这里我们可以使用默认选项。

    ⑺ 选择要安装的组件,默认选项即可。

    ⑻ 选择支持的仿真器类型,一般默认选择。

    ⑼ 等待安装结束。

    2、关于通用仿真器驱动

    (1)使用 USB 电缆(一头 A 型 USB,一头 miniUSB)连接计算器和 ICETEK-5500USB 仿真 器 连接完成后,计算机会自动安装设备驱动,等安装完毕,打开设备管理器,在端口(COM 和 LPT)中可以看到 XDS2xx Emulator CDC Serial Port 和 XDS2xx User CDC Serial Port 这 2 个设备,表示仿真器已成功驱动。
    (2)查看安装好的 ICETEK-5500USB 驱动 在桌面上用鼠标右击“我的电脑”选择“管理”→“设备管理器”→“端口(COM 和 LPT)”, 如下图所示,会发现里面新增了两个 COM 口,表示仿真器驱动程序安装成功。

    双击 ICETEK-DM6437AF-IDK-M 教学项目箱安装资料 v2.3.exe 默认安装项目程序到 C:\ICETEK 目录下。

    3、启动和设置 CCS

    启动 CCS;

    ⑴ 双击桌面上图标打开 CCS5:
    ⑵ 第一次打开 CCS5 时,会提示选择一个工作区,设置完毕后,点击 OK;⑶ 进入 CCS5 界;⑷ 第一次进入 CCS 时,会提示设置 License(授权许可),我们这里使用 ICETEK-5500USB 仿真器,需要注册,选择“ACTIVE”,点击”Next”继续,在弹出的界面添加 license 文件。 如下图所示,该文件位于 C:\ICETEK\ICETEK-DM6437-AF v2.1\common\license 中。⑸ 下一步我们就可以进行仿真调试了。在 CCS5 下进行仿真之前,我们需要设置一个目标 配置文件(Target Configuration File),该文件一般是以”.ccxml”为后缀。该文件的配置是由使用者目前要调试的硬件平台来决定的,即用户使用的仿真器型号和芯片型号。
    4、ICETEK-DSP 教学项目箱的硬件连接
    a) 连接电源:打开项目箱,关闭项目箱左上角电源开关后,使用项目箱附带的电源线连接 项目箱左侧电源插座和电源接线板。
    b) 连接 DSP 评估板信号线:当需要连接信号源输出到 A/D 输入插座时,使用信号连接线分别连接相应插座。
    c) 连接仿真器 JTAG 电缆:将 ICETEK 仿真器的 JTAG 插头插到 ICETEK– DM6437-AF 评估板的 JTAG 接口上。
    注意:除了仿真器的 USB 线缆外,任何设备不能带电连接或移除。
    d) 如图所示,ICETEK-DM6437-AF 板将指示灯 D2 连接到 TMS320DM6437 的空闲管脚上。通过程 序控制,可以使 DM6437 将这些管脚设置成通用 I/O 管脚,状态为输出,并设置输出电平,当 输出低电平时指示灯会点亮。

    e) 启动 Code Composer Studio v5 3。
    f) 打开工程文件: 工程文件目录为:C:\ICETEK\ICETEK-DM6437-AF V2.1\Lab0201-LedTest 打开源程序 LED.c 阅读程序,理解程序内容。
    g) 点击图标 ,ccs 会自动连接,编译和下载程序。
    h) 运行程序,观察结果。 退出 CCS。

    三、项目过程与结果分析:

    安装后烧录代码后可看到灯光点亮

    如何控制一个GPIO(通用输入输出)针脚来测试LED灯的功能。
    1.代码编写:
    #include "evmdm6437_led.h"// 包含与EVM(DM6437) LED相关的操作的头文件
    #include "evmdm6437_gpio.h"// 包含与EVM(DM6437) GPIO相关的操作的头文件

    // led_test函数实现,用于测试EVM(DM6437)板上LED灯
    Int16 led_test( )
    {
        Int16 i;  // 声明一个16位整型变量,用于循环计数

        EVMDM6437_GPIO_init();      // 初始化GPIO库,准备GPIO操作
        EVMDM6437_GPIO_setDir(97,0);// 将GPIO 97号针脚设置为输出模式

        // 循环8次,控制LED灯闪烁
        for(i=0; i<8; i++)
        {
            EVMDM6437_GPIO_setOutput(97,1);  // 将GPIO 97号针脚设置为高电平,熄灭LED灯
            _waitusec( 125000 );             // 等待一段时间(125毫秒)
            EVMDM6437_GPIO_setOutput(97,0);  // 将GPIO 97号针脚设置为低电平,点亮LED灯
            _waitusec( 125000 );             // 等待一段时间(125毫秒)
        }

        return 0;  // 返回0表示测试通过
    }

2.代码分析:
首先包含了两个头文件:evmdm6437_led.h 和 evmdm6437_gpio.h,它们定义了LED和GPIO操作相关的函数和宏。
led_test 函数是测试LED是否正常工作的函数,它首先调用 EVMDM6437_GPIO_init() 函数来初始化GPIO端口。
使用 EVMDM6437_GPIO_setDir(97,0) 设置GPIO针脚97为输出模式。这里的0代表输出,如果是1则代表输入模式。
在一个for循环中,循环8次,通过 EVMDM6437_GPIO_setOutput(97,1) 和 EVMDM6437_GPIO_setOutput(97,0) 交替设置GPIO针脚97的状态,实现LED灯的闪烁。1表示设置为高电平,通常导致与之相连的LED熄灭;0则设置为低电平,LED点亮。
_waitusec(125000) 函数是一个延时函数,参数125000代表延时125毫秒。所以LED灯在闪烁时会点亮125毫秒然后熄灭125毫秒。函数最后返回0,表示LED测试通过。

3.项目结果:如果一切正常,执行这段代码后,相应的LED灯应该会闪烁8次,随后函数返回,主程序打印出“ALL Tests Passed”信息,表明LED测试成功。

3.代码分析:这个LED测试函数是比较简单的硬件功能验证程序,确保了GPIO针脚可以正常操作LED灯,验证了硬件电路和软件控制代码的有效性。在实际的硬件测试中,这样的函数是非常有用的,可以快速地检查硬件部分是否已经按照预期工作。因为它只是一个简单的功能测试,不涉及复杂的错误处理和异常情况的检测。
4.寄存器设置:
EVMDM6437_GPIO_init: 该函数用于初始化GPIO模块,通常包括使能时钟和配置初始设置。
EVMDM6437_GPIO_setDir: 该函数用于配置特定GPIO引脚的方向(输入或输出)。函数参数 gpioNum 是GPIO引脚编号,direction 是方向(0表示输出,1表示输入)。
EVMDM6437_GPIO_setOutput: 该函数用于设置特定GPIO引脚的输出电平。函数参数 gpioNum 是GPIO引脚编号,output 是电平(0表示低电平,1表示高电平)。
EVMDM6437_GPIO_getInput: 该函数用于读取特定GPIO引脚的输入电平。函数参数 gpioNum 是GPIO引脚编号。

5.代码改写:

  1. 改变程序,改变灯的闪烁次数。
    如果我们想要改变LED灯的闪烁次数,我们只需要修改循环的次数。原来是循环8次闪烁,我们可以通过更改循环变量的终值来调整闪烁次数。将闪烁次数从8次改为5次:
#include "evmdm6437_led.h"   // 包含与EVM(DM6437) LED相关的操作的头文件
#include "evmdm6437_gpio.h"  // 包含与EVM(DM6437) GPIO相关的操作的头文件

// led_test函数实现,用于测试EVM(DM6437)板上LED灯
Int16 led_test()
{
    Int16 i;  // 声明一个16位整型变量,用于循环计数

    EVMDM6437_GPIO_init();      // 初始化GPIO库,准备GPIO操作
    EVMDM6437_GPIO_setDir(97, 0);// 将GPIO 97号针脚设置为输出模式

    // 循环5次,控制LED灯闪烁
    for(i = 0; i < 5; i++)
    {
        EVMDM6437_GPIO_setOutput(97, 1);  // 将GPIO 97号针脚设置为高电平,熄灭LED灯
        _waitusec(125000);                // 等待一段时间(125毫秒)
        EVMDM6437_GPIO_setOutput(97, 0);  // 将GPIO 97号针脚设置为低电平,点亮LED灯
        _waitusec(125000);                // 等待一段时间(125毫秒)
    }

    return 0;  // 返回0表示测试通过
}

for 循环的条件从 i < 8 改为了 i < 5,这就将LED灯的闪烁次数从8次减少到了5次。如果需要其他的闪烁次数,只需相应地修改循环的终值即可。例如,如果想要闪烁10次,可以将循环条件改为 i < 10

6.进一步扩展:

如果你希望闪烁次数可以动态设置,可以对代码进行进一步的修改,使得闪烁次数成为函数的一个参数。例如:

#include "evmdm6437_led.h"   // 包含与EVM(DM6437) LED相关的操作的头文件
#include "evmdm6437_gpio.h"  // 包含与EVM(DM6437) GPIO相关的操作的头文件

// led_test函数实现,用于测试EVM(DM6437)板上LED灯
Int16 led_test(Int16 flash_times)
{
    Int16 i;  // 声明一个16位整型变量,用于循环计数

    EVMDM6437_GPIO_init();      // 初始化GPIO库,准备GPIO操作
    EVMDM6437_GPIO_setDir(97, 0);// 将GPIO 97号针脚设置为输出模式

    // 循环flash_times次,控制LED灯闪烁
    for(i = 0; i < flash_times; i++)
    {
        EVMDM6437_GPIO_setOutput(97, 1);  // 将GPIO 97号针脚设置为高电平,熄灭LED灯
        _waitusec(125000);                // 等待一段时间(125毫秒)
        EVMDM6437_GPIO_setOutput(97, 0);  // 将GPIO 97号针脚设置为低电平,点亮LED灯
        _waitusec(125000);                // 等待一段时间(125毫秒)
    }

    return 0;  // 返回0表示测试通过
}

// 主函数或其他调用函数
int main()
{
    led_test(5);  // 调用led_test函数,闪烁5次
    return 0;
}

这样,可以在调用 led_test 函数时,传递不同的闪烁次数,使得代码更加灵活。