纠结了几天,是应该先写一些自己零基础学习DSP的步骤还是直接奔着预定的项目去,现在还是先写写自己的一些学习经验吧。
首先我今天准备点一个灯,并在串口打印,按键可以控制灯的开始暂停等,串口也可以控制开始和暂停。首先需要看清这个任务的实质:1,点灯;2,按键控制;3,串口。所以,需要在官方给出的三个程序中的一个进行修改,我就是从led那个例程开始修改的。
首先打开工程,导入StarterWare(这个是
ti给的不带操作系统的裸机驱动库,按照给的学习例程学习TMS320C6748会快很多)。按照教程导入“TMS320C6748.ccxml”文件,导入创龙给的gel文件,右键连接调试器。连接成功后如下图:
打开导入的工程“GPIO_LED”,并打开其中的main.c文件:
首先我将原先的代码修改了一下,就是将底板和核心板上的六个LED全部依次点亮,具体的代码是:
- /****************************************************************************/
- /* */
- /* 底板 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" // 通用输入输出口宏及设备抽象层函数声明
- /****************************************************************************/
- /* */
- /* 宏定义 */
- /* */
- /****************************************************************************/
- // 软件断点
- #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(;;)
- {
- // 延时
- Delay(0x00FFFFFF);
- GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_LOW); // D10 灭 GPIO0[2]
- GPIOPinWrite(SOC_GPIO_0_REGS, 2, GPIO_PIN_HIGH); // D7 亮 GPIO0[0]
- // 延时
- Delay(0x00FFFFFF);
- GPIOPinWrite(SOC_GPIO_0_REGS, 2, GPIO_PIN_LOW); // D7 灭 GPIO0[0]
- GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_HIGH); // D6 亮 GPIO0[5]
- // 延时
- Delay(0x00FFFFFF);
- GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_LOW); // D6 灭 GPIO0[5]
- GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_HIGH); // D9 亮 GPIO0[1]
- // 延时
- Delay(0x00FFFFFF);
- GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_LOW); // D6 灭 GPIO0[5]
- GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_HIGH); // D9 亮 GPIO0[1]
- // 延时
- Delay(0x00FFFFFF);
- GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_LOW); // D9 灭 GPIO0[1]
- GPIOPinWrite(SOC_GPIO_0_REGS, 109, GPIO_PIN_HIGH); // D10 亮 GPIO0[2]
- // 延时
- Delay(0x00FFFFFF);
- GPIOPinWrite(SOC_GPIO_0_REGS, 109, 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
- GPIOBank0Pin0PinMuxSetup();
- GPIOBank0Pin1PinMuxSetup();
- GPIOBank0Pin2PinMuxSetup();
- GPIOBank0Pin5PinMuxSetup();
- }
- /****************************************************************************/
- /* */
- /* 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]
- // 底板 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]
- }
- /****************************************************************************/
- /* */
- /* 延时 */
- /* */
- /****************************************************************************/
- void Delay(unsigned int n)
- {
- unsigned int i;
- for(i=n;i>0;i--);
- }
复制代码将这个代码编译一下:右键工程选择编译当前的工程,就可以生成可执行的.out文件。
生成的可执行文件在对应工程的debug目录下面而不是“Binary”目录下面(这个问题找了一下,才发现的。。T_T)。
点击“Run”-》“Load”-》“Load Program”,选择刚才生成的GPIO_LED.out:
点击OK以后刚才生成的.out文件就可以开始调试了,点击debug选项卡里面的执行按钮:
就可以看到TL6748板子上的六个LED依次闪烁了。
需要说明的是,这种执行的方法是在只能在debug模式看到对应的现象,如果断电重启的话,代码就被清空了,所以如果代码需要在每次上电的时候能够开始执行的话,我们需要将其写入flash中,这个过程在创龙的用户手册上有详细的描述,如果有什么迷惑的地方的话留言给我,我们相互探讨一下。
- /****************************************************************************/
- /* */
- /* 按键中断测试 */
- /* */
- /* 2014年4月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 "interrupt.h" // DSP C6748 中断相关应用程序接口函数声明及系统事件号定义
- /****************************************************************************/
- /* */
- /* 宏定义 */
- /* */
- /****************************************************************************/
- // 软件断点
- #define SW_BREAKPOINT asm(" SWBP 0 ");
- /****************************************************************************/
- /* */
- /* 全局变量 */
- /* */
- /****************************************************************************/
- unsigned char Flag=0;
- /****************************************************************************/
- /* */
- /* 函数声明 */
- /* */
- /****************************************************************************/
- // 外设使能配置
- void PSCInit(void);
- // GPIO 管脚复用配置
- void GPIOBankPinMuxSet();
- // GPIO 管脚初始化
- void GPIOBankPinInit();
- // GPIO 管脚中断初始化
- void GPIOBankPinInterruptInit(void);
- // DSP 中断初始化
- void InterruptInit(void);
- // 中断服务函数
- void USER0KEYIsr(void);
- void USER1KEYIsr(void);
- /****************************************************************************/
- /* */
- /* 主函数 */
- /* */
- /****************************************************************************/
- void delay(unsigned int count)
- {
- unsigned int i,j;
- for(j=0;j<count;j++)
- for(i=0x003FFFFF;i>0;i--); // 延时
- }
- int main(void)
- {
- // 外设使能配置
- PSCInit();
-
- // GPIO 管脚复用配置
- GPIOBankPinMuxSet();
- // GPIO 管脚初始化
- GPIOBankPinInit();
- // DSP 中断初始化
- InterruptInit();
- // GPIO 管脚中断初始化
- GPIOBankPinInterruptInit();
- // 主循环
- for(;;)
- {
- // 亦可以使用查询法查询中断状态
- if(Flag)
- {
- // 核心板 LED
- delay(1);
- GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_LOW);
- GPIOPinWrite(SOC_GPIO_0_REGS, 109, GPIO_PIN_HIGH);
- GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_HIGH);
- delay(1);
- GPIOPinWrite(SOC_GPIO_0_REGS, 109, GPIO_PIN_LOW);
- GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_HIGH);
- GPIOPinWrite(SOC_GPIO_0_REGS, 2, GPIO_PIN_HIGH);
- delay(1);
- GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_LOW);
- GPIOPinWrite(SOC_GPIO_0_REGS, 2, GPIO_PIN_HIGH);
- GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_HIGH);
- delay(1);
- GPIOPinWrite(SOC_GPIO_0_REGS, 2, GPIO_PIN_LOW);
- GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_HIGH);
- GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_HIGH);
- delay(1);
- GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_LOW);
- GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_HIGH);
- GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_HIGH);
- delay(1);
- GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_LOW);
- GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_HIGH);
- GPIOPinWrite(SOC_GPIO_0_REGS, 109, GPIO_PIN_HIGH);
- }
- }
- }
- /****************************************************************************/
- /* */
- /* 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();
- GPIOBank6Pin13PinMuxSetup();
- // 底板 LED
- GPIOBank0Pin0PinMuxSetup();
- GPIOBank0Pin1PinMuxSetup();
- GPIOBank0Pin2PinMuxSetup();
- GPIOBank0Pin5PinMuxSetup();
- // 底板按键
- GPIOBank0Pin6PinMuxSetup();
- GPIOBank6Pin1PinMuxSetup();
- }
- /****************************************************************************/
- /* */
- /* 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]
- // 底板 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, 7, GPIO_DIR_INPUT); // USER0 KEY GPIO0[6]
- GPIODirModeSet(SOC_GPIO_0_REGS, 98, GPIO_DIR_INPUT); // USER1 KEY GPIO6[1]
- }
- /****************************************************************************/
- /* */
- /* GPIO 管脚中断初始化 */
- /* */
- /****************************************************************************/
- void GPIOBankPinInterruptInit(void)
- {
- // 底板按键中断
- // 配置 USER0 KEY GPIO0[6] 为下降沿触发
- GPIOIntTypeSet(SOC_GPIO_0_REGS, 7, GPIO_INT_TYPE_FALLEDGE);
- // 配置 USER1 KEY GPIO6[1] 为上升沿及下降沿触发
- GPIOIntTypeSet(SOC_GPIO_0_REGS, 98, GPIO_INT_TYPE_BOTHEDGE);
- // 使能 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 中断初始化 */
- /* */
- /****************************************************************************/
- void InterruptInit(void)
- {
- // 初始化 DSP 中断控制器
- IntDSPINTCInit();
- // 使能 DSP 全局中断
- IntGlobalEnable();
- }
- /****************************************************************************/
- /* */
- /* 中断服务函数 */
- /* */
- /****************************************************************************/
- void USER0KEYIsr(void)
- {
- // 软件断点 方便调试
- //SW_BREAKPOINT;
- // 禁用 GPIO BANK 0 中断
- GPIOBankIntDisable(SOC_GPIO_0_REGS, 0);
- // 清除 GPIO BANK 0 中断状态
- IntEventClear(SYS_INT_GPIO_B0INT);
- if(GPIOPinIntStatus(SOC_GPIO_0_REGS, 7) == GPIO_INT_PEND)
- {
- // 清除 GPIO0[6] 中断状态
- GPIOPinIntClear(SOC_GPIO_0_REGS, 7);
- Flag=1;
- }
-
- // 使能 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);
- if(GPIOPinIntStatus(SOC_GPIO_0_REGS, 98) == GPIO_INT_PEND)
- {
- // 清除 GPIO6[1] 中断状态
- GPIOPinIntClear(SOC_GPIO_0_REGS, 98);
-
- Flag=0;
- }
- // 使能 GPIO BANK 6 中断
- GPIOBankIntEnable(SOC_GPIO_0_REGS, 6);
- }
复制代码通过底板上的SW5 USER0开始流水灯,通过SW6 USER1暂停流水灯。
这个注释不是我写的,是创龙官方给的例程,我只是在他们的基础上稍微做了修改的
一周热门 更多>