查看: 6326|回复: 6

[求助] LPC1768的串口DMA接收无反应

[复制链接]
  • TA的每日心情
    无聊
    2024-6-3 15:51
  • 签到天数: 19 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    4

    主题

    54

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    246
    最后登录
    2024-9-4
    发表于 2019-7-11 11:32:28 | 显示全部楼层 |阅读模式
    在用dma的方式写串口接收实验,无反应,串口工作正常,代码如下,

    #include "dma.h"

    uint32_t DMACCDestAddr_Value[8]={0,0,0,0,0,0,0,0};                          //定义目标存储器

    /******************************************************************************************************************
    * DMA初始化函数:
    * 1.时钟初始化 -PCONP位29位GPDMA的时钟控制位
    * 2.清除相关标志位  通道位的[2:3]位为 UART1的TX和UART1的RX
    * 3.配置相关通道寄存器
    * 4.使能DMA控制器及使能相关通道
    ******************************************************************************************************************/
    void UART1_DMA_Config(void)
    {
            LPC_SC->PCONP |= 1UL<<29;                          //开启GPDMA的时钟
           
            LPC_GPDMA->DMACIntTCClear  |= 0x01;                 //清除通道0中断终端计数标志
            LPC_GPDMA->DMACIntErrClr   |= 0x01;                 //清除通道0中断错误标志
           
            LPC_GPDMACH0->DMACCLLI      = 0;                     //下一个链表项无效,本次DMA
            LPC_GPDMACH0->DMACCConfig  |= (P2M<<11UL)            //DMA的工作模式是用外设到存储器的模式
                                                                                                                     |  (11UL<<1UL)           //选择DMA传输的源外设为UART1_RX
                                                                                                                     |  (0x00<<6UL);           //选择DMA传输的目标是存储器
           
            LPC_GPDMACH0->DMACCControl |= (0x08<<0UL)            //突发传输大小为8
                                                                                                                     |  (0x02<<12UL)           //源突发大小为8
                                                                                                                     |  (0x02<<15UL)           //目标突发大小为8
                                                                                                                     |  (0x00<<18UL)           //源传输数据宽度为8
                                                                                                                     |  (0x00<<21UL)           //目标传输数据宽度为8
                                                                                                                     |  (0x00<<26UL)           //指定源地址不自动增加
                                                                                                                     |        (0x01<<27UL)           //指定目标地址自动增加
                                                                                                                     |        (((uint32_t)0x01)<<31UL);         //允许触发终端计数中断
           
            LPC_GPDMACH0->DMACCSrcAddr  = (uint32_t)&(LPC_UART1->RBR);      //源地址
            LPC_GPDMACH0->DMACCDestAddr = (uint32_t)& DMACCDestAddr_Value;  //目标地址
           
            LPC_GPDMA    ->DMACConfig   = 0x01;                  //DMA控制器使能,默认小端模式
            LPC_GPDMACH0 ->DMACCConfig |= 0x01;                  //DMACH0通道使能
           
            NVIC_SetPriority(DMA_IRQn,1);
            NVIC_EnableIRQ(DMA_IRQn);                            //使能DMA中断
    }

    /*************DMA 中断处理*************************************************************************/
    void DMA_IRQHandler(void)
    {
            LPC_GPIO2->FIOCLR |= (1UL<<3);
            if(((LPC_GPDMA->DMACRawIntTCStat)&0x01)==1){                          //通道0有效的终端计数中断请求
                    LPC_GPDMA->DMACIntTCClear  |= 0x01;                                 //清除通道0终端计数中断标志
                    LPC_GPDMACH0->DMACCDestAddr = (uint32_t)& DMACCDestAddr_Value;      //初始化目标源地址
                    LPC_GPIO2->FIOSET |= (1UL<<2);
            }
    }


    int main()
    {
            Delay_Init();
            Running_Check();
            LED_Config();
            Uart1_Config(115200);
            UART1_DMA_Config();

            LPC_GPIO2->FIOCLR |= (1UL<<2);
            while(1)
            {
            }
           
    }

    我知道答案 目前已有6人回答
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24890
    最后登录
    2025-7-21
    发表于 2019-7-12 10:25:31 | 显示全部楼层
    请参考此例程。 Attachment.zip (3.42 MB, 下载次数: 112)
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    14

    主题

    61

    帖子

    0

    高级会员

    Rank: 4

    积分
    569
    最后登录
    2022-2-11
    发表于 2019-7-12 14:07:23 | 显示全部楼层
    我就用过一个串口成功过,其他几个串口不行。不知道什么原因
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2024-6-3 15:51
  • 签到天数: 19 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    4

    主题

    54

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    246
    最后登录
    2024-9-4
     楼主| 发表于 2019-7-15 08:13:01 | 显示全部楼层
    谢谢各位的回答,现问题已经解决了,主要是串口的dma通道没打开
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2024-6-3 15:51
  • 签到天数: 19 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    4

    主题

    54

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    246
    最后登录
    2024-9-4
     楼主| 发表于 2019-7-15 08:13:49 | 显示全部楼层
    jackcheng2532 发表于 2019-7-15 08:13
    谢谢各位的回答,现问题已经解决了,主要是串口的dma通道没打开

            LPC_UART1->FCR |= 0x01<<3UL;                                      //UART1选择DMA模式                    
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    14

    主题

    61

    帖子

    0

    高级会员

    Rank: 4

    积分
    569
    最后登录
    2022-2-11
    发表于 2019-9-22 21:48:19 | 显示全部楼层
    你测试过其他串口吗?UART0,UART2,UART3
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    新手上路

    Rank: 1

    积分
    9
    最后登录
    2025-3-6
    发表于 2025-2-27 16:40:21 | 显示全部楼层

    求发一个完整的例程,就是包含各种外设用法的那种
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

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

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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