牛卧堂MCU技术交流

标题: 请问一下,串口PDMA,M480的PDMA-集散模式,移植到M467的PDMA [打印本页]

作者: 匿名    时间: 2024-1-5 18:10
标题: 请问一下,串口PDMA,M480的PDMA-集散模式,移植到M467的PDMA
请问一下,串口PDMA,M480的PDMA-集散模式,移植到M467的PDMA
需要注意什么吗?

我在M480上面,可以运行。
移植到M467,无法接收到数据。

这个问题,可以指点一下吗?


作者: 匿名    时间: 2024-1-8 09:28
请问初始化这样的写法哪里存在问题呢?我这样写,只能触发一次PDMA中断。

void UART0_PDMA_Init_SCATTER(void)
{       
    PDMA_Open(PDMA0, UART0_PDMA_OPENED_CH_RX);
    PDMA_SetTransferMode(PDMA0, UART0_RX_DMA_CH, PDMA_UART0_RX, TRUE, (uint32_t)&UART0_DMA_DESC[0]);

    UART0_DMA_DESC[0].ctl = \
                            ((UART0_RX_size / 2 - 1) << PDMA_DSCT_CTL_TXCNT_Pos) | /* Transfer count is RXBUFSIZE/2 */ \
                            PDMA_WIDTH_8 |    /* Transfer width is 8 bits */ \
                            PDMA_SAR_FIX |    /* Source increment size is  fixed(no increment) */ \
                            PDMA_DAR_INC |    /* Destination increment size is 8 bits */ \
                            PDMA_REQ_SINGLE | /* Transfer type is single transfer type */ \
                            PDMA_BURST_1 |    /* Burst size is 1. No effect in single transfer type */ \
                            PDMA_OP_SCATTER;  /* Operation mode is scatter-gather mode */
    /* Configure source address */
    UART0_DMA_DESC[0].src = (uint32_t)UART0_BASE;
    /* Configure destination address */
    UART0_DMA_DESC[0].dest = (uint32_t)&UART0_RXBuffer[0];/*buffer 1 */
    /* Configure next descriptor table address */
    UART0_DMA_DESC[0].offset = (uint32_t)&UART0_DMA_DESC[1] - (PDMA0->SCATBA); /* next operation table is table 2 */

    UART0_DMA_DESC[1].ctl = \
                            ((UART0_RX_size / 2 - 1) << PDMA_DSCT_CTL_TXCNT_Pos) | /* Transfer count is RXBUFSIZE/2 */ \
                            PDMA_WIDTH_8 |    /* Transfer width is 8 bits */ \
                            PDMA_SAR_FIX |    /* Source increment size is fixed(no increment) */ \
                            PDMA_DAR_INC |    /* Destination increment size is 8 bits */ \
                            PDMA_REQ_SINGLE | /* Transfer type is single transfer type */ \
                            PDMA_BURST_1 |    /* Burst size is 1. No effect in single transfer type */ \
                            PDMA_OP_SCATTER;  /* Operation mode is scatter-gather mode */
    /* Configure source address */
    UART0_DMA_DESC[1].src = (uint32_t)UART0_BASE;
    /* Configure destination address */
    UART0_DMA_DESC[1].dest = (uint32_t)&UART0_RXBuffer[UART0_RX_size / 2] ; /* buffer 2 */
    /* Configure next descriptor table address */
    UART0_DMA_DESC[1].offset = (uint32_t)&UART0_DMA_DESC[0] - (PDMA0->SCATBA); /* next operation table is table 1 */


    PDMA_SetTransferCnt(PDMA0,  UART0_RX_DMA_CH, PDMA_WIDTH_8, UART0_RX_size);
    PDMA_SetTransferAddr(PDMA0, UART0_RX_DMA_CH, (uint32_t) (&UART0_RXBuffer[0]), PDMA_SAR_INC, (uint32_t) UART0_BASE, PDMA_DAR_FIX);
    PDMA_SetBurstType(PDMA0, UART0_RX_DMA_CH, PDMA_REQ_SINGLE, 0);

    /* Enable interrupt */
    PDMA_DisableInt(PDMA0, UART0_RX_DMA_CH, PDMA_INT_TEMPTY );
    PDMA_EnableInt(PDMA0, UART0_RX_DMA_CH, PDMA_INT_TRANS_DONE); /* channel transfer done */
    PDMA_EnableInt(PDMA0, UART0_RX_DMA_CH, PDMA_INT_TIMEOUT); /*channel timeout */
    PDMA_SetTimeOut(PDMA0, UART0_RX_DMA_CH, 1, UART0_t); /* channel 0 timeout period = CLK * TOC0  */
       
}

作者: chrishu    时间: 2024-1-8 09:40
两颗芯片的PDMA移植基本没什么差别。请问一下SYS_Init里PDMA的时钟使能了吗?
另外UART在不使用PDMA时,本身是否可以接收。
作者: 匿名    时间: 2024-1-8 10:43
chrishu 发表于 2024-1-8 09:40
两颗芯片的PDMA移植基本没什么差别。请问一下SYS_Init里PDMA的时钟使能了吗?
另外UART在不使用PDMA时,本 ...

使能了。想请教一下,PDMA0的TIME-OUT中断,
    else if (status & 0x300)     /* timeout */
    {

            printf("timeout interrupt !! %d\n",status);

            PDMA_SetTimeOut(PDMA0, UART0_RX_DMA_CH, 0, 0);
            PDMA_CLR_TMOUT_FLAG(PDMA0, UART0_RX_DMA_CH);
            PDMA_SetTimeOut(PDMA0, UART0_RX_DMA_CH, 1, UART0_t);

    }

这个里面 如何区分是哪一个发生了中断呢?
这个300 是如何得到的?
作者: chrishu    时间: 2024-1-8 14:48
本帖最后由 chrishu 于 2024-1-8 14:54 编辑
游客 121.29.98.x 发表于 2024-1-8 10:43
使能了。想请教一下,PDMA0的TIME-OUT中断,
    else if (status & 0x300)     /* timeout */
    {

请问一下你是不是有发过邮件给我?邮件里有回复 你的初始化代码里多了下面几行代码,作为集散模式前面已经完成了它配置,不需要再将基本模式的配置跟在后面。//    PDMA_SetTransferCnt(PDMA0,  UART0_RX_DMA_CH, PDMA_WIDTH_8, UART0_RX_size);
//    PDMA_SetTransferAddr(PDMA0, UART0_RX_DMA_CH, (uint32_t) (&UART0_RXBuffer[0]), PDMA_SAR_INC, (uint32_t) UART0_BASE, PDMA_DAR_FIX);
//    PDMA_SetBurstType(PDMA0, UART0_RX_DMA_CH, PDMA_REQ_SINGLE, 0);
你可以按照M480的例程将配置移植过来测试,先不要去加其他东西。
0x300表示通道0 和通道1 发生的超时中断。你可以看一下寄存器PDMAx_INTSTS。
当INTSTS的第二位置1表示有通道传完。
调用PDMA_GET_TD_STS(PDMA0)函数参看是哪些通道发生了传完中断





作者: 匿名    时间: 2024-1-8 15:22
chrishu 发表于 2024-1-8 14:48
请问一下你是不是有发过邮件给我?邮件里有回复 你的初始化代码里多了下面几行代码,作为集散模式前面已经 ...

是啊!我给您发的email.
我重新下载了一个BSP,一切重新测试,发现我的程序也是没有任何问题的。
原因在于,我对现在的工程进行过修改。我添加了DSP的库文件,导致了不正常。。还想请教关于DSP高速计算三角函数的使用技巧!。
我研究M460系列的规格书,使用说明。貌似PDMA中只有0 1 通道可以设置 TIME-OUT,如果我用了10个串口分配到了PDMA0,是不是只有2个串口可以使用TIME-OUT?我的理解对吗?
PDMA通道,这个是一个什么概念呢?是PDMA0和PDMA1还是指,PDMA0/1 其中,每个16个通道的2个?
对此不是很明白!谢谢!
作者: chrishu    时间: 2024-1-16 10:11
游客 121.29.98.x 发表于 2024-1-8 15:22
是啊!我给您发的email.
我重新下载了一个BSP,一切重新测试,发现我的程序也是没有任何问题的。
原因在 ...

M460有两个PDMA控制器,每个控PDMA制器有16个通道.
M460的说有PDMA通道都支持超时中断功能




欢迎光临 牛卧堂MCU技术交流 (http://nuvoton-mcu.com/) Powered by Discuz! X3.2