OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5053|回复: 6

请教版主,为什么我的USART1的DMA发送中断正常,DMA接收中断只能进一次呢?

[复制链接]

2

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-15
在线时间
1 小时
发表于 2015-12-16 08:05:26 | 显示全部楼层 |阅读模式
5金钱
如题,我的代码如下:


void Uart1_DMAConfig(void)
{
  DMA_InitTypeDef  DMA_InitStructure;
 NVIC_InitTypeDef NVIC_InitStructure;

 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//DMA1?±?????? 
   /*DMA USART1_RXD???????? */
 DMA_InitStructure.DMA_BufferSize = RX_LEN;//?è???????????¤??
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//8?????è?????í??
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//8???????????í??
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//???è???·?????÷??±?
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//???????·????
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//?????????????¨?????????????©
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//?????è????????????????
 
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RxBuffer;//?è??·??????????×???·
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//???è×÷?????????????????·?¨???è->???????©
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA????????
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->RDR) ;//?è???®?????????è?×???·
  DMA_Init(DMA1_Channel3, &DMA_InitStructure);//????????
 
   USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
  DMA_ITConfig(DMA1_Channel3, DMA_IT_TC,ENABLE);//DMA1?¨??3·????ê??????????
 
 NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel2_3_IRQn;//DMA?¨??2,3????????
 NVIC_InitStructure.NVIC_IRQChannelPriority=2;//??????????2
 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//????????
 NVIC_Init(&NVIC_InitStructure);//????????
 
  DMA_ClearFlag(DMA1_FLAG_GL3|DMA1_FLAG_TC3); //?????¨??3?ù??±ê??
 
 //DMA_Cmd(DMA1_Channel2,ENABLE);//DMA1?¨??2????
 //DMA_Cmd(DMA1_Channel3,ENABLE);//DMA1?¨??3????
}

void DMA1_Channel2_3_IRQHandler(void)

 if(DMA_GetITStatus(DMA1_FLAG_TC3))
    {
      DMA_Cmd(DMA1_Channel3,DISABLE);   //??±?DMA2?¨??
      DMA_ClearFlag(DMA1_FLAG_TC3); //????????·????ê??±ê??       
      Flag_Uart1_DMARC=1; 
      DMA_SetCurrDataCounter(DMA1_Channel3, RX_LEN);     
      DMA_Cmd(DMA1_Channel3,ENABLE);   //?ò??DMA2?¨??   
    }
 
}


int main(void)
{
    Sys_Init();
     DMA_Cmd(DMA1_Channel3, ENABLE);
   while (1)
  {
   }
}

每次运行程序第一次能进入DMA接收中断,但下次就进不去了,不知什么原因,难道不能用DMA这种接收方式?
请版主指教一二

谢谢

最佳答案

查看完整内容[请看2#楼]

问题解决了,只要在接收中断中将数据读出就能再进入中断了。不过在实际接收不定长数据中,采用这种接收完成DMA中断和空闲DMA接收中断两种哪个更好呢?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-15
在线时间
1 小时
 楼主| 发表于 2015-12-16 08:05:27 | 显示全部楼层
问题解决了,只要在接收中断中将数据读出就能再进入中断了。不过在实际接收不定长数据中,采用这种接收完成DMA中断和空闲DMA接收中断两种哪个更好呢?
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-12-16 09:21:43 | 显示全部楼层
再DMA加上一句 外设寄存器基地址设置
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-15
在线时间
1 小时
 楼主| 发表于 2015-12-18 08:21:48 | 显示全部楼层
请问"再DMA加上一句 外设寄存器基地址设置"是什么意思,是在接受中断中加入吗?
/*USART1 DMA·???????????*/
void DMA1_Channel2_3_IRQHandler(void)
{
  DMA_InitTypeDef  DMA_InitStructure;
  if(DMA_GetITStatus(DMA1_FLAG_TC3))
    {
      DMA_Cmd(DMA1_Channel3,DISABLE);   //??±?DMA2?¨?? 
DMA_ClearFlag(DMA1_FLAG_TC3); //????????·????ê??±ê??        
      Flag_Uart1_DMARC=1;  
      DMA_SetCurrDataCounter(DMA1_Channel3, RX_LEN);  
      DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->RDR) ;//?è?????????????è?×???·
      DMA_Init(DMA1_Channel3, &DMA_InitStructure);//????????
      DMA_Cmd(DMA1_Channel3,ENABLE);   //?ò??DMA2?¨??
    }

我按上面改了一下,还是只能进入中断一次。
}
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-12-15
在线时间
1 小时
 楼主| 发表于 2015-12-18 08:24:30 | 显示全部楼层
我在网上看到一些例程,大多是采用空闲中断方式接收数据的,即IDLE中断+DMA接收,是不是只能采用这种DMA接收中断方式,请高手明示
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-4-27
在线时间
2 小时
发表于 2016-4-27 17:15:25 | 显示全部楼层
顶起,同样的问题,现在有没有解决呀!
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2016-10-31
在线时间
6 小时
发表于 2016-11-1 16:49:54 | 显示全部楼层
你这个问题其实是先读SR寄存器,再读DR寄存器,才能把空闲中断清除了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 23:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表