打印
[DemoCode下载]

M451系列UART0通过PDMA发送数据的DemoCode

[复制链接]
4819|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
YWBIN|  楼主 | 2015-6-23 18:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
附件为M451系列UART0通过PDMA发送数据的DemoCode,有需要的朋友可以参考下。
注:工程路径为“M451系列UART PDMA发送\M451SeriesBSP_CMSIS_v3.00.005\SampleCode\StdDriver\UART_PDMA_Send”。

M451系列UART PDMA发送.rar

500.13 KB

沙发
天灵灵地灵灵| | 2015-6-23 19:24 | 只看该作者
UART0通过PDMA发送数据的DemoCode,非常赞,这一点很薄弱

使用特权

评论回复
板凳
稳稳の幸福| | 2015-6-23 19:59 | 只看该作者
工程路径:M451SeriesBSP_CMSIS_v3.00.005\SampleCode\StdDriver\UART_PDMA_Send

功能:UART0通过PMDA方式发送数据

使用特权

评论回复
地板
稳稳の幸福| | 2015-6-23 20:00 | 只看该作者
/**************************************************************************//**
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
* $Revision: 7 $
* $Date: 14/10/28 5:32p $
* [url=home.php?mod=space&uid=247401]@brief[/url]    Use PDMA channel 2 to transfer data from memory to memory.
* @note
* Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
*
******************************************************************************/
#include <stdio.h>
#include "M451Series.h"

/*---------------------------------------------------------------------------------------------------------*/
/* Macro, type and constant definitions                                                                    */
/*---------------------------------------------------------------------------------------------------------*/
#define PLL_CLOCK       72000000


/*---------------------------------------------------------------------------------------------------------*/
/* Global variables                                                                                        */
/*---------------------------------------------------------------------------------------------------------*/
uint32_t PDMA_TEST_LENGTH = 12;
uint8_t SrcArray[256] = "hello world!";
uint32_t volatile u32IsSendOver = 0;

/**
* @brief       DMA IRQ
*
* @param       None
*
* [url=home.php?mod=space&uid=266161]@return[/url]      None
*
* @details     The DMA default IRQ, declared in startup_nuc400series.s.
*/
void PDMA_IRQHandler(void)
{
    uint32_t status = PDMA_GET_INT_STATUS();

    if(status & 0x1)    /* abort */
    {
        if(PDMA_GET_ABORT_STS() & 0x4)
            u32IsSendOver = 2;
        PDMA_CLR_ABORT_FLAG(PDMA_ABTSTS_ABTIFn_Msk);
    }
    else if(status & 0x2)      /* done */
    {
        if(PDMA_GET_TD_STS() & 0x4)
            u32IsSendOver = 1;
        PDMA_CLR_TD_FLAG(PDMA_TDSTS_TDIFn_Msk);
    }
    else
        printf("unknown interrupt !!\n");
}

void SYS_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Enable HIRC clock (Internal RC 22.1184MHz) */
    CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

    /* Waiting for HIRC clock ready */
    CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

    /* Select HCLK clock source as HIRC and and HCLK clock divider as 1 */
    CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));

    /* Enable HXT clock (external XTAL 12MHz) */
    CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);

    /* Waiting for HXT clock ready */
    CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);

    /* Set core clock as PLL_CLOCK from PLL */
    CLK_SetCoreClock(PLL_CLOCK);

    /* Waiting for PLL clock ready */
    CLK_WaitClockReady(CLK_STATUS_PLLSTB_Msk);

    /* Enable UART module clock */
    CLK_EnableModuleClock(UART0_MODULE);

    /* Select UART module clock source as HXT and UART module clock divider as 1 */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UARTSEL_HXT, CLK_CLKDIV0_UART(1));

    /* Enable PDMA clock source */
    CLK_EnableModuleClock(PDMA_MODULE);

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Set PD multi-function pins for UART0 RXD and TXD */
    SYS->GPD_MFPL &= ~(SYS_GPD_MFPL_PD0MFP_Msk | SYS_GPD_MFPL_PD1MFP_Msk);
    SYS->GPD_MFPL |= (SYS_GPD_MFPL_PD0MFP_UART0_RXD | SYS_GPD_MFPL_PD1MFP_UART0_TXD);
}

void UART0_Init()
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Reset UART module */
    SYS_ResetModule(UART0_RST);

    /* Configure UART0 and set UART0 baud rate */
    UART_Open(UART0, 115200);
}

void PDMA_Init()
{
    /* Enable PDMA clock source */
    CLK_EnableModuleClock(PDMA_MODULE);
    /* Reset PDMA module */
    SYS_ResetModule(PDMA_RST);
    PDMA_Open(0x4);
    PDMA_SetTransferCnt(2, PDMA_WIDTH_8, PDMA_TEST_LENGTH);
    PDMA_SetTransferAddr(2, (uint32_t)SrcArray, PDMA_SAR_INC, (uint32_t)&UART0->DAT, PDMA_DAR_FIX);
    PDMA_SetTransferMode(2, PDMA_UART0_TX, FALSE, 0);
    PDMA_EnableInt(2, PDMA_INT_TRANS_DONE);
    NVIC_EnableIRQ(PDMA_IRQn);
    UART0->INTEN = UART0->INTEN | (1<<14);//UARTO DMA send enable
}

void PDMA_Set()
{
    PDMA_SetTransferCnt(2, PDMA_WIDTH_8, PDMA_TEST_LENGTH);
    PDMA_SetTransferAddr(2, (uint32_t)SrcArray, PDMA_SAR_INC, (uint32_t)&UART0->DAT, PDMA_DAR_FIX);
    PDMA_SetTransferMode(2, PDMA_UART0_TX, FALSE, 0);
    UART0->INTEN = UART0->INTEN | (1<<14);//UARTO DMA send enable
}

/*---------------------------------------------------------------------------------------------------------*/
/*  Main Function                                                                                          */
/*---------------------------------------------------------------------------------------------------------*/
int main(void)
{
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Init System, IP clock and multi-function I/O */
    SYS_Init();

    /* Lock protected registers */
    /* If user want to write protected register, please issue SYS_UnlockReg() to unlock protected register. */
    SYS_LockReg();

    /* Init UART for printf */
    UART0_Init();

    printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %dHz\n", SystemCoreClock);

    printf("+------------------------------------------------------+ \n");
    printf("|          UART PDMA SEND Sample Code                  | \n");
    printf("+------------------------------------------------------+ \n");
   
    PDMA_Init();

    while(1)
    {
        if(u32IsSendOver == 1)
        {
            u32IsSendOver = 0;
            PDMA_Set();            
        }
    }
}


使用特权

评论回复
5
yiyigirl2014| | 2015-6-23 20:09 | 只看该作者
void PDMA_Set()
{
    PDMA_SetTransferCnt(2, PDMA_WIDTH_8, PDMA_TEST_LENGTH);
    PDMA_SetTransferAddr(2, (uint32_t)SrcArray, PDMA_SAR_INC, (uint32_t)&UART0->DAT, PDMA_DAR_FIX);
    PDMA_SetTransferMode(2, PDMA_UART0_TX, FALSE, 0);
    UART0->INTEN = UART0->INTEN | (1<<14);//UARTO DMA send enable
}

使用特权

评论回复
6
yiyigirl2014| | 2015-6-23 20:09 | 只看该作者
上面这个是设置什么东西的啊?:)

使用特权

评论回复
7
lsw200888| | 2015-6-23 23:35 | 只看该作者
楼主能否也发一份PDMA实现接收数据的DemoCode,不懂当接收数据未达到PDMA设置大小时如何处理

使用特权

评论回复
8
YWBIN|  楼主 | 2015-6-24 17:33 | 只看该作者
yiyigirl2014 发表于 2015-6-23 20:09
上面这个是设置什么东西的啊?

重新触发一次数据发送。

使用特权

评论回复
9
YWBIN|  楼主 | 2015-6-24 17:35 | 只看该作者
lsw200888 发表于 2015-6-23 23:35
楼主能否也发一份PDMA实现接收数据的DemoCode,不懂当接收数据未达到PDMA设置大小时如何处理 ...

https://bbs.21ic.com/icview-962974-1-1.html

使用特权

评论回复
10
yiyigirl2014| | 2015-6-24 22:43 | 只看该作者
这个内容真不错,看完了,收益颇丰。

使用特权

评论回复
11
JY-DX-JY| | 2016-5-7 11:00 | 只看该作者
顶一个。

使用特权

评论回复
12
玛尼玛尼哄| | 2016-5-7 12:22 | 只看该作者
那个中断函数写的不错,通过那个封装完美的get函数获取中断的类型,然后按类型处理,真是 太科学了。

使用特权

评论回复
13
mezstd| | 2018-4-1 22:16 | 只看该作者
传输数据大小PDMA_TEST_LENGTH超过16就挂掉,也是醉,直接HWBUFEIF。

使用特权

评论回复
14
小华dd| | 2022-5-9 11:18 | 只看该作者
顶一个

使用特权

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

本版积分规则

21

主题

46

帖子

1

粉丝