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

stm32F1 利用DMA做USART接收資料問題

[复制链接]
sappppp 提问时间:2016-3-29 11:18 /
請問我利用DMA來接收PC端輸入的數據資料,不用中斷來實現,可是卻無法得到資料。想要請問哪裡出錯呢?
謝謝
#define USART1_DR_Base  0x40013804
uint32_t SendBuff[4];
void USART_Configuration1(void)
{
    USART_InitTypeDef USART_InitStructure;
    USART_ClockInitTypeDef  USART_ClockInitStructure;   
    USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
    USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
    USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
    USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
    USART_ClockInit(USART1, &USART_ClockInitStructure);
    USART_InitStructure.USART_BaudRate = 4800;
    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_Init(USART1, &USART_InitStructure);
    USART_Cmd(USART1, ENABLE);
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
}

void USART_DMA_Configuration(void)
{
    DMA_InitTypeDef DMA_InitStructure;
    DMA_DeInit(DMA1_Channel4);
    DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ReadBuff;   
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize =4;
    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_Medium;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel4, &DMA_InitStructure);   
    DMA_ITConfig(DMA1_Channel4, DMA_IT_TC,ENABLE);
    USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
    DMA_Cmd(DMA1_Channel4, ENABLE);      
}

接收PC端數據,此段寫再MAIN裡面
           if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
           {  
              temp = USART1->SR;  
              temp = USART1->DR;
              DMA_Cmd(DMA1_Channel4,DISABLE);   
              temp = UART_RX_LEN - DMA_GetCurrDataCounter(DMA1_Channel4);               
              for (i=0; i<temp ; i++)
              {
                Data_Receive_Usart = SendBuff[i];  // 讀取PC數據
              }
              DMA_SetCurrDataCounter(DMA1_Channel4,UART_RX_LEN);  
              DMA_Cmd(DMA1_Channel4,ENABLE);            
            }

收藏 评论4 发布时间:2016-3-29 11:18

举报

4个回答
power568 回答时间:2016-3-29 11:31:41
串口和DMA外设时钟均没使能...
sappppp 回答时间:2016-3-29 11:37:40
這個我再前面的程式碼已經使能過了,但是不知道為什麼還是讀取不到資料。     
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
您指的應該是兩段碼吧!
xmshao 回答时间:2016-3-29 12:09:53
1\ 你确认下DMA相关通道是否配置正确;
2、你不是电脑发数据到UART_DR,再由DMA传输到readbuf吗?数据到这里查看就行。怎么看到
你在MAIN里不停读UART_DR.
sappppp 回答时间:2016-3-29 15:26:55
想請問 PC輸入為字串,如"123"時,再main裡面的接收程式到底要怎麼寫才可以完整接收到呢?
且接收到的數字怎麼可以讓其他函式使用呢?
我將我的程式改成以下接收到字元,再將字元輸出。這樣是可以接收到每個字元,但是怎麼變成一個數字和如何被其他函式所使用,就不得而知了。
           if(USART1->SR & USART_FLAG_RXNE)
           {              
              temp = USART1->SR;  
              temp = USART1->DR;
              USART_SendData(USART1, temp);
              while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
             }

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版