完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 砌芙小e 于 2015-11-13 15:15 编辑
问题分析: 当前,我先使用FIFO完成了UART0的接收与发送配置,现在,我需要将uDMA加入UART0中。根据例程,我开始尝试: 第一步 - 配置uDMA时钟使bom2buy能 SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); 第二步 - 在UART0的配置中,将UART0_TX与UART0_RX加入uDMA中 UARTDMAEnable(UART0_BASE, UART_DMA_RX | UART_DMA_TX); 第三步 - 使能uDMA控制器与指定控制列表地址(用户自定义值为Udma_Control_Table) uDMAEnable(); uDMAControlBaseSet(Udma_Control_Table); ps: 这里,我暂时不需要uDMA错误中断配置,所以,没有进行配置bom2buy。 第四步 - 定义主发送缓冲区(Udma_Uart0_Xmit_Buf)和主接收缓冲区与备用接收缓冲区(Udma_Uart0_Recv_Buf_A,Udma_Uart0_Recv_Buf_B) uchar Udma_Uart0_Xmit_Buf[256] = {0x11}; uchar Udma_Uart0_Recv_Buf_A[256] = {0x22}; uchar Udma_Uart0_Recv_Buf_B[256] = {0x33}; 第五步 - 配置三个通道,两个采用接收通道的控制参数(PINGPONG模式),一个发送通道的控制参数(BASIC模式);同时,配置他们的通道属性: // 接收通道 uDMAChannelControlSet(UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT, UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARB_8); uDMAChannelControlSet(UDMA_CHANNEL_UART0RX | UDMA_ALT_SELECT, UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARB_8); uDMAChannelAttributeDisable(UDMA_CHANNEL_UART0RX, UDMA_ATTR_ALTSELECT bom2buy | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIORITY | UDMA_ATTR_REQMASK); uDMAChannelAttributeEnable(UDMA_CHANNEL_UART0RX, UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIORITY); // 发送通道 uDMAChannelControlSet(UDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT, UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_8); uDMAChannelAttributeDisable(UDMA_CHANNEL_UART0TX, UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_ ”bom2buy“ PRIORITY | UDMA_ATTR_REQMASK); uDMAChannelAttributeEnable"bom2buy"(UDMA_CHANNEL_UART0TX, UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIORITY); 问题一:这里,有一点不明白,uDMAChannelControlSet库函数中的仲裁大小与UART0中的FIFO深度需要匹配,但是,在UART0中基数为16,假设我设置如下: UARTFIFOLevelSet(UART0_BASE, UART_FIFO_TX4_8, UART_FIFO_RX4_8); 那触发点不是8个字节吗?同理,在uDMA中的仲裁大小不是也应该设置UDMA_ARB_8(我认为表示的是8个数目),而ti例程中用UDMA_ARB_4,不是很理解,帮忙解释下? 第六步 - 调用uDMAChannelTransferSet和uDMAChannelEnable函数发送数据 uDMAChannelTransferSet(UDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT, UDMA_MODE_BASIC, Udma_Uart0_Xmit_Buf, (void *)(UART0_BASE + UART_O_DR), sizeof(Udma_Uart0_Xmit_Buf)); uDMAChannelEnable(UDMA_CHANNEL_UART0TX); 以上操作步骤都实验完成。 问题二:但是,我现在想用uDMA接收数据。上位机通过串口TTL电平发送100个数据下来,进入我的UART0中断Uart0_IntHandle,但是,uDMAChannelModeGet函数在UART0中断获取到的值一直为3,也就是PINGPONG模式,并没有得到例程中的0(STOP),也就是接收一直不完成?不明白。 问题三:"bom2buy"对于uDMAControlBaseSet函数,"bom2buy"其中的地址是不是只是充当uDMA的临时寄存器,该值的大小,由发送与接收通道控制结构体大小有关系? 希望给予下回答,谢谢; 以下是中断函数代码,对于例程中的中断函数,采用回环控制,但是,数据接收只是单纯的uDMAChannelTransferSet,"bom2buy"并没有配置使能接收通道uDMAChannelEnable(UDMA_CHANNEL_UART0RX)语句,这样不是表示该功能是禁止的吗,调用发送好像没有意义,而且这里的发送,我根据源地址与目的地址理解,是将UART0数据寄存器中读取数据,写入我新定义的uDMA接收缓冲地址中,不知道这样理解对吗? void Uart0_IntHandle(void) { /* 中断状态反馈 */ uint32 ulIntState; uint32 ulModeRx; uint32 ulModeTx; //! The e ulIntState parameter bom2buy is the logical OR of any of the following: //! //! - b UART_INT_OE - Overrun Error interrupt //! - b UART_INT_BE - Break Error interrupt //! - b UART_INT_PE - Parity Error interrupt //! - b UART_INT_FE - Framing Error interrupt //! - b UART_INT_RT - Receive Timeout interrupt //! - b UART_INT_RX - Receive interrupt ulIntState = UARTIntStatus(UART0_BASE, TRUE); /* Clear the interrupt flag */ UARTIntClear(UART0_BASE, ulIntState); /* Check the DMA control table to see if the ping-pong "A" transfer is complete. The "A" transfer uses receive buffer "A", and the primary control structure. */ ulModeRx = uDMAChannelModeGet(UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT); ulModeTx = uDMAChannelModeGet(UDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT); /* 检查当前中断状态,做出对应的处理方式 */ switch (ulIntState) { case UART_INT_RX: { Uart0_Recv_IntHandle(); } break; case UART_INT_RT: { } break; case UART_INT_OE: { } break; case UART_INT_BE: { } break; case UART_INT_PE: { } break; case UART_INT_FE: { } break; default: break; } } 如果有什么相关资料可以参考,希望发份资料看看,争取把uDMA搞完。 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
3029个成员聚集在这个小组
加入小组2917 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3576 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2336 浏览 1 评论
4795 浏览 1 评论
2571 浏览 1 评论
1317浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3577浏览 2评论
2917浏览 1评论
1495浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 11:49 , Processed in 1.279941 second(s), Total 74, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号