OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3676|回复: 6

DMA2与DMA1一起使用的问题

[复制链接]

2

主题

11

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2016-6-15
在线时间
5 小时
发表于 2016-6-16 17:28:49 | 显示全部楼层 |阅读模式
1金钱
新手第一次用DMA,因为项目需要串口挂多个传感器,所以一共用了3个DMA接收。分别是usart2 、usart3和uart4。这些的DMA接收我已经单独调通了,但是一起使用的时候遇见了个问题,就是我usart2和3的DMA接收都没有问题,但是4的就是不行。我仿真时候查看寄存器了,没有什么问题,该置1 的位都置1了,求大家帮我看一下。


void myuart2_init(u32 bound){
  //GPIO¶Ë¿úéèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);        //ê1ÄüUSART2£¬GPIOAê±Öó
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        //USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //¸′óÃíÆíìêä3ö
  GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOA.2

  //USART1_RX          GPIOA.103õê¼»ˉ
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA.3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿Õêäèë
  GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOA.3  

  //Usart1 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//ÇàÕ¼óÅÏè¼¶3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                //×óóÅÏè¼¶3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1Äü
        NVIC_Init(&NVIC_InitStructure);        //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷
       
        USART_InitStructure.USART_BaudRate = bound;//′®¿ú2¨ìØÂê
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö3¤Îa8λêy¾Y¸ñê½
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò»¸öí£Ö1λ
        USART_InitStructure.USART_Parity = USART_Parity_No;//ÎTÆæÅ¼D£Ñéλ
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTó2¼têy¾Yá÷¿ØÖÆ
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //êÕ·¢Ä£ê½

  USART_Init(USART2, &USART_InitStructure); //3õê¼»ˉ′®¿ú2
// USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//¿aÆô′®¿ú½óêüÖD¶Ï
  USART_Cmd(USART2, ENABLE);                    //ê1Äü′®¿ú2

}


void myuart3_init(u32 bound){
  //GPIO¶Ë¿úéèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);        //ê1ÄüUSART2£¬GPIOAê±Öó
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        //USART3_TX   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;//PA.2
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //¸′óÃíÆíìêä3ö
  GPIO_Init(GPIOB, &GPIO_InitStructure);//3õê¼»ˉGPIOA.2

  //USART3_RX         
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PA.3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿Õêäèë
  GPIO_Init(GPIOB, &GPIO_InitStructure);//3õê¼»ˉGPIOA.3  

  //Usart3 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//ÇàÕ¼óÅÏè¼¶3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                //×óóÅÏè¼¶3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1Äü
        NVIC_Init(&NVIC_InitStructure);        //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷
       

        USART_InitStructure.USART_BaudRate = bound;//′®¿ú2¨ìØÂê
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö3¤Îa8λêy¾Y¸ñê½
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò»¸öí£Ö1λ
        USART_InitStructure.USART_Parity = USART_Parity_No;//ÎTÆæÅ¼D£Ñéλ
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTó2¼têy¾Yá÷¿ØÖÆ
        USART_InitStructure.USART_Mode = USART_Mode_Rx;        //êÕ·¢Ä£ê½

  USART_Init(USART3, &USART_InitStructure); //3õê¼»ˉ′®¿ú2

  USART_Cmd(USART3, ENABLE);                    //ê1Äü′®¿ú2

}



void myuart4_init(u32 bound){
  //GPIO¶Ë¿úéèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);        //ê1ÄüUSART2£¬GPIOAê±Öó
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
        //USART3_TX   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;//PA.2
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //¸′óÃíÆíìêä3ö
  GPIO_Init(GPIOC, &GPIO_InitStructure);//3õê¼»ˉGPIOA.2

  //USART3_RX         
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PA.3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿Õêäèë
  GPIO_Init(GPIOC, &GPIO_InitStructure);//3õê¼»ˉGPIOA.3  

  //Usart3 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//ÇàÕ¼óÅÏè¼¶3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                //×óóÅÏè¼¶3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1Äü
        NVIC_Init(&NVIC_InitStructure);        //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷
       

        USART_InitStructure.USART_BaudRate = bound;//′®¿ú2¨ìØÂê
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö3¤Îa8λêy¾Y¸ñê½
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò»¸öí£Ö1λ
        USART_InitStructure.USART_Parity = USART_Parity_No;//ÎTÆæÅ¼D£Ñéλ
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTó2¼têy¾Yá÷¿ØÖÆ
        USART_InitStructure.USART_Mode = USART_Mode_Rx;        //êÕ·¢Ä£ê½

  USART_Init(UART4, &USART_InitStructure); //3õê¼»ˉ′®¿ú2

  USART_Cmd(UART4, ENABLE);                    //ê1Äü′®¿ú2

}






void DMA1_USART1_init(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
        DMA_InitTypeDef DMA_InitStructure;
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
        DMA_DeInit(DMA_CHx);

        DMA2_MEM_LEN = cndtr;
        DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;
        DMA_InitStructure.DMA_MemoryBaseAddr = cmar;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize = cndtr;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA_CHx,&DMA_InitStructure);
}





void DMA1_USART3_init(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
        DMA_InitTypeDef DMA_InitStructure;
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
        DMA_DeInit(DMA_CHx);

        DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;
        DMA_InitStructure.DMA_MemoryBaseAddr = cmar;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize = cndtr;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA_CHx,&DMA_InitStructure);
}







void DMA1_UART4_init(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
        DMA_InitTypeDef DMA_InitStructure;
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2,ENABLE);
        DMA_DeInit(DMA_CHx);

        DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;
        DMA_InitStructure.DMA_MemoryBaseAddr = cmar;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize = cndtr;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA_CHx,&DMA_InitStructure);
}

最佳答案

查看完整内容[请看2#楼]

好吧,DMA接收时读一下串口的DR 和 SR就行了,也不知道哪里出了问题,反正这样就OK了。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2016-6-15
在线时间
5 小时
 楼主| 发表于 2016-6-16 17:28:50 | 显示全部楼层
好吧,DMA接收时读一下串口的DR 和 SR就行了,也不知道哪里出了问题,反正这样就OK了。。
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2016-6-15
在线时间
5 小时
 楼主| 发表于 2016-6-16 17:29:57 | 显示全部楼层
Enable_USART2_DMA();
                        DMA_ITConfig(DMA1_Channel6,DMA_IT_TC,ENABLE);

                        while(DMA_GetFlagStatus(DMA1_FLAG_TC6)==RESET);  //èô′«¸DÆ÷»μμô£¬Dè2éè¡′ëê©
                        DMA_ClearFlag(DMA1_FLAG_TC6);
                        DMA_Cmd(DMA1_Channel6,DISABLE);
                        DMA_ClearFlag(DMA1_FLAG_TC6|DMA1_FLAG_HT6|DMA1_FLAG_GL6|DMA1_FLAG_TE6);
                        Uart2Sends(USART2_BUF,320);
                                                       
                        check_ptr = sensor_data_checkout(USART2_BUF);

                        sensor_data_sort(check_ptr,1280);
                       
                        cal_average(sendbuf,check_ptr,1280);
       
       
       
                        Enable_USART3_DMA();
                        DMA_ITConfig(DMA1_Channel3,DMA_IT_TC,ENABLE);
                        while(DMA_GetFlagStatus(DMA1_FLAG_TC3)==RESET);
                        USART_DMACmd(USART2,USART_DMAReq_Rx,DISABLE);

                        DMA_ClearFlag(DMA1_FLAG_TC3|DMA1_FLAG_HT3|DMA1_FLAG_GL3|DMA1_FLAG_TE3);
                        DMA_Cmd(DMA1_Channel3,DISABLE);
                        Uart2Sends(USART3_BUF,320);
                        check_ptr = sensor_data_checkout(USART3_BUF);

                        sensor_data_sort(check_ptr,1280);
                       
                        cal_average(sendbuf,check_ptr,1280);
                       

                        Enable_UART4_DMA();
                        DMA_ITConfig(DMA2_Channel3,DMA_IT_TC,ENABLE);
                        while(DMA_GetFlagStatus(DMA2_FLAG_TC3)==RESET);
               
                        DMA_ClearFlag(DMA2_FLAG_TC3);
                        DMA_Cmd(DMA2_Channel3,DISABLE);
                        Uart2Sends(USART4_BUF,320);
                        check_ptr = sensor_data_checkout(USART4_BUF);

                        sensor_data_sort(check_ptr,1280);
                       
                        cal_average(sendbuf,check_ptr,1280);

这个是我使用的时候
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2016-6-15
在线时间
5 小时
 楼主| 发表于 2016-6-16 17:31:51 | 显示全部楼层
uart4唯一和前面两个不同的地方就是它用的DMA2,是不是我哪里用的不对,单独用的时候可以用和前面2个串口DMA一起用的时候怎么就不行了呢??
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2016-6-15
在线时间
5 小时
 楼主| 发表于 2016-6-16 17:36:31 | 显示全部楼层
file:///C:/Users/Administrator/Desktop/%25WBMX8BAXJX7O%5B)E02P(QDE.png
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2016-6-15
在线时间
5 小时
 楼主| 发表于 2016-6-16 17:39:08 | 显示全部楼层
寄存器的值,CNDTR的值一直不变,没有数据接收,但是我看了串口DR寄存器是在刷新数据的,所以肯定是DMA没工作了。。
H[VH[GVIAW@R`1$6CCS7T(7.png
%WBMX8BAXJX7O[)E02P(QDE.png
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2016-6-15
在线时间
5 小时
 楼主| 发表于 2016-6-16 17:40:26 | 显示全部楼层
有没有人碰到过这种问题,我自己实在是找不出问题。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-11 08:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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