OpenEdv-开源电子网

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

串口DMA普通模式接收只能进一次中断问题

[复制链接]

1

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-11-26
在线时间
0 小时
发表于 2013-11-26 00:14:40 | 显示全部楼层 |阅读模式
由于需要把接收到的数据进行处理 所以dma使用了normal模式,但是问题是只能进一次dma完成中断,之后就不会进了。不管怎么改都不行。不知道是什么原因,请各位大神帮忙看看,提供下思路。谢谢!

void DMA1_Channel6_IRQHandler(void)
{
uint16_t i,j;
uint8_t sum;
   if(DMA_GetFlagStatus(DMA1_FLAG_TC6)==SET) 
  {  
for(i=0;i<(READBUFF_SIZE-11);i++)
{
if(ReadBuffer==0x55&&ReadBuffer[i+1]==0x53)
{
for(j=0;j<10;j++)
{
sum=ReadBuffer[i+j];
// printf("%X ",ReadBuffer[i+j]);
}
// printf("%X ",ReadBuffer[i+j+1]);
// printf("%d\n",sum);
if(ReadBuffer[i+10]==sum)
{
Roll=((ReadBuffer[i+3]<<8)|ReadBuffer[i+2])/32768*180;
Pitch=((ReadBuffer[i+5]<<8)|ReadBuffer[i+4])/32768*180;
Yaw=((ReadBuffer[i+7]<<8)|ReadBuffer[i+6])/32768*180;
printf("Roll=%4.3f,Pitch=%4.3f,Yaw=%4.3f\n",Roll,Pitch,Yaw);
break;
}
}
}
DMA_Cmd(DMA1_Channel6,DISABLE);
DMA1_Channel6->CMAR=(u32)ReadBuffer;
DMA1_Channel6->CNDTR=READBUFF_SIZE;
USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE);
DMA_Cmd(DMA1_Channel6,ENABLE);
DMA_ClearFlag(DMA1_FLAG_GL6);
}
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-11-26 10:16:33 | 显示全部楼层
normal模式需要重启DMA

DMA_Cmd(DMA1_Channel6,DISABLE);
重新设置源地址
重新设置目的地址
重设传输数量
DMA_Cmd(DMA1_Channel6,ENABLE);

另外DMA_ClearFlag(DMA1_FLAG_GL6);这句应该在DMA启动前完成。
回复 支持 反对

使用道具 举报

1

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-11-26
在线时间
0 小时
 楼主| 发表于 2013-11-26 13:07:10 | 显示全部楼层
回复【2楼】ricefat:
---------------------------------
谢谢你的回复,我把清标志位放到DMA启动前也不行,还有别的原因吗?
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-11-19
在线时间
3 小时
发表于 2013-11-26 16:20:00 | 显示全部楼层
回复【3楼】似懂非懂:
---------------------------------
你有没有确定你进去中断后,你的DMA有没有再次跑起来了呢?
回复 支持 反对

使用道具 举报

1

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-11-26
在线时间
0 小时
 楼主| 发表于 2013-11-26 17:17:07 | 显示全部楼层
回复【4楼】543049411:
---------------------------------
谢谢你的回复!我可以确定进中断之后出了中断就没有再进去过,DMA有没有跑起来不清楚怎么看。
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-11-26 17:42:36 | 显示全部楼层
屏蔽掉printf语句试试看,换成LED亮灭
回复 支持 反对

使用道具 举报

1

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-11-26
在线时间
0 小时
 楼主| 发表于 2013-11-26 18:46:31 | 显示全部楼层
回复【6楼】ricefat:
---------------------------------
太感谢了,去掉printf语句就可以了!请问下这是什么原因呢?是因为printf占有时间太长导致dma传输完成了还没有出中断吗?用循环模式好像不会有这个问题。
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-11-26 18:56:49 | 显示全部楼层
回复【7楼】似懂非懂:
---------------------------------
好像DMA1_Channel6是USART2的?printf定向到usart1还是2?
回复 支持 反对

使用道具 举报

1

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-11-26
在线时间
0 小时
 楼主| 发表于 2013-11-26 19:08:01 | 显示全部楼层
回复【8楼】ricefat:
---------------------------------
DMA1_Channel6这个是uasrt2的,printf是定向到usart1的。我刚才想是因为printf占用时间太长了导致出中断前第二次中断丢失了,但是又想了想即便是这样也没有问题。因为后来又重新开启了dma并清除了中断标志位。奇怪的是用循环模式能正常进中断并用printf输出。具体原因还望指教。谢谢!
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-11-26 19:16:16 | 显示全部楼层
回复【9楼】似懂非懂:
---------------------------------
试试看单步调试吧
回复 支持 反对

使用道具 举报

1

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-11-26
在线时间
0 小时
 楼主| 发表于 2013-11-26 19:21:37 | 显示全部楼层
回复【10楼】ricefat:
---------------------------------
还有一个奇怪的问题,现在DMA是正常的,但是我在中断里设个断点中断之后再全速运行就不能再次进入中断了,我想这应该是DMA的某种机制导致,但是不清楚这是什么机制。
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-11-26 22:04:27 | 显示全部楼层
回复【11楼】似懂非懂:
---------------------------------
DMA传输过程不受调试影像,一旦启动DMA,即使是调试,DMA传输过程也不会中断
回复 支持 反对

使用道具 举报

1

主题

17

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-11-26
在线时间
0 小时
 楼主| 发表于 2013-11-27 00:19:37 | 显示全部楼层
回复【12楼】ricefat:
---------------------------------
现在的情况是开了dma之后调试,在中断中设置断点后重新启动就不能重新进入中断,不知道什么情况。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-8 12:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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