OpenEdv-开源电子网

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

串口DMA!

[复制链接]

4

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2013-4-9
在线时间
0 小时
发表于 2013-9-11 17:05:59 | 显示全部楼层 |阅读模式
在串口中断中打开同一个串口DMA接收,关闭中断接收,然后DMA接收到的一串数据的第一个字节总是中断接收的最后一个数据,谁给解释下啊?比如串口中断接收接收的最后一个字节为0XAB,关闭中断后,通过DMA给串口发送的数据为0x01、0x02、0x03、0x04,但是DMA接收buffer里面的数据是 0xAB、0x01、0x02、0x03.不知道大家庭没听明白
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-11 22:28:26 | 显示全部楼层
你 的串口中断代码是如何的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

248

帖子

2

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2012-2-8
在线时间
19 小时
发表于 2013-9-11 22:42:09 | 显示全部楼层
回复【楼主位】secondshot:
---------------------------------
你在中断里开DMA?开DMA时读走中断收到的那个字节么?不读走,DR里面的数据还在,开DMA应该会把那字节搬走吧
回复 支持 反对

使用道具 举报

4

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2013-4-9
在线时间
0 小时
 楼主| 发表于 2013-9-12 13:13:15 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
void USART1_IRQHandler(void)
{
   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
   {
uint8_t Flagtp=0;
   ReceiveCommand=USART_ReceiveData(USART1);
                if(ReceiveCommand==CONFIGCOMMAND)
{
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
Usart1_dma_rev(&Usart1_Rev_Array[0],0x0d); 
DAConfigFlag=0;
ADConfigFlag=0;
ReturnData=GetReturnState();
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE ) == RESET );
USART_SendData(USART1,ReturnData);

         } 
}
回复 支持 反对

使用道具 举报

4

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2013-4-9
在线时间
0 小时
 楼主| 发表于 2013-9-12 13:16:00 | 显示全部楼层
回复【3楼】寒寒:
---------------------------------
对中断里面打开DMA ,应该读走了,我是判断接收的字节是开启DMA的指令,然后才根据这个指令开启DMA,代码已发,可以看看,进中断首先读的就是DR
回复 支持 反对

使用道具 举报

4

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2013-4-9
在线时间
0 小时
 楼主| 发表于 2013-9-12 13:22:54 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
代码分支比较多 截图不方便 这是响应指令CONFIGCOMMAND时的代码,粘贴的时候是对齐的,粘上去就乱了,不方便看,不好意思
现象就是比如我接收到一个字节,判断是CONFIGCOMMAND,就会关闭中断,打开DMA接收,同时返回一个状态指示字节。DMA接收完成中断,读DMA接收buffer里面的第一个字节是CONFIGCOMMAND并不是一串数据的开头第一个字节
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-12 14:50:19 | 显示全部楼层
回复【6楼】secondshot:
---------------------------------
有没有先清除串口接收标志?看看是不是这里的问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2013-4-9
在线时间
0 小时
 楼主| 发表于 2013-9-12 15:50:36 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
读DR就是清除接收标志
回复 支持 反对

使用道具 举报

4

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2013-4-9
在线时间
0 小时
 楼主| 发表于 2013-9-12 15:50:59 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------我也试过了 清除 也不好使
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-12 17:29:02 | 显示全部楼层
回复【9楼】secondshot:
---------------------------------
哦哦,那就不知道怎么回事了。
你直接开启DMA,不用中断接收呢?是否可以正常接收?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

248

帖子

2

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2012-2-8
在线时间
19 小时
发表于 2013-9-12 21:48:37 | 显示全部楼层
回复【5楼】secondshot:

回复【3楼】寒寒:
---------------------------------
对中断里面打开DMA ,应该读走了,我是判断接收的字节是开启DMA的指令,然后才根据这个指令开启DMA,代码已发,可以看看,进中断首先读的就是DR

---------------------------------
你为啥不直接开DMA呢,把开DMA指令设置为串口的唤醒地址呢
回复 支持 反对

使用道具 举报

4

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2013-4-9
在线时间
0 小时
 楼主| 发表于 2013-9-13 08:53:57 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
没试,这个是串口1。不过串口3做的是DMA接收GPS信息,挺正常的
回复 支持 反对

使用道具 举报

4

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2013-4-9
在线时间
0 小时
 楼主| 发表于 2013-9-13 08:57:45 | 显示全部楼层
回复【11楼】寒寒:

回复【5楼】secondshot:
回复【3楼】寒寒:
---------------------------------
对中断里面打开DMA ,应该读走了,我是判断接收的字节是开启DMA的指令,然后才根据这个指令开启DMA,代码已发,可以看看,进中断首先读的就是DR

---------------------------------
你为啥不直接开DMA呢,把开DMA指令设置为串口的唤醒地址呢

---------------------------------
没明白你的意思。什么叫“把开DMA指令设置为串口的唤醒地址呢”?
我现在的流程是,接收到一个字节,对这个字节判断,如果是0x06(随便举例),我就关闭中断接收,开启DMA接收
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-13 08:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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