OpenEdv-开源电子网

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

DMA_USART1通信收发不正常

[复制链接]

2

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-2-25
在线时间
3 小时
发表于 2016-3-17 09:48:57 | 显示全部楼层 |阅读模式
1金钱
#include "stm32f2xx.h"
#include <stdio.h>
#define USART1_DR_ADDRESS                ((uint32_t)USART1 + 0x04)
#define DMA_Rec_Len 32                //DMA&#189;óê&#213;&#187;o′&#230;&#199;&#248;′óD&#161;


void RCC_Configuration(void);
void NVIC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
void DMA_Configuration(void);
void USART1_SendString(uint8_t *ch);
void UART1_SendByte(uint16_t Data);
void USART1_Send(u8 *buf,u8 len);


uint8_t DMA_Rece_Buf[DMA_Rec_Len];                //DMA&#189;óê&#213;&#187;o′&#230;&#199;&#248;
int16_t USART1_Rec_Cnt=0,flag=0;            //&#189;óê&#213;μ&#189;×&#214;·&#251;′&#174;′óD&#161;
uint8_t j[]="transfer completely!";

int main(void)
{
  //int16_t j;
        uint8_t i;
       
       
  RCC_Configuration();
  GPIO_Configuration();
  USART_Configuration();

        DMA_Configuration();
       
        NVIC_Configuration();
        for(i=0;i<DMA_Rec_Len;i++)
        {
                DMA_Rece_Buf[i]=0;
        }
       
       
       
       
  while (1)
  {
                if(flag!=0)
                {
                        USART1_SendString(j);
                        flag=0;
                }
                /*&#189;&#171;ê&#213;μ&#189;μ&#196;êy&#190;Y·¢&#187;&#216;襠               &#191;éò&#212;ê&#199;&#198;&#228;&#203;&#251;&#214;÷3ìDò
                if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)
                {                   
                        i = USART_ReceiveData(USART1);
                        USART_SendData(USART1, i);
                        for(j=0;j<500;j++);
                }*/
        }

}


void DMA_Configuration(void)
{  
  DMA_InitTypeDef  DMA_InitStructure;
        DMA_DeInit(DMA2_Stream5);                  //3&#245;ê&#188;&#187;ˉDMA2_Stream5                                                                                 
        DMA_InitStructure.DMA_Channel = DMA_Channel_4;                //&#209;&#161;&#212;&#241;í¨μà5
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;                 //′&#171;ê&#228;·&#189;&#207;ò&#206;aíaéèμ&#189;DMA
        DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_ADDRESS;                                //íaéèμ&#216;&#214;·
        DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)DMA_Rece_Buf;                        //DMA&#189;óê&#213;&#187;o′&#230;&#199;&#248;μ&#216;&#214;·
        DMA_InitStructure.DMA_BufferSize = DMA_Rec_Len;                                //&#189;óê&#213;&#187;o′&#230;&#199;&#248;′óD&#161;
        DMA_Init(DMA2_Stream5, &DMA_InitStructure);                                //éè&#214;&#195;DMA2_Stream5

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                                //íaéèμ&#216;&#214;·2&#187;μY&#212;&#246;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                                                                //&#196;ú′&#230;μ&#216;&#214;·μY&#212;&#246;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;                        //íaéèêy&#190;Y&#191;í&#182;è&#206;a8&#206;&#187;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;                                                //&#196;ú′&#230;êy&#190;Y&#191;í&#182;è&#206;a8&#206;&#187;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                                //DMA&#196;£ê&#189;&#206;a&#209;-&#187;·&#196;£ê&#189;
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;                                //ó&#197;&#207;è&#188;&#182;×&#238;&#184;&#223;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
  /*DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;*/
        DMA_Init(DMA2_Stream5, &DMA_InitStructure);
       
        /* Enable the USART Rx DMA request */
        USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);   
        /* Enable the DMA RX Stream */
        DMA_Cmd(DMA2_Stream5, ENABLE);       
}       

//USART1
void USART1_IRQHandler(void)
{

  u16 i;
        flag=1;
  if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)////&#189;óê&#213;&#214;D&#182;&#207;
  {
                DMA_Cmd(DMA2_Stream5, DISABLE);//1&#216;±&#213;USART1 TX DMA1 &#203;ù&#214;&#184;ê&#190;μ&#196;í¨μà   
                if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)
                {                       
                        USART_ClearFlag(USART1,USART_FLAG_ORE); //&#207;è&#182;áSR
                        USART_ReceiveData(USART1); //&#212;ù&#182;áDR
                }

                USART1_Rec_Cnt= DMA_Rec_Len-DMA_GetCurrDataCounter(DMA2_Stream5);
                USART1_Send(DMA_Rece_Buf,USART1_Rec_Cnt);
                USART_ClearITPendingBit(USART1, USART_IT_IDLE|USART_IT_RXNE|USART_IT_TC);                                //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;
          //USART_ITConfig(USART1, USART_IT_IDLE , ENABLE);  
    /* Clear all DMA Streams flags */
    DMA_ClearFlag(DMA2_Stream5, DMA_FLAG_HTIF2 | DMA_FLAG_TCIF2);
                  
                DMA_SetCurrDataCounter(DMA2_Stream5,DMA_Rec_Len);//DMAí¨μàμ&#196;DMA&#187;o′&#230;μ&#196;′óD&#161;
                DMA_Cmd(DMA2_Stream5, ENABLE);  //ê1&#196;üUSART1 TX DMA1 &#203;ù&#214;&#184;ê&#190;μ&#196;í¨μà

        }
}
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  /*Enable DMA Interrupt
  NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream5_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);*/
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
/*éè&#214;&#195;ê±&#214;ó*/

void RCC_Configuration(void)
{
        RCC_DeInit();       

        RCC_HSICmd(ENABLE);
        while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET){}
       
        RCC_HCLKConfig(RCC_SYSCLK_Div1);
        RCC_PCLK1Config(RCC_HCLK_Div4);
        RCC_PCLK2Config(RCC_HCLK_Div2);
       
        FLASH_SetLatency(FLASH_Latency_7) ;
        FLASH_PrefetchBufferCmd(ENABLE);
       
        RCC_PLLConfig(RCC_PLLSource_HSI, 16, 240, 2, 5);

        RCC_PLLCmd(ENABLE);
        while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
}  

                /*GPIOéè&#214;&#195;*/

void GPIO_Configuration(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
       
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USART1);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART1);


  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        //í&#198;íìê&#228;3&#246;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;                //é&#207;à-ê&#228;è&#235;

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;       
  GPIO_Init(GPIOC, &GPIO_InitStructure);       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 ;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
}


                /*USARTéè&#214;&#195;*/

void USART_Configuration(void)
{
        USART_InitTypeDef USART_InitStructure;
       
        USART_InitStructure.USART_BaudRate = 115200;
  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_ClearFlag(USART1, USART_FLAG_TC);
  USART_Init(USART1, &USART_InitStructure);
  USART_ITConfig(USART1, USART_IT_IDLE , ENABLE);  
        //USART_ITConfig(USART1, USART_IT_RXNE , ENABLE);  
  USART_Cmd(USART1, ENABLE);
}
void USART1_Send(u8 *buf,u8 len)
{
        u8 t;
          for(t=0;t<len;t++)                //&#209;-&#187;··¢&#203;íêy&#190;Y
        {                        
                while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);          
                USART_SendData(USART1,buf[t]);
        }         
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);               
}
void USART1_SendString(uint8_t *ch)
{
        while(*ch!=0)
        {               
                while(!USART_GetFlagStatus(USART1, USART_FLAG_TXE));
                USART_SendData(USART1, *ch);
                ch++;
        }          
}

void UART1_SendByte(uint16_t Data)
{
   while (!(USART1->SR & USART_FLAG_TXE))
         {}
    USART_SendData(USART1, Data);
}
收到的数据与发送的相差太大,求大神帮帮忙啊

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-3-17 22:56:41 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 01:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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