打印
[技术问答]

HC32L136 uart_dma例程疑问

[复制链接]
4102|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
华大技术支持,您好。
我这边在使用HC32L136K8调试SDK“HC32L136_DDL_Rev1.2.0”中的uart_dma例程。
其中我看到串口的TX及RX的DMA硬件初始化的时候,RX部分的配置符合用户手册中的说明(红色标注)。
但是在TX部分,我看到代码中定义的是目标地址固定,源地址自增,但是这个在手册中描述的是硬件Burst,代码中却还是定义的硬件Block(绿色标注)。
这个问题是用户手册对于DMA模式的功能描述不全,还是例程中的错误使用呢?如果是例程出错,可否提供一份正确的参考。




使用特权

评论回复
沙发
martinhu| | 2020-4-22 18:15 | 只看该作者
这个和DMA的描述有什么关系???
UART rx接收,是从固定的接收寄存器到变量buff啊
UART tx发送,是从变量buff到固定的发送寄存器啊,
你再好好理一理!!

使用特权

评论回复
板凳
HC11425| | 2020-4-25 15:00 | 只看该作者
就用串口中断就可以了,串口使用DMA功能,Uart_EnableFunc(M0P_UART1,UartDmaRxFunc);              //使能DMA接收
源地址和目标地址,源地址就是串口的基地址,目标地址就是你要接收缓存的BUF。另外想请教一下,如何判断一包数据长度,寄存器里面没有这样的设置。
因为我现在的串口DMA无法获取有效数据长度。胡工,指点一下。我是华大代理商Mson



if(Uart_GetStatus(M0P_UART1, UartRC))         //UART1数据接收
    {
                        Uart_ClrStatus(M0P_UART1, UartRC);        //清中断状态位
//                        Dma_DisableChannel(DmaCh0);
                       
                        Dma_SetTransferCnt(DmaCh0,512);
                        Dma_SetDestinationAddress(DmaCh0,(uint32_t)&u8RxData[0]);
                        Dma_SetSourceAddress(DmaCh0,0x40000100);
                        dma_inx = pstcDmaCfg->enSrcBcTcReloadCtl;//pstcDmaCfg->u16TransferCnt;
                        Uart_Rx_Flag = 0xF1;
                        ;
      
//                        Uart_ClrIsr(M0P_UART1);
//                        Dma_EnableChannel(DmaCh0);

    }

使用特权

评论回复
地板
维修超人| | 2020-9-23 16:53 | 只看该作者
华大的DMA无法获取有效数据长度,这才是个问题啊,STM32有这个寄存器,华大的没有,所以华大的只能从DMA一次一个字节的取数据?这要DMA有什么用

使用特权

评论回复
5
martinhu| | 2020-9-24 09:18 | 只看该作者
维修超人 发表于 2020-9-23 16:53
华大的DMA无法获取有效数据长度,这才是个问题啊,STM32有这个寄存器,华大的没有,所以华大的只能从DMA一 ...

谁说不能获取数据的长度了!!!只要知道TC或者BC的初始值,再查询当前TC或者BC的初始值,就能知道当前传输了多少数据比如用ADT做空闲中断,接收了一部分数据,进入空闲中断后,查询TC值
初始设置是0x80,库函数自减1;TC寄存器是0x7F(串口传输,BC寄存器设置为0)

传输32字节之后,TC变成0x5F,和初始值相减不就是32个字节的数据吗?


使用特权

评论回复
6
迷惘186| | 2020-11-11 17:00 | 只看该作者
martinhu 发表于 2020-9-24 09:18
谁说不能获取数据的长度了!!!只要知道TC或者BC的初始值,再查询当前TC或者BC的初始值,就能知道当前传 ...

定时器 什么时候启动呢

可以把这个例程发一下么 谢谢

使用特权

评论回复
评论
martinhu 2021-6-29 09:12 回复TA
@ysuer :我用另一路DMA,然后Rx中断没有使能,收到数据后,Rx的接收完成事件触发这一路DAM传输一个变量,把Rx接收完成标志清零就可以了。 
ysuer 2021-6-28 15:38 回复TA
@martinhu :我按照你这办法实现了HC32 L130的DMA不定长接收;但是这样做必须配置uart的RX中断,这样每收到一个字节,会进入一次RX中断,最后一个字节收到后进入ADT溢出中断。感觉这样做已经失去DMA接收的意义了。理想情况是不需要每收到一个字节进一次接收中断。希望楼主继续交流,看有没有更好的办法 
martinhu 2020-11-12 20:03 回复TA
UART的Rx事件触发定时器启动,同时清零定时器的CNT计数器(高级定时器的硬件启动和硬件清零寄存器,配置为AOS事件有效,再配置AOS对应的事件为UART的Rx),这样每次接收一个字节的时候,定时器都从0开始计数,只有最后一个字节接收完毕后,才会产生定时器中断,相当于是一个空闲中断。 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝