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

STM32F407VET6串口DMA空闲中断接收不到数据,求救

[复制链接]
suebillt 提问时间:2015-11-19 17:34 /
本帖最后由 suebillt 于 2015-11-19 17:36 编辑

[size=1em][size=1em][size=1em]
debug看到USART->DR里面是有数据的,IDLE中断也能进去,但是貌似DMA不工作



[size=1em][size=1em]DMA_GetCurrDataCounter(DMA2_Stream2);一直是0</pre>
[size=1em]串口配置如下
[size=1em]

[size=1em]
  1. void UART1_Config(u32 bound)
  2. {       
  3.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //开GPIOA时钟
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//开USART1时钟
  5. //串口1对应引脚复用映射
  6.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9¸复用为USART1
  7.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10
  8.        
  9.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
  11.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO速度50M
  12.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推免复用输出
  13.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
  14.         GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化IO
  15. //USART1 初始化
  16.         USART_InitStructure.USART_BaudRate = bound;//波特率设置
  17.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8bit
  18.         USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位
  19.         USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验
  20.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流控制
  21.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //打开发送和接收
  22.     USART_Init(USART1, &USART_InitStructure); //初始化串口1
  23.        
  24.     USART_Cmd(USART1, ENABLE);  //开启串口1
  25.         USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
  26.        
  27.         //USART_ClearFlag(USART1, USART_FLAG_TC);       
  28. //中断设置
  29.         USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//空闲中断
  30.     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
  31.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级3
  32.         NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;                //子优先级3
  33.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  34.         NVIC_Init(&NVIC_InitStructure);        //初始化
  35.         //DMA使能
  36.         RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_DMA2, ENABLE);  //Ǵ֯DMAʱד  

  37.         DMA_DeInit(DMA2_Stream2);         //DeInit   
  38.        
  39.     DMA_InitStructure.DMA_Channel = DMA_Channel_4;  //通道选择
  40.         DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&(USART1->DR));//源地址
  41.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Uart_Rx1;     //目的地址
  42.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;            //外设到内存
  43.         DMA_InitStructure.DMA_BufferSize = UART1_RX_LEN;               //数据传输量
  44.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
  45.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;      //内存增量模式
  46.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//数据长度8bit
  47.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;    //存储器数据长度8bit
  48.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                //普通模式
  49.         DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;      // 优先级高
  50.     DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;         
  51.     DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;       
  52.     DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输
  53.     DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
  54.     DMA_Init(DMA2_Stream2, &DMA_InitStructure);//初始化
  55.         DMA_Cmd(DMA2_Stream2,ENABLE);     //使能  
  56. }
复制代码




[size=1em]
[size=1em]




收藏 评论8 发布时间:2015-11-19 17:34

举报

8个回答
creep 回答时间:2015-11-19 18:02:37
//DMA使能
        RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_DMA2, ENABLE);  //Ǵ֯DMAʱד  
suebillt 回答时间:2015-11-19 18:17:31
creep 发表于 2015-11-19 18:02
//DMA使能
        RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_DMA2, ENABLE);  //Ǵ֯DMAʱד

谢谢,看的真仔细,F4与F1有不同之处就是下面一句不能重装填了,还有啥好办法
  1.                   DMA2_Stream2->NDTR = UART1_RX_LEN;//重装填,并让接收地址从0开始
复制代码
creep 回答时间:2015-11-19 18:22:24
suebillt 发表于 2015-11-19 18:17
谢谢,看的真仔细,F4与F1有不同之处就是下面一句不能重装填了,还有啥好办法
...

可以重载啊,一样的先disabled然后重载再enable。
suebillt 回答时间:2015-11-19 19:25:37
creep 发表于 2015-11-19 18:22
可以重载啊,一样的先disabled然后重载再enable。
  1. void USART1_IRQHandler(void)                                 
  2. {     
  3.         uint32_t Length = 0;
  4.         u16 i;
  5.         if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)  
  6.         {  
  7.                   DMA_Cmd(DMA2_Stream2,DISABLE);
  8.                   Length = USART1->SR;  
  9.                   Length = USART1->DR; //清除标志位
  10.                         Length = UART1_RX_LEN - DMA_GetCurrDataCounter(DMA2_Stream2);               
  11.   
  12.                                 printf("\r\n%d",Length);
  13.          for(i=0;i<Length;i++)
  14.                           {
  15.                                         printf("\r\n%c",Uart_Rx1[i]);
  16.          }                         
  17.                   DMA2_Stream2->NDTR = UART1_RX_LEN;//重装填,并让接收地址从0开始
  18.                   DMA_Cmd(DMA2_Stream2, ENABLE);//处理完,重开DMA   
  19.         }

  20.         __nop();   
  21. }
复制代码

我这么写的,只能传输一次
suebillt 回答时间:2015-11-19 19:53:08
creep 发表于 2015-11-19 18:22
可以重载啊,一样的先disabled然后重载再enable。

        好吧,循环模式可以
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
creep 回答时间:2015-11-19 20:29:36
suebillt 发表于 2015-11-19 19:53
好吧,循环模式可以
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

能用就行。  
abclsl 回答时间:2015-11-20 10:07:47
帮顶 !!
suebillt 回答时间:2015-11-20 10:51:47

谢谢你的耐心解答

所属标签

相似问题

官网相关资源

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