完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 mameng 于 2016-1-3 17:14 编辑 1 GPIO 库函数操作。L6748板载4颗用户LED看看LED的电路连接,四个LED连在了GPIO0[5] 、GPIO0[0] 、GPIO0[1] 、GPIO0[2] DEMO程序,库函数感觉和STM32差不多,位操作,GPIOPinWrit (),baseAdd--GPIO基址, pinNumber--GPIO管脚号,bitValue--管脚电平值 2 GPIO DMA操作 ,即直接存储存取控制器,无需CPU干预,从而减轻CPU的负担。在TMS320C6748 中是 EDMA3 即第三代增强型内存直接访问控制器。EDMA3主要包含两部分:通道控制器(EMDA3CC)、传输控制器 。 (EDMA3TC)。通道控制器(EDMA3CC)负责控制 EDMA3 传输的触发 源/类型、DMA/QDMA通道、事件队列、参数RAM 和提交传输请求到传输控制器 (EDMA3TC ),而传输控制器(EDMA3TC)依据 通道控制器(EDMA3CC)命令对数据进行传输,传输完成向通道控制器(EDMA3CC)反馈传输完成。期间通道控制器(EDMA3CC)检测数据传输是否正确以及传输是否完成并触发相应的中断。 DEMO int main(void) { // 外设使能配置 PSCInit(); // DSP 中断初始化 Interruptinit(); // EDMA3 中断初始化 EDMA3InterruptInit(); // EDMA3 初始化 EDMA3UARTInit(); // 初始化串口终端 使用串口2 UARTStdioInit(); // 申请串口 EDMA3 发送通道 EDMA3RequestChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA, EDMA3_CHA_UART2_TX, EDMA3_CHA_UART2_TX, EVT_QUEUE_NUM); // 注册回调函数 cb_Fxn[EDMA3_CHA_UART2_TX] = &callback; // 申请串口 EDMA3 接收通道 EDMA3RequestChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA, EDMA3_CHA_UART2_RX, EDMA3_CHA_UART2_RX, EVT_QUEUE_NUM); // 注册回调函数 cb_Fxn[EDMA3_CHA_UART2_RX] = &callback; volatile char enter[] = "Tronlong UART2 EDMA3 Application......nrPlease Enter 20 bytes from keyboardrn"; volatile char buffer[RX_BUFFER_SIZE]; unsigned int buffLength = 0; // 发送数据 buffLength = strlen((const char *)enter); UartTransmitData(EDMA3_CHA_UART2_TX, EDMA3_CHA_UART2_TX, enter, buffLength); // 使能串口 DMA 模式 UARTDMAEnable(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1 | UART_DMAMODE | UART_FIFO_MODE ); // 等待从回调函数返回 while(flag == 0); flag = 0; // 接收数据 UartReceiveData(EDMA3_CHA_UART2_RX, EDMA3_CHA_UART2_RX, buffer); // 使能串口 DMA 模式 UARTDMAEnable(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1 | UART_DMAMODE | UART_FIFO_MODE ); // 等待从回调函数返回 while(flag == 0); flag = 0; // 发送数据 UartTransmitData(EDMA3_CHA_UART2_TX, EDMA3_CHA_UART2_TX, buffer, RX_BUFFER_SIZE); // 使能串口 DMA 模式 UARTDMAEnable(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1 | UART_DMAMODE | UART_FIFO_MODE ); // 等待从回调函数返回 while(flag == 0); flag = 0; // 释放 EDMA3 通道 EDMA3FreeChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA, EDMA3_CHA_UART2_TX, EDMA3_TRIG_MODE_EVENT, EDMA3_CHA_UART2_TX, EVT_QUEUE_NUM); EDMA3FreeChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA, EDMA3_CHA_UART2_RX, EDMA3_TRIG_MODE_EVENT, EDMA3_CHA_UART2_RX, EVT_QUEUE_NUM); // 主循环 for(;;) { } } void Edma3ComplHandlerIsr(void) { volatile unsigned int pendingIrqs; volatile unsigned int isIPR = 0; unsigned int indexl; unsigned int Cnt = 0; indexl = 1; IntEventClear(SYS_INT_EDMA3_0_CC0_INT1); isIPR = HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_S_IPR(1)); if(isIPR) { while((Cnt < EDMA3CC_COMPL_HANDLER_RETRY_COUNT)&& (indexl != 0u)) { indexl = 0u; pendingIrqs = HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_S_IPR(1)); while(pendingIrqs) { if((pendingIrqs & 1u) == TRUE) { HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_S_ICR(1)) = (1u << indexl); (*cb_Fxn[indexl])(indexl, EDMA3_XFER_COMPLETE); } ++indexl; pendingIrqs >>= 1u; } Cnt++; } } } void Edma3CCErrHandlerIsr() { volatile unsigned int pendingIrqs = 0; unsigned int regionNum = 0; unsigned int evtqueNum = 0; unsigned int index = 1; unsigned int Cnt = 0; IntEventClear(SYS_INT_EDMA3_0_CC0_ERRINT); if((HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_EMR) != 0 ) || (HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_QEMR) != 0) || (HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_CCERR) != 0)) { while((Cnt < EDMA3CC_ERR_HANDLER_RETRY_COUNT) && (index != 0u)) { index = 0u; pendingIrqs = HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_EMR); while(pendingIrqs) { if((pendingIrqs & 1u) == TRUE) { HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_EMCR) = (1u< ++index; pendingIrqs >>= 1u; } index = 0u; pendingIrqs = HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_QEMR); while(pendingIrqs) { if((pendingIrqs & 1u)==TRUE) { HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_QEMCR) = (1u< ++index; pendingIrqs >>= 1u; } index = 0u; pendingIrqs = HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_CCERR); if(pendingIrqs != 0u) { for(evtqueNum = 0u; evtqueNum < EDMA3_0_NUM_EVTQUE; evtqueNum++) { if((pendingIrqs & (1u << evtqueNum)) != 0u) { HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_CCERRCLR) = (1u << evtqueNum); } } if ((pendingIrqs & (1 << EDMA3CC_CCERR_TCCERR_SHIFT)) != 0u) { HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_CCERRCLR) = (0x01u << EDMA3CC_CCERR_TCCERR_SHIFT); } ++index; } Cnt++; } } } /****************************************************************************/ /* */ /* 发送数据 */ /* */ /****************************************************************************/ void UartTransmitData(unsigned int tccNum, unsigned int chNum, volatile char *buffer, unsigned int buffLength) { EDMA3CCPaRAMEntry paramSet; // 配置参数 RAM paramSet.srcAddr = (unsigned int)buffer; // 接收缓存寄存器 / 发送保持寄存器 地址 paramSet.destAddr = SOC_UART_2_REGS + 0; paramSet.aCnt = MAX_ACNT; paramSet.bCnt = (unsigned short)buffLength; paramSet.cCnt = MAX_CCNT; // 源索引自增系数 1 即一个字节 paramSet.srcBIdx = (short)1u; // 目标索引自增系数 paramSet.destBIdx = (short)0u; // 异步传输模式 paramSet.srcCIdx = (short)0u; paramSet.destCIdx = (short)0u; paramSet.linkAddr = (unsigned short)0xFFFFu; paramSet.bCntReload = (unsigned short)0u; paramSet.opt = 0x00000000u; paramSet.opt |= (EDMA3CC_OPT_DAM ); paramSet.opt |= ((tccNum << EDMA3CC_OPT_TCC_SHIFT) & EDMA3CC_OPT_TCC); paramSet.opt |= (1 << EDMA3CC_OPT_TCINTEN_SHIFT); // 写参数 RAM EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, chNum, ¶mSet); // 使能 EDMA3 通道 EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, chNum, EDMA3_TRIG_MODE_EVENT); } /****************************************************************************/ /* */ /* 接收数据 */ /* */ /****************************************************************************/ void UartReceiveData(unsigned int tccNum, unsigned int chNum, volatile char *buffer) { EDMA3CCPaRAMEntry paramSet; // 配置参数 RAM // 接收缓存寄存器 / 发送保持寄存器 地址 paramSet.srcAddr = SOC_UART_2_REGS + 0; paramSet.destAddr = (unsigned int)buffer; paramSet.aCnt = MAX_ACNT; paramSet.bCnt = RX_BUFFER_SIZE; paramSet.cCnt = MAX_CCNT; // 源索引自增系数 paramSet.srcBIdx = 0; // 目标索引自增系数 1 即一个字节 paramSet.destBIdx = 1; // 异步模式 paramSet.srcCIdx = 0; paramSet.destCIdx = 0; paramSet.linkAddr = (unsigned short)0xFFFFu; paramSet.bCntReload = 0; paramSet.opt = 0x00000000u; paramSet.opt |= ((EDMA3CC_OPT_SAM) << EDMA3CC_OPT_SAM_SHIFT); paramSet.opt |= ((tccNum << EDMA3CC_OPT_TCC_SHIFT) & EDMA3CC_OPT_TCC); paramSet.opt |= (1 << EDMA3CC_OPT_TCINTEN_SHIFT); // 写参数 RAM EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, chNum, ¶mSet); // 使能 EDMA3 通道 EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, chNum, EDMA3_TRIG_MODE_EVENT); } /****************************************************************************/ /* */ /* 回调函数 */ /* */ /****************************************************************************/ void callback(unsigned int tccNum, unsigned int status) { UARTDMADisable(SOC_UART_2_REGS, (UART_RX_TRIG_LEVEL_1 | UART_FIFO_MODE)); flag = 1; } 3 中断 GPIO的中断有两种触发方式 上升沿触发 下降沿触发 上升沿下降沿都触发 GPIO口寄存器配置下, 1: PSCInit(); // 外设使能配置 2: GPIOBankPinMuxSet(); // GPIO 管脚复用配置 3: GPIOBankPinInit(); // GPIO 管脚初始化(管脚初始化的时候 中断管脚应该设置为输入方式) 4://选择中断触发方式 GPIOIntTypeSet(SOC_GPIO_0_REGS,7,GPIO_INT_TYPE_FALLEDGE); GPIOIntTypeSet(SOC_GPIO_0_REGS,98,GPIO_INT_TYPE_FALLEDGE); 这里选择的是下降沿触发 5://使能相应中断触发组 GPIOBankIntEnable(SOC_GPIO_0_REGS, 0); // USER0 KEY GPIO0 GPIOBankIntEnable(SOC_GPIO_0_REGS, 6); // USER1 KEY GPIO6 6 //注册中断服务函数 IntRegister(C674X_MASK_INT4, USER2KEYIsr); IntRegister(C674X_MASK_INT5, USER1KEYIsr); USER2KEYIsr是中断函数,函数原型是void (*userISR)(void),名字是自己起的,通过指针把中断函数映射到中断向量表中 7:// 映射中断到 DSP 可屏蔽中断 IntEventMap(C674X_MASK_INT4, SYS_INT_GPIO_B0INT); IntEventMap(C674X_MASK_INT5, SYS_INT_GPIO_B6INT); 8:// 使能 DSP 可屏蔽中断 IntEnable(C674X_MASK_INT4); IntEnable(C674X_MASK_INT5); 9,中断函数: void USER2KEYIsr(void) { GPIOBankIntDisable(SOC_GPIO_0_REGS,0); IntEventClear(SYS_INT_GPIO_B0INT); if(GPIOPinIntStatus(SOC_GPIO_0_REGS,7) == GPIO_INT_PEND) { GPIOPinIntClear(SOC_GPIO_0_REGS, 7); LED1= (~LED1); } GPIOBankIntEnable(SOC_GPIO_0_REGS,0); } void USER1KEYIsr(void) { GPIOBankIntDisable(SOC_GPIO_0_REGS,6); IntEventClear(SYS_INT_GPIO_B6INT); if(GPIOPinIntStatus(SOC_GPIO_0_REGS,98) == GPIO_INT_PEND) { GPIOPinIntClear(SOC_GPIO_0_REGS, 98); LED2= (~LED2); } GPIOBankIntEnable(SOC_GPIO_0_REGS,6); } 最后在初始化中断函数时一定一定一定(总要话说三遍)要 // 初始化 DSP 中断控制器 IntDSPINTCInit(); // 使能 DSP 全局中断 IntGlobalEnable(); |
|
相关推荐
|
|
楼主能不能分享下光盘资料呢,谢谢了!我是新手入门学习
|
|
|
|
|
|
基于 DSP5509 进行数字图像处理中 Sobel 算子边缘检测的硬件连接电路图
2343 浏览 0 评论
681 浏览 0 评论
普中科技F28335开发板中,如何使用aic23播放由代码生成的正弦波
2780 浏览 0 评论
3541 浏览 1 评论
1194 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 19:09 , Processed in 0.630689 second(s), Total 75, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号