创龙科技
直播中

彭小海

8年用户 174经验值
私信 关注

修改GPIO_KEY_EDMA实验后EDMA不能执行

[tr] GPIO_KEY_EDMA实验,例程是使用KEY0(GPIO0[6])的边沿中断触发EDMA的,实验成功。为了搞明白EDMA的配置,我想改为KEY1(GPIO6[1])触发EDMA事件。结果,按KEY1时,中断的LED能够执行,但是EDMA却不能执行,数据不能从StringScr传输到StringDst,不知为什么。下面贴出经过我修改的代码,其中句末标有的是经过我修改的,其后是原来的代码,便于对照。麻烦大侠指点,谢谢。
  • #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 中断相关应用程序接口函数声明及系统事件号定义
  • #include "edma.h"                   // 直接内存访问宏及设备抽象层函数声明
  • #include "edma_event.h"             // 直接内存访问事件
  • // 软件断点
  • #define SW_BREAKPOINT     asm(" SWBP 0 ");
  • volatile char StringScr[] = "Tronlong GPIO KEY EDMA3 Application......nr";
  • 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;
  • 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);
  • }
  • /****************************************************************************/
  • /*                                                                          */
  • /*              DSP 中断初始化                                              */
  • /*                                                                          */
  • /****************************************************************************/
  • void InterruptInit(void)
  • {
  •         // 初始化 DSP 中断控制器
  •         IntDSPINTCInit();
  •         // 使能 DSP 全局中断
  •         IntGlobalEnable();
  • }
  • /****************************************************************************/
  • /*                                                                          */
  • /*              GPIO 管脚复用配置                                           */
  • /*                                                                          */
  • /****************************************************************************/
  • void GPIOBankPinMuxSet(void)
  • {
  •         // 配置相应的 GPIO 口功能为普通输入输出口
  •         // 核心板 LED
  •         GPIOBank6Pin13PinMuxSetup();
  •         // 底板按键
  •         //GPIOBank0Pin6PinMuxSetup();
  •         GPIOBank6Pin1PinMuxSetup();//my_modify
  • }
  • /****************************************************************************/
  • /*                                                                          */
  • /*              GPIO 管脚初始化                                             */
  • /*                                                                          */
  • /****************************************************************************/
  • void GPIOBankPinInit(void)
  • {
  •         // 核心板 LED
  •     GPIODirModeSet(SOC_GPIO_0_REGS, 110, GPIO_DIR_OUTPUT);  // GPIO6[13]
  •         // 底板按键
  •     //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]//my_modify
  • }
  • /****************************************************************************/
  • /*                                                                          */
  • /*              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, ¶mSet);
  •         // 使能传输
  •         EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, chNum, trigMode);
  • }
  • /****************************************************************************/
  • /*                                                                          */
  • /*              中断服务函数                                                */
  • /*                                                                          */
  • /****************************************************************************/
  • void USER0KEYIsr(void)
  • {
  •     // 禁用 GPIO BANK 6 中断
  •     GPIOBankIntDisable(SOC_GPIO_0_REGS, 6);//my_modify1,(SOC_GPIO_0_REGS, 0),unconsidered
  •     // 清除 GPIO BANK 6 中断事件
  •     IntEventClear(SYS_INT_GPIO_B6INT);//SYS_INT_GPIO_B0INT//my_modify1,unconsidered
  •     if(GPIOPinIntStatus(SOC_GPIO_0_REGS, 98) == GPIO_INT_PEND)//my_modify1,(SOC_GPIO_0_REGS, 7)
  •     {
  •                 // 清除中断状态
  •                 GPIOPinIntClear(SOC_GPIO_0_REGS, 98);//my_modify1,(SOC_GPIO_0_REGS, 7),unconsidered
  •                 // 核心板 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, 6);//my_modify,(SOC_GPIO_0_REGS, 0)
  •         // 释放之前分配的 EDMA3 通道
  •         EDMA3FreeChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA, chNum, trigMode, tccNum, evtQ);
  •         // EDMA3 初始化
  •         EDMA3GpioInit();
  • }
  • /****************************************************************************/
  • /*                                                                          */
  • /*              GPIO 管脚中断初始化                                         */
  • /*                                                                          */
  • /****************************************************************************/
  • void GPIOBankPinInterruptInit(void)
  • {
  •     // 底板按键中断
  •     // 配置 USER0 KEY GPIO0[6] 为下降沿触发
  •     GPIOIntTypeSet(SOC_GPIO_0_REGS, 98, GPIO_INT_TYPE_FALLEDGE);//my_modify1,7,unconsidered
  •     // 使能 GPIO BANK 中断
  •     GPIOBankIntEnable(SOC_GPIO_0_REGS, 6); // USER0 KEY GPIO0//my_modify1,0,unconsidered
  •         // 注册中断服务函数
  •         IntRegister(C674X_MASK_INT6, USER0KEYIsr);
  •         // 映射中断到 DSP 可屏蔽中断
  •         IntEventMap(C674X_MASK_INT6, SYS_INT_GPIO_B6INT);//my_modify,1SYS_INT_GPIO_B0INT
  •         // 使能 DSP 可屏蔽中断
  •         IntEnable(C674X_MASK_INT6);
  • }
  • /****************************************************************************/
  • /*                                                                          */
  • /*              主函数                                                      */
  • /*                                                                          */
  • /****************************************************************************/
  • int main(void)
  • {
  •         // 外设使能配置
  •         PSCInit();
  •         // 管脚复用配置
  •         GPIOBankPinMuxSet();
  •         // GPIO 管脚初始化
  •         GPIOBankPinInit();
  •         // DSP 中断初始化
  •         InterruptInit();
  •         // GPIO 管脚中断初始化
  •         GPIOBankPinInterruptInit();
  •         // EDMA3 初始化
  •         EDMA3GpioInit();
  •         // 主循环
  •         for(;;)
  •         {
  •         }
  • }






[/tr]

回帖(8)

李森

2019-6-12 15:28:56
句末标有"//my_modify"的,是经过我修改的。麻烦大侠指点。
举报

张厉界

2019-6-12 15:39:31
21 22 行要修改成 BANK6
举报

潘斯凯

2019-6-12 15:52:11
这样也是不行的:// EDMA3 配置
unsigned int chType     = EDMA3_CHANNEL_TYPE_DMA;
unsigned int chNum      = EDMA3_CHA_GPIO_BNKINT6;
unsigned int tccNum     = EDMA3_CHA_GPIO_BNKINT6;
unsigned int trigMode   = EDMA3_TRIG_MODE_EVENT;
unsigned int evtQ       = 0;




举报

刘辉

2019-6-12 16:05:31
查看EDMA3_CHA_GPIO_BNKINT0和EDMA3_CHA_GPIO_BNKINT6的定义,发现:
/* GPIO Bank0 event*/
#define EDMA3_CHA_GPIO_BNKINT0          6

/* GPIO Bank6 event(TPCC1)*/
#define EDMA3_CHA_GPIO_BNKINT6          16

其中GPIO Bank6 event说明为TPCC1,而GPIO Bank0 event却没有。
是不是对GPIO Bank6 event这样的TPCC1类型事件,要进行另外的配置?
在c6748的data sheet上也没搜索到TPCC1或TPCC,不知是啥意思。






C6748 EMDA3 有两个 TC 传输控制器所以还需要将所有的 TC0 改为 TC1[attachimg]584[/attachimg] 
举报

更多回帖

发帖
×
20
完善资料,
赚取积分