发新帖我要提问
12
返回列表
打印

usart1实现DMA出现的接收问题

[复制链接]
楼主: humanking7
手机看帖
扫描二维码
随时随地手机跟帖
21
pybieku| | 2013-3-13 11:23 | 只看该作者 回帖奖励 |倒序浏览
void DMA_Config_Recv(void)
{
          DMA_InitTypeDef DMA_InitStructure;
          // DMA clock enable //
          RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//DMA1
          DMA_DeInit(DMA1_Channel5);                                                                         
          DMA_InitStructure.DMA_PeripheralBaseAddr   = PERIPH_ADDR_USART1_DR ;
          DMA_InitStructure.DMA_MemoryBaseAddr       = (uint32_t)pCmdDoubleList->CurBufStr.s_uintRecvBufAddr ;  //See "usart_dma.h"                       
          DMA_InitStructure.DMA_DIR                  = DMA_DIR_PeripheralSRC;
          DMA_InitStructure.DMA_BufferSize           = DMA_BUF_LEN ;        //See "usart_dma.h"          
          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_Mode_Circular;   
          DMA_InitStructure.DMA_Priority             = DMA_Priority_VeryHigh ;     //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);  //Enable Rx

}

使用特权

评论回复
22
pybieku| | 2013-3-13 11:24 | 只看该作者
宏定义
#define  DMA_BUF_NUM           16        //  
#define  DMA_BUF_LEN           96        //  The MAX number DMA rx data , which should more length than the expected one (i.e. Usart rx-data is N, here is the M , M>N)


DMA_InitStructure.DMA_MemoryBaseAddr       用具体的接收数组进行初始化

使用特权

评论回复
23
pybieku| | 2013-3-13 11:28 | 只看该作者
本帖最后由 pybieku 于 2013-3-13 11:30 编辑

#define  DMA_BUFFER_LEN_TX     16
unsigned char USART_DMA_InitBuf[] = "DMA_Config First!" ;



void DMA_Config_Send(void)
{
          DMA_InitTypeDef DMA_InitStructure;
          DMA_DeInit(DMA1_Channel4); // Reset the Register of DMA1_Ch4
          // DMA Mapping  USART1_TX  <==> DMA1_Ch4
          DMA_InitStructure.DMA_PeripheralBaseAddr = PERIPH_ADDR_USART1_DR ;
          DMA_InitStructure.DMA_MemoryBaseAddr     = (uint32_t)((unsigned char*)USART_DMA_InitBuf) ;  //每次都不一样,需要更新!!!
         
          DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralDST;      // see "stm32f10x_dma.h"         :  from Memory to Peripheral
          DMA_InitStructure.DMA_BufferSize         = DMA_BUFFER_LEN_TX ;//每次都不一样,需要更新!!!
          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_Mode_Circular
          DMA_InitStructure.DMA_Priority           = DMA_Priority_High ;         //10 for high priority.
          DMA_InitStructure.DMA_M2M                = DMA_M2M_Disable ;
          DMA_Init(DMA1_Channel4, &DMA_InitStructure);
          //enable the DMA interrupt both  transfer-complete and transfer-error
          DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);   
          DMA_ITConfig(DMA1_Channel4, DMA_IT_TE, ENABLE);
          // Enable USART1 DMA TX request //
          USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
          // init disable DMA
          DMA_Cmd(DMA1_Channel4, DISABLE);        //收到有效的数据包后,会有发允许标志,然后才启动发送!!! MAIN function DOES THIS JOB!
}

使用特权

评论回复
24
humanking7|  楼主 | 2013-3-16 01:12 | 只看该作者
pybieku 发表于 2013-3-13 11:20
代码上传好麻烦

那您能不能发我邮箱,qfx_007@126.com,3q

使用特权

评论回复
25
qiurenguo| | 2013-3-16 17:12 | 只看该作者
你设置成64个呗,然后开DMA半中断和全中断,当接收一半数据了进入中断,处理好后在设置DMA地址从第0个开始接收

使用特权

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

本版积分规则