OpenEdv-开源电子网

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

关于DMA连续发送字符串的几个问题

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2015-4-9
在线时间
0 小时
发表于 2015-4-9 18:11:42 | 显示全部楼层 |阅读模式
5金钱
我参照DMA未知长度数据接收和发送的程序写了DMA的程序,可以实现单次的接受发送,但是遇到了几个问题,新手不会解决,特来求问~

1.如何实现连续的DMA发送呢?运用这个中断函数,可以在中断中判断接收到的字符串。如果我想在判断接收到的字符串满足某个要求后,触发一连串的循环的DMA发送,该怎么实现?比如我从CAN总线一直有数据传过来,这边在DMA怎么连续地发送出去?

2.我想利用memcmp函数判断字符串是否满足要求,用if语句判断:if(memcmp(ReceiveBuff,collect,1)==0)
但是在这个中断里接收字符串总是与实际不同,不知道是什么原因,如果我将ReceiveBuff赋给SendBuff,send出去的字符串又是相同的,是因为在中断过程中字符串的接收还没有完成?

下面附上中断函数的代码
[mw_shl_code=c,true]void USART2_IRQHandler(void) { u16 DATA_LEN; u16 i; // printf("1\r\n"); if(USART_GetITStatus(USART2, USART_IT_IDLE) == RESET)//!=change to == { DMA_Cmd(DMA1_Channel6, DISABLE);//??±?DMA,·??????í?????????? //USART_RX_STA = USART2->SR;//????SR?????ó??DR???????? //USART_RX_STA = USART2->DR; DATA_LEN=512-DMA_GetCurrDataCounter(DMA1_Channel6); // printf("2\r\n"); if(DATA_LEN > 0) { while(USART2_TX_Finish==0) { ; } //????????DMA???????· //-----------------------------------------------------------------      if(memcmp(ReceiveBuff,collect,1)==0) strcpy(SendBuff,get); else strcpy(SendBuff,ReceiveBuff); // if(memcmp(ReceiveBuff,collect,strlen(collect))==0) // strcpy(SendBuff,get); // else // strcpy(SendBuff,ReceiveBuff); //----------------------------------------------------------------- //USART??DMA???????ú?é??·???·???????·?±????????????????ú?ú???????ó?? DMA_Cmd(DMA1_Channel7, DISABLE); //??±?datasize?°?????????¨???¤×÷ DMA1_Channel7->CNDTR=DATA_LEN; //DMA1,?????????? USART2_TX_Finish=0;//DMA????????±ê???? DMA_Cmd(DMA1_Channel7, ENABLE); //·??? } //DMA_Cmd(DMA1_Channel5, DISABLE);//??±?DMA,·??????í?????????? DMA_ClearFlag(DMA1_FLAG_GL6 | DMA1_FLAG_TC6 | DMA1_FLAG_TE6 | DMA1_FLAG_HT6);//??±ê?? DMA1_Channel6->CNDTR = 512;//??×°?? DMA_Cmd(DMA1_Channel6, ENABLE);//???í?ê,????DMA //??SR?ó??DR????Idle i = USART2->SR; i = USART2->DR; } if(USART_GetITStatus(USART2, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)//???í { USART_ClearITPendingBit(USART2, USART_IT_PE | USART_IT_FE | USART_IT_NE); } USART_ClearITPendingBit(USART2, USART_IT_TC); USART_ClearITPendingBit(USART2, USART_IT_IDLE); // Delay(10000); // printf("%s\r\n",SendBuff); // Delay(10000); }[/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11557
金钱
11557
注册时间
2014-4-1
在线时间
1318 小时
发表于 2015-4-9 21:16:43 | 显示全部楼层
最近一周,也一直在折腾DMA,无果,郁闷啊。
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2015-4-9
在线时间
0 小时
 楼主| 发表于 2015-4-9 21:19:45 | 显示全部楼层
回复【2楼】xuande:
---------------------------------
TAT坐等大神啊……
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2015-4-9
在线时间
0 小时
 楼主| 发表于 2015-4-11 10:09:30 | 显示全部楼层
顶顶更健康……
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 20:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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