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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版