OpenEdv-开源电子网

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

dma串口收发数据,各位大佬给帮忙看下我这个配置为啥进不了串口接收中断,在此谢过了,急求有偿

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2020-6-17
在线时间
1 小时
发表于 2020-6-21 12:58:29 | 显示全部楼层 |阅读模式
3金钱
#include "usart.h"
#include "dma.h"
#include "sys.h"         
#define UART_RX_LEN                128
u8 ccc=0;
u8 Res;
void uart_init(u32 bound){
  //GPIO¶Ë¿úéèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);        //ê1ÄüUSART1£¬GPIOAê±Öó

        //USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //¸′óÃíÆíìêä3ö
  GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOA.9

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

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

   //USART 3õê¼»ˉéèÖÃ

        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(USART1, &USART_InitStructure); //3õê¼»ˉ′®¿ú1
//  USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//¿aÆô′®¿ú½óêüÖD¶Ï
        USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
  USART_Cmd(USART1, ENABLE);   
//ê1Äü′®¿ú1

}

void USART1_IRQHandler(void)                        //′®¿ú1ÖD¶Ï·tÎñ3ìDò
{
                ccc=25;



          if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)//??!????if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)???
    {
        USART_ReceiveData(USART1);
    }
        if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)  //½óêÕÖD¶Ï(½óêÕμ½μÄêy¾Y±ØDëêÇ0x0d 0x0a½áÎ2)
        {
         USART1->SR;  
   USART1->DR;
                ccc=2;
                Receive_DataPack();
                USART_ReceiveData(USART1);
        }
//        if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
//        {               
//               
//       
//    Receive_DataPack();
//        }
}
void Receive_DataPack(void)
{

        uint32_t buff_length;
       
        DMA_Cmd(DMA1_Channel5, DISABLE);
       

        DMA_ClearFlag( DMA1_FLAG_TC5 );  

        buff_length = UART_RX_LEN         - DMA_GetCurrDataCounter(DMA1_Channel5);
   ccc=1;
        DMA_SetCurrDataCounter(DMA1_Channel5,UART_RX_LEN);   

        DMA_Cmd(DMA1_Channel5, ENABLE);      
       
}



#include"public.h"

/*′®¿ú½óêÕDMA»o′æ*/
uint8_t Uart_Rx[UART_RX_LEN] = {0};

/*′®¿ú·¢ËíDMA»o′æ*/
uint8_t Uart_Send_Buffer[100]={0};

uint8_t Data_Receive_Usart=0;


void usart_dma_init(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;
    USART_InitTypeDef        USART_InitStructure;
    DMA_InitTypeDef                DMA_InitStructure;
        NVIC_InitTypeDef        NVIC_InitStructure;


       
        /*  ÅäÖÃGPIOμÄÄ£ê½oíIO¿ú */       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;                                        //TX
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;                        //¸′óÃíÆíìêä3ö
        GPIO_Init(GPIOA,&GPIO_InitStructure);                                        //3õê¼»ˉ′®¿úêäèëIO
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;                                //RX
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;                //Ä£Äaêäèë
        GPIO_Init(GPIOA,&GPIO_InitStructure);        


       
    /*3õê¼»ˉ′®¿ú½óêÕoí·¢Ëíoˉêy*/
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;  
    USART_InitStructure.USART_StopBits = USART_StopBits_1;  
    USART_InitStructure.USART_Parity = USART_Parity_No;  
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   
    USART_InitStructure.USART_BaudRate = DEFAULT_BAUD;
       
        /*3õê¼»ˉ′®¿ú*/
    USART_Init(USART1,&USART_InitStructure);
       
        /*ÖD¶ÏÅäÖÃ*/
        USART_ITConfig(USART1,USART_IT_TC,DISABLE);
        USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);
        USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);
       
        //ÅäÖÃUART1ÖD¶Ï  
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;              //í¨μàéèÖÃÎa′®¿ú1ÖD¶Ï  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;      //ÖD¶ÏÕ¼Ïèμè¼¶0  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;             //ÖD¶ÏÏìó|óÅÏè¼¶0  
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                //′ò¿aÖD¶Ï  
    NVIC_Init(&NVIC_InitStructure);



        /*DMA·¢ËíÖD¶ÏéèÖÃ*/
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
       
        /*DMA1í¨μà4ÅäÖ÷¢Ëí*/
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
        DMA_DeInit(DMA1_Channel4);
        DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Uart_Send_Buffer;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
        DMA_InitStructure.DMA_BufferSize = 100;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel4,&DMA_InitStructure);
        DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);
        //DMA_Cmd(DMA1_Channel4, ENABLE);//ê1Äüí¨μà4£¬ò»°ã·¢ËíμÄê±oòÔùê1Äü



        /*DMA1í¨μà5ÅäÖýóêÕ*/
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
        DMA_DeInit(DMA1_Channel5);
        DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Uart_Rx;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize = UART_RX_LEN;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        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_VeryHigh;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel5,&DMA_InitStructure);

        /*ê1Äüí¨μà5*/
        DMA_Cmd(DMA1_Channel5,ENABLE);



        //2éóÃDMA·½ê½·¢Ëí
        USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
       
        //2éóÃDMA·½ê½½óêÕ
        USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
       
    //Æô¶ˉ′®¿ú  
    USART_Cmd(USART1, ENABLE);
}
       

/**@ brief ê1Äü·¢Ëíêy¾Y
*
* Æô¶ˉDMAêy¾Y·¢Ëí1|Äü
*
* @param size±íê¾Dèòa·¢ËíμÄDMAÖDêy¾Yμĸöêy
*/
void uart_dma_send_enable(uint16_t size)
{
    DMA1_Channel4->CNDTR = (uint16_t)size;
    DMA_Cmd(DMA1_Channel4, ENABLE);      
}       
       

/**@ brief′®¿ú1½óêÕÖD¶Ï
*
* êÕμ½ò»Ö¡êy¾Y½øèëò»′Σ¬½øDDDMAμĶáè¡
*
*/
void USART1_IRQHandler(void)                              
{   
        uint32_t temp = 0;
        uint16_t i = 0;
       
        if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
    {
            //USART_ClearFlag(USART1,USART_IT_IDLE);
            temp = USART1->SR;
            temp = USART1->DR; //ÇåUSART_IT_IDLE±êÖ¾
               
            DMA_Cmd(DMA1_Channel5,DISABLE);

                temp = UART_RX_LEN - DMA_GetCurrDataCounter(DMA1_Channel5);
                for (i = 0;i < temp;i++)
                {
                        Data_Receive_Usart = Uart_Rx;
                       
                        //+++&#182;&#212;ê&#213;μ&#189;μ&#196;êy&#190;Y&#188;óò&#187;oó&#187;&#216;·¢3&#246;襠              
                        Uart_Send_Buffer=Data_Receive_Usart+1;                                               
                        uart_dma_send_enable(temp);
                        //+++                       
                }
               
                //éè&#214;&#195;′&#171;ê&#228;êy&#190;Y3¤&#182;è
                DMA_SetCurrDataCounter(DMA1_Channel5,UART_RX_LEN);
               
            //′ò&#191;aDMA
                DMA_Cmd(DMA1_Channel5,ENABLE);
    }
}        



/**@ brief DMA·¢&#203;í&#214;D&#182;&#207;
*
* ·¢&#203;íêy&#190;Y£&#172;&#189;&#171;DMA&#214;Dμ&#196;êy&#190;Y·¢&#203;í3&#246;è¥
*
*/
void DMA1_Channel4_IRQHandler(void)
{
    if(DMA_GetITStatus(DMA1_FLAG_TC4)==SET)
    {
            DMA_ClearFlag(DMA1_FLAG_GL4);        
            DMA_Cmd(DMA1_Channel4, DISABLE);  
    }
}








正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-6-22 02:09:04 | 显示全部楼层
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2019-4-30
在线时间
4 小时
发表于 2020-8-6 15:07:40 | 显示全部楼层
帮顶      
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 12:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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