2474|4

12

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

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

  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. }
复制代码


此帖出自stm32/stm8论坛

最新回复

确实晕,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);                      详情 回复 发表于 2015-12-15 01:41
点赞 关注
 

回复
举报

466

帖子

0

TA的资源

版主

沙发
 
用寄存器看了晕晕啊,但是注释的配置好像没问题啊。你用查询1byte产生的中断过程中可能会给后面的数据覆盖啊。你改用大点的buffer试试啊、
此帖出自stm32/stm8论坛
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
不是这个原因吧
此帖出自stm32/stm8论坛
 
 

回复

4008

帖子

0

TA的资源

版主

4
 
确实晕,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);
                  
此帖出自stm32/stm8论坛
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

5
 
怎么把中断去了啊?我试了试没去成功
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条
ADI &文晔 探索季第一站,邀您在活动帖跟帖,ADI资深工程师将与您一道寻求解决之道! ...
春晚,最出圈当属穿着棉马甲跳秧歌的机器人”秧Bot”。
转手绢、飞手绢、变换队形,精准度和稳定性甚至超越人类,这背后少不了电机控制技术。

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表