打印
[STM32F1]

STM32 串口DMA问题

[复制链接]
1703|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hddhcm|  楼主 | 2013-12-25 17:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好:
    我用STM32将串口通讯放在DMA上发送数数据没什么问题,接收数据那:
          if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
        {

                LEDB(ON);
                DMA_Cmd(DMA1_Channel5, DISABLE);        //关闭DMA,防止处理其间有数据

                DMA1_Channel5->CMAR         = (uint32_t)USARTx1.Rece_Buffer;
                DMA1_Channel5->CNDTR = 64;                        //重装填
                DMA_Cmd(DMA1_Channel5, ENABLE);
                if(USART_GetITStatus(USART1, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)//出错
        {
           USART_ClearITPendingBit(USART1, USART_IT_PE | USART_IT_FE | USART_IT_NE);
        }
                else{}
        //USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        USART_ClearITPendingBit(USART1, USART_IT_IDLE);
                //DMA_ClearITPendingBit(DMA1_IT_TC5);        //清除传输完毕中断
                //DMA_ClearITPendingBit(DMA1_IT_TE5);               
        }
        else{}
   程序初始化完毕之后,发送一直没问题,但是我从上位机发一帧数据下去之后,整个程序仿佛死了一样有做watchdog,望各位大侠指点迷津!
沙发
ABHK| | 2013-12-25 20:23 | 只看该作者
抽空帮楼主  看一看   老专家  会诊

使用特权

评论回复
板凳
kenmy| | 2013-12-25 21:02 | 只看该作者
顶起来,希望有大虾帮你解决困惑

使用特权

评论回复
地板
hddhcm|  楼主 | 2013-12-26 15:32 | 只看该作者
void DMA_Config(void)
{
    DMA_InitTypeDef DMA_InitStructure;

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        //开启DMA时钟

        DMA_DeInit(DMA1_Channel4);
        /*设置DMA源:内存地址&串口数据寄存器地址*/
    DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;          
        /*内存地址(要传输的变量的指针)*/
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USARTx1.Tran_Buffer;
        /*方向:从内存到外设*/               
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;       
        /*传输大小DMA_BufferSize=SENDBUFF_SIZE*/       
    DMA_InitStructure.DMA_BufferSize = USART1_BUFF_SIZE;//最大通讯长度
        /*外设地址不增*/            
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        /*内存地址自增*/
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;       
        /*外设数据单位*/       
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
        /*内存数据单位 8bit*/
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         
        /*DMA模式:一次传输,循环*/
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA_Mode_Normal          
        /*优先级:中*/       
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  
        /*禁止内存到内存的传输        */
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        /*配置DMA1的4通道*/                  
    DMA_Init(DMA1_Channel4, &DMA_InitStructure);           
        //DMA_Cmd(DMA1_Channel4,ENABLE);                                        //使能DMA
        //intterupt enable
        DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);
          DMA_ITConfig(DMA1_Channel4, DMA_IT_TE, ENABLE);

        USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);         //enable Tx data request
          /* Enable USART1 DMA TX request */

        DMA_Cmd(DMA1_Channel4,DISABLE);       
/*****************************************************************************/
/* DMA1 Channel5 (triggered by USART1 Rx event) Config */
          DMA_DeInit(DMA1_Channel5);  
          DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
          DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USARTx1.Rece_Buffer;
          DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
          DMA_InitStructure.DMA_BufferSize = USART1_BUFF_SIZE;
          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_Circular;
          DMA_InitStructure.DMA_Priority = DMA_Priority_High;
          DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
          DMA_Init(DMA1_Channel5, &DMA_InitStructure);

          DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);
          DMA_ITConfig(DMA1_Channel5, DMA_IT_TE, ENABLE);
          
          /* Enable USART1 DMA RX request */
          USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
          DMA_Cmd(DMA1_Channel5, ENABLE);       
}

使用特权

评论回复
5
hddhcm|  楼主 | 2013-12-26 15:34 | 只看该作者
DMA配置我看大家都是这样写的,在没有接受数据之前!发送一点问题都没有!但是从上位机发了一帧数据之后发送也不能发送了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

1

粉丝