哪位大神帮我看看哪错了?DMA通道传输完成了,DR中也有数据但是没有写到数组hh里边

2019-03-23 18:23发布

  1. UART3Init();
  2.     RS485_SendByte(0x00);
  3.     Delay2(10);
  4.     hh[0]=0x66;
  5.      
  6.     MYDMA_Config(DMA1_Channel3,(u32)&USART3->DR,(u32)hh,1);//DMA1通道3,外设为串口3,存储器为hh,长度1
  7.     USART3->CR3=1<<6;           //使能串口3的DMA接收
  8.     MYDMA_Enable(DMA1_Channel3);//开始一次DMA传输!*/
  9. //    MYDMA_Config(DMA1_Channel2,(u32)&USART3->DR,(u32)SendBuf,1);//DMA1通道3,外设为串口3,存储器为hh,长度1   

  10.     while (1)
  11.     {
  12.         u8 res;      
  13.         Delay2(10);      
  14.         if(DMA1->ISR&(1<<9))
  15.         {
  16.             //LED0=1;//提示系统正在运行
  17.             DMA1->IFCR|=1<<9;//清除通道3传输完成标志
  18.             LCD_ShowByte(105,60+20,hh[0]);
  19.         }}
复制代码
  1. void UART3Init(void)
  2. {
  3.     NVIC_InitTypeDef NVIC_InitStructure;
  4.     GPIO_InitTypeDef GPIO_InitStructure;
  5.     USART_InitTypeDef USART_InitStructure;
  6.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
  7.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  8.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);//使能外设时钟   
  9.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 ;
  10.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  11.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  12.     GPIO_Init(GPIOD, &GPIO_InitStructure);
  13.      
  14.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;      
  15.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  16.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  17.     GPIO_Init(GPIOF, &GPIO_InitStructure);   
  18.      
  19.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  20.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  21.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  22.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  23.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  24.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  25.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  26.      
  27.      
  28.     USART_InitStructure.USART_BaudRate = 38400;
  29.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  30.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  31.     USART_InitStructure.USART_Parity = USART_Parity_No;
  32.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  33.     USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
  34.     USART_Init(USART3, &USART_InitStructure);
  35.     USART_Cmd(USART3, ENABLE);
  36.     GPIO_ResetBits(GPIOB, GPIO_Pin_2);
  37.     USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);

  38.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  39.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  40.     GPIO_Init(GPIOA, &GPIO_InitStructure);   
  41.     /*  UART2中断配置  */
  42.     NVIC_InitStructure.NVIC_IRQChannel = 39;
  43.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级
  44.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//子优先级
  45.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  46.     NVIC_Init(&NVIC_InitStructure);}
复制代码
  1. void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
  2. {
  3.     u32 DR_Base;  //做缓冲用,不知道为什么.非要不可
  4.     RCC->AHBENR|=1<<0;//开启DMA1时钟
  5.     DR_Base=cpar;
  6.     DMA_CHx->CPAR=DR_Base;      //DMA1 外设地址
  7.     DMA_CHx->CMAR=(u32)cmar; //DMA1,存储器地址
  8.     DMA1_MEM_LEN=cndtr;      //保存DMA传输数据量
  9.     DMA_CHx->CNDTR=cndtr;    //DMA1,传输数据量
  10.     DMA_CHx->CCR=0X00000000;//复位
  11.     DMA_CHx->CCR|=1<<4;  //从存储器读
  12.     DMA_CHx->CCR|=0<<5;  //普通模式
  13.     DMA_CHx->CCR|=0<<6;  //外设地址非增量模式
  14.     DMA_CHx->CCR|=1<<7;  //存储器增量模式
  15.     DMA_CHx->CCR|=0<<8;  //外设数据宽度为8位
  16.     DMA_CHx->CCR|=0<<10; //存储器数据宽度8位
  17.     DMA_CHx->CCR|=1<<12; //中等优先级
  18.     DMA_CHx->CCR|=0<<14; //非存储器到存储器模式            
  19. }
复制代码
  1. void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
  2. {
  3.     DMA_CHx->CCR&=~(1<<0);       //关闭DMA传输
  4.     DMA_CHx->CNDTR=DMA1_MEM_LEN; //DMA1,传输数据量
  5.     DMA_CHx->CCR|=1<<0;          //开启DMA传输
  6. }
复制代码

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
weizhongc
1楼-- · 2019-03-24 01:05
/ 用寄存器看了晕晕啊,但是注释的配置好像没问题啊。你用查询1byte产生的中断过程中可能会给后面的数据覆盖啊。你改用大点的buffer试试啊、
mynameisbill2
2楼-- · 2019-03-24 06:09
 精彩回答 2  元偷偷看……
Li_Lei
3楼-- · 2019-03-24 10:36
确实晕,dr有东西串口应该没问题,我怎么记得中断和dma只能用一个呀,这个是以前用过的
          USART_DMACmd(USARTX, USART_DMAReq_Tx, ENABLE);
          USART_DMACmd(USARTX, USART_DMAReq_Rx, ENABLE);
          // DMA接收 //
          DMA_DeInit(USART_RX_DMA_CHANNELX);
          DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(USARTX->DR);
          DMA_InitStructure.DMA_MemoryBaseAddr = (u32)Received_Data_Buffer;
          DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
                //收到1个数据后开始处理
          DMA_InitStructure.DMA_BufferSize = USART_PACKET_SIZE;
                DMA_InitStructure.DMA_BufferSize = 1;
                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_Low;
          DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;               
          DMA_Init(USART_RX_DMA_CHANNELX, &DMA_InitStructure);
        DMA_Cmd(USART_RX_DMA_CHANNELX, ENABLE);
          USART_Cmd(USARTX, ENABLE);
        DMA_ITConfig(USART_RX_DMA_CHANNELX, DMA_IT_TC, ENABLE);
                  
mynameisbill2
4楼-- · 2019-03-24 12:12
怎么把中断去了啊?我试了试没去成功

一周热门 更多>