你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

DMA_USART1通信收发不正常

[复制链接]
stm32_f2 提问时间:2016-3-17 10:22 /
#include "stm32f2xx.h"
#include <stdio.h>
#define USART1_DR_ADDRESS                ((uint32_t)USART1 + 0x04)
#define DMA_Rec_Len 32               


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];           
int16_t USART1_Rec_Cnt=0;        

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

  RCC_Configuration();
  GPIO_Configuration();
  USART_Configuration();

        DMA_Configuration();

        NVIC_Configuration();

  while (1)
  {


}


void DMA_Configuration(void)
{  
  DMA_InitTypeDef  DMA_InitStructure;
        DMA_DeInit(DMA2_Stream5);                                                   
        DMA_InitStructure.DMA_Channel = DMA_Channel_4;               
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;               
        DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_ADDRESS;                       
        DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)DMA_Rece_Buf;                     
        DMA_InitStructure.DMA_BufferSize = DMA_Rec_Len;                              
        DMA_Init(DMA2_Stream5, &DMA_InitStructure);                              

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                              
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                                                   
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;                     
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;                                             
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                              
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;                                
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;

   DMA_Init(DMA2_Stream5, &DMA_InitStructure);


USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);   

DMA_Cmd(DMA2_Stream5, ENABLE);        
}

//USART1
void USART1_IRQHandler(void)
{

  u16 i;
        flag=1;
  if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)////½óêÕÖD¶Ï
  {
                DMA_Cmd(DMA2_Stream5, DISABLE);//1رÕUSART1 TX DMA1 ËùÖ¸ê¾μÄí¨μà   
                if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)
                {                        
                        USART_ClearFlag(USART1,USART_FLAG_ORE); //Ïè¶áSR
                        USART_ReceiveData(USART1); //Ôù¶á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);  
          //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_Cmd(DMA2_Stream5, ENABLE);

        }
}
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);
}
/*éèÖÃê±Öó*/

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éèÖÃ*/

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;        //íÆíìêä3ö
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;                //éÏà-êäèë

        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éèÖÃ*/

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++)                //Ñ-»··¢Ëíêy¾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++;
        }           
}


收到的数据与发送的相差太大,求大神帮帮忙啊

收藏 评论3 发布时间:2016-3-17 10:22

举报

3个回答
power568 回答时间:2016-3-17 12:30:20
  是么意思,是单次相差大,还是总数               
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;                     
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;     
以上大小更改为byte,                                       
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;         
更改为Normal试试看。            

另:建议不要再接收中断中立即发送数据!!!

祝你好运...

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

废鱼 回答时间:2016-3-17 15:13:04
如楼上所说,中断中收发数据导致数据丢失。
buainilema 回答时间:2016-3-17 17:26:05
中断收还是可以的,就是发的有问题了,,哪有,建议你把发的放在中断外进行发送

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版