查看: 6206|回复: 6

[原创] LPC824 lite入门教程八 DMA

[复制链接]
  • TA的每日心情
    开心
    2020-6-18 08:45
  • 签到天数: 812 天

    连续签到: 1 天

    [LV.10]以坛为家III

    66

    主题

    4899

    帖子

    64

    金牌会员

    Rank: 6Rank: 6

    积分
    6321
    最后登录
    2025-7-15
    发表于 2016-11-10 23:21:45 | 显示全部楼层 |阅读模式
    本帖最后由 原来的你 于 2016-11-10 23:30 编辑

    本节我们讲解LPC824的DMA,有了DMA可以减轻LPC824 MCU的负责,本次我们把DMA结合串口一起使用。 QQ截图20161110230923.png QQ截图20161110230934.png QQ截图20161110230944.png QQ截图20161110230952.png QQ截图20161110231002.png QQ截图20161110231018.png QQ截图20161110231028.png QQ截图20161110231036.png QQ截图20161110231045.png
    int main(void)
    {
            int bytes, idx;
            uint8_t buff[UARTRXBUFFSIZE];

            SystemCoreClockUpdate();
            Board_Init();
            Init_UART_PinMux();
            DEBUGSTR("EEPROM demo\r\n");
            DEBUGOUT("DMA-UART Clock: %uMHz\r\n", SystemCoreClock / 1000000);
            DEBUGOUT("Device ID: 0x%x\r\n", Chip_SYSCTL_GetDeviceID());
            Board_LED_Set(0, false);

            Chip_UART_Init(LPC_USART0);
            Chip_UART_ConfigData(LPC_USART0, UART_CFG_DATALEN_8 | UART_CFG_PARITY_NONE | UART_CFG_STOPLEN_1);
            Chip_Clock_SetUSARTNBaseClockRate((115200 * 16), true);
            Chip_UART_SetBaud(LPC_USART0, 115200);
            Chip_UART_Enable(LPC_USART0);
            Chip_UART_TXEnable(LPC_USART0);

            /* DMA initialization - enable DMA clocking and reset DMA if needed */
            Chip_DMA_Init(LPC_DMA);//初始化DMA

            /* Enable DMA controller and use driver provided DMA table for current descriptors */
            Chip_DMA_Enable(LPC_DMA);//使能DMA
            Chip_DMA_SetSRAMBase(LPC_DMA, DMA_ADDR(Chip_DMA_Table));//设置DMA内存地址

            /* Setup UART 0 TX DMA support */
            dmaTXSetup();//使能串口0 DMA发送功能

            /* Setup UART 0 RX DMA support */
            dmaRXSetup();//使能串口0 DMA接收功能

            /* Enable the DMA IRQ */
            NVIC_EnableIRQ(DMA_IRQn);//使能DMA IRQ

            /* Enqueue a bunch of strings in DMA transmit descriptors and start
               transmit. In this use of DMA, the descriptors aren't chained, so
                 the DMA restarts the next queued descriptor in the DMA interrupt
                 handler. */
            for (idx = 0; idx < DMASENDSTRCNT; idx++) {
                    sprintf(dmaSendStr[idx], "DMA send string (unlinked) #%d\r\n", idx);//打印DMA发送数据
                    dmaTXSend((uint8_t *) dmaSendStr[idx], strlen(dmaSendStr[idx]));//DMA发送数据
            }

            /* Wait for UART TX DMA channel to go inactive */ //等待串口DMA发送完成
            while (1) {
                    __WFI();
                    if (Chip_DMA_GetActiveChannels(LPC_DMA) & (1 << DMAREQ_USART0_TX)) {
                            break;
                    }
            }

            /* Receive buffers are queued. The DMA interrupt will only trigger on a
               full DMA buffer receive, so if the UART is idle, but the DMA is only
               partially complete, the DMA interrupt won't fire. For UART data
               receive where data is not continuous, a timeout method will be
               required to flush the DMA when the DMA has pending data and no
               data has been received on the UART in a specified timeout */
            dmaRXQueue();

            /* Get RX data via DMA and send it out on TX via DMA *///通过DMA接收数据并且通过DMA发送出来
            while (1) {
                    /* Sleep until something happens */
                    __WFI();

                    /* Did any data come in? */
                    bytes = checkRxData(buff);
                    if (bytes > 0) {
                            /* RX data received, send it via TX DMA */
                            dmaTXSend(buff, bytes);
                    }
            }
    }

    /* Setup DMA UART TX support, but do not queue descriptors yet */
    static void dmaTXSetup(void)
    {
            /* Setup UART 0 TX channel for the following configuration:
               - Peripheral DMA request (UART 0 TX channel)
               - Single transfer
               - Low channel priority */
            Chip_DMA_EnableChannel(LPC_DMA, DMAREQ_USART0_TX);//选择串口0发送作为DMA通道
            Chip_DMA_EnableIntChannel(LPC_DMA, DMAREQ_USART0_TX);//使能串口0发送中断
            Chip_DMA_SetupChannelConfig(LPC_DMA, DMAREQ_USART0_TX,
                                                                    (DMA_CFG_PERIPHREQEN | DMA_CFG_TRIGBURST_SNGL | DMA_CFG_CHPRIORITY(3)));//配置DMA发送

            countTXDescUsed = 0;
    }

    /* Setup DMA UART RX support, but do not queue descriptors yet */
    static void dmaRXSetup(void)
    {
            /* Setup UART 0 RX channel for the following configuration:
               - Peripheral DMA request (UART 0 RX channel)
               - Single transfer
               - Low channel priority */
            Chip_DMA_EnableChannel(LPC_DMA, DMAREQ_USART0_RX);//选择串口0接收作为DMA通道
            Chip_DMA_EnableIntChannel(LPC_DMA, DMAREQ_USART0_RX);//选择串口0接收中断
            Chip_DMA_SetupChannelConfig(LPC_DMA, DMAREQ_USART0_RX,
                                                                    (DMA_CFG_PERIPHREQEN | DMA_CFG_TRIGBURST_SNGL | DMA_CFG_CHPRIORITY(3)));//配置DMA接收
    }


    QQ截图20161110231010.png
    开心
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16702
    最后登录
    1970-1-1
    发表于 2016-11-10 23:57:36 | 显示全部楼层
    不错!!
    回复

    使用道具 举报

  • TA的每日心情
    难过
    2024-3-21 15:13
  • 签到天数: 41 天

    连续签到: 1 天

    [LV.5]常住居民I

    32

    主题

    1820

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1785
    最后登录
    2024-3-21
    发表于 2016-11-11 00:21:17 | 显示全部楼层
    一个一个来跟着你学习!
    好多年没来了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-23 10:20
  • 签到天数: 45 天

    连续签到: 1 天

    [LV.5]常住居民I

    5

    主题

    693

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1406
    最后登录
    2025-7-21
    发表于 2016-11-11 08:56:20 | 显示全部楼层
    学习学习
    dfdfdfdfdfdfdfd dsfa222
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2017-1-24 08:47
  • 签到天数: 49 天

    连续签到: 1 天

    [LV.5]常住居民I

    0

    主题

    524

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1267
    最后登录
    2017-4-19
    发表于 2016-11-11 09:45:36 | 显示全部楼层
    分析的不错                           
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-11-29 08:49
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    1

    主题

    45

    帖子

    0

    注册会员

    Rank: 2

    积分
    115
    最后登录
    2016-11-29
    发表于 2016-11-21 19:18:41 | 显示全部楼层
    学习学习
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2017-12-26 12:04
  • 签到天数: 43 天

    连续签到: 1 天

    [LV.5]常住居民I

    4

    主题

    253

    帖子

    0

    高级会员

    Rank: 4

    积分
    620
    最后登录
    2018-7-6
    发表于 2016-11-27 11:16:18 | 显示全部楼层
    学习了。。。
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 17:09 , Processed in 0.101778 second(s), 26 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表