打印
[技术问答]

M453芯片通过DMA实现UART功能DMA超时中断如何实现?

[复制链接]
3450|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
M453开发UART功能中使用DMA实现串口功能。
目前只有到达设定的长度后才触发DMA中断,如何实现当接收到的数据小于UART0_DMA_LEN时也能检测到
大家有没有什么好的方法实现,我现在的方法如下,但是实现不了,无法检测到HWTOINT中断
M453芯片手册中UART_INTSTS手册中,有介绍到HWTOINT中断,目前无法进入该中断
具体代码如下:
PDMA通道初始化函数
void UART0_PMDA(void)
{
        SYS_ResetModule(PDMA_RST);
        PDMA_Open(DMA_CH0);
        PDMA_SetTransferAddr(0,(unsigned int)(&(UART0->DAT)),PDMA_SAR_FIX,
                                                   (unsigned int)UART0_DMA_Buf1,PDMA_DAR_INC);
        PDMA_SetTransferCnt(0,PDMA_WIDTH_8,UART0_DMA_LEN);  //8位,总长2字节
        PDMA_SetTransferMode(0,PDMA_UART0_RX,FALSE,0); //通道0设置为UART0_RX
        PDMA_SetBurstType(0,PDMA_REQ_SINGLE,PDMA_BURST_1);
        PDMA_EnableInt(0, 0);
        NVIC_EnableIRQ(PDMA_IRQn);
}
PDMA中断处理函数
void PDMA_IRQHandler(void)
{
        FIFO_QUNE  *pUart_rx_fifo = NULL;
        uint32_t cnt;
        uint32_t status = PDMA_GET_INT_STATUS();
        if(status & 0x1)    /* abort */
        {
             PDMA_CLR_ABORT_FLAG(PDMA_ABTSTS_ABTIFx_Msk);
        }
        else if(status & 0x2)      /* done */
       {
            pUart_rx_fifo = &Uart0_rx_fifo;
            cnt = pUart_rx_fifo->size - pUart_rx_fifo->rear;
           if(cnt > UART0_DMA_LEN)
           {
                     memcpy(pUart_rx_fifo->dat+pUart_rx_fifo->rear,UART0_DMA_Buf1,UART0_DMA_LEN);
                  pUart_rx_fifo->rear += UART0_DMA_LEN;
           }
           else
           {
                 memcpy(pUart_rx_fifo->dat+pUart_rx_fifo->rear,UART0_DMA_Buf1,cnt);
                 pUart_rx_fifo->rear = 0;
                 memcpy(pUart_rx_fifo->dat+pUart_rx_fifo->rear,&UART0_DMA_Buf1[cnt] ,UART0_DMA_LEN-cnt);
                        pUart_rx_fifo->rear += UART0_DMA_LEN-cnt;
           }
           PDMA_CLR_TD_FLAG(PDMA_TDSTS_TDIFx_Msk);
           //重新设置模式,映射地址。这样可实现循环接收
           PDMA_SetTransferAddr(0,(unsigned int)(&(UART0->DAT)),PDMA_SAR_FIX,
                                                  (unsigned int)UART0_DMA_Buf1,PDMA_DAR_INC);
           PDMA_SetTransferCnt(0,PDMA_WIDTH_8,UART0_DMA_LEN);
           PDMA_SetTransferMode(0,PDMA_UART0_RX,FALSE,0);
    }
}
main函数中中断使能函数
UART_EnableInt(UART0, (UART_INTEN_RDAIEN_Msk | UART_INTEN_RXPDMAEN_Msk |                       
                                         UART_INTEN_TOCNTEN_Msk | UART_INTEN_RXTOIEN_Msk));

串口中断处理函数
void UART0_IRQHandler(void)
{
        uint8_t nByte = 0xFF;
        if(UART0->INTSTS & (UART_INTSTS_RDAINT_Msk | UART_INTSTS_RXTOIF_Msk |               
                                          UART_INTSTS_HWTOINT_Msk))
        {
                /* Get all the input characters */
                while(!(UART0->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk))
                {
                        /* Get the character from UART Buffer */
                        nByte = UART0->DAT;
                        /* Check if buffer full */
                        if(FIFO_NOT_FULL == Queue_is_Full(&Uart0_rx_fifo))
                        {
                                Queue_In(&Uart0_rx_fifo, nByte);
                        }
                }
        }
}

11.jpg (112.36 KB )

11.jpg
沙发
gaoyang9992006| | 2014-12-9 15:21 | 只看该作者
好高端的样子。

使用特权

评论回复
板凳
mintspring| | 2014-12-9 15:21 | 只看该作者
学习一下,DMA应用我还是很薄弱的。

使用特权

评论回复
地板
598330983| | 2014-12-9 15:21 | 只看该作者
这两个放一起我还没有用过,学习一下,谢谢楼主无私分享。

使用特权

评论回复
5
电子云图| | 2014-12-9 15:21 | 只看该作者
有专门的  7位接收缓存定时溢出检测功能

使用特权

评论回复
6
天师猫神| | 2014-12-9 15:21 | 只看该作者
学习一下:P到时候可以用下

使用特权

评论回复
7
lsw200888|  楼主 | 2014-12-9 15:21 | 只看该作者
电子云图 发表于 2014-12-10 10:39
有专门的  7位接收缓存定时溢出检测功能

那个7位接收缓存定时溢出检测功能怎么实现,我看过STM32可以实现这个功能。但是M453的没找到相关寄存器

使用特权

评论回复
8
电子云图| | 2014-12-9 15:21 | 只看该作者
lsw200888 发表于 2014-12-10 16:28
那个7位接收缓存定时溢出检测功能怎么实现,我看过STM32可以实现这个功能。但是M453的没找到相关寄存器 ...


手册上有讲的,认真看手册

使用特权

评论回复
9
lsw200888|  楼主 | 2014-12-9 15:21 | 只看该作者
电子云图 发表于 2014-12-10 19:30
手册上有讲的,认真看手册

你说的这个用于UART的RX通道的16字节的FIFO检测功能。
我尝试用过,还是达不到检测PDMA的Time-Out功能。高手,能否指定一下这个具体怎么用。

使用特权

评论回复
10
lsw200888|  楼主 | 2014-12-9 15:21 | 只看该作者
电子云图 发表于 2014-12-10 19:30
手册上有讲的,认真看手册

FIFO模式下,我已能正常实现检测到RXTOINT。目前就是设置的DMA,能否检测到寄存器中说的HWTOINT中断状态。
该状态与RXTOINT都是在UART_INTSTS寄存器中

使用特权

评论回复
11
电子云图| | 2014-12-9 15:21 | 只看该作者
本帖最后由 电子云图 于 2014-12-11 10:14 编辑
lsw200888 发表于 2014-12-10 20:13
FIFO模式下,我已能正常实现检测到RXTOINT。目前就是设置的DMA,能否检测到寄存器中说的HWTOINT中断状态 ...

总线空闲就计时,时间到还没有数据来不就超时了,然后中断了,中断之后弄一个标志位致1,主程序发现读取标志位致1了就去读DMA数据。
不是设置DMA中断或RX中断,要设置总线空闲超时中断,

使用特权

评论回复
12
匆匆那年| | 2014-12-17 08:40 | 只看该作者
听起来挺高级的。。。。

使用特权

评论回复
13
qq2987| | 2017-10-16 09:50 | 只看该作者
请问楼主有木有DMA发送的代码 谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

23

帖子

1

粉丝