OpenEdv-开源电子网

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

USART2的DMA接收 外设到内存

[复制链接]

27

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2018-7-20
在线时间
117 小时
发表于 2018-8-16 15:18:15 | 显示全部楼层 |阅读模式
5金钱
楼主做的是F103的外设到内存的DMA接收,但是现在每次只能接收一位,然后程序就不再接收数据了,DMA配置应该没问题,USART中断函数没写,主函数代码如下:
int main(void)
{
        u8 t=0;
        u16 i;
  RS485_2();   //USART标准初始化   注意 波特率为9600
MYDMA_Config(DMA1_Channel6,(u32)&USART2->DR,(u32)Send_Data,10);//DMA1通道7,外设为串口2,存储器为SendBuff,长(TEXT_LENTH+2)*100.
RS485_TX_EN=0;//置0 接收       
delay_ms(1);
        USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);
        DMA_Cmd(DMA1_Channel6, ENABLE);      //启动DMA通道
while(1)
{
if(DMA_GetFlagStatus(DMA1_FLAG_TC6)!=RESET)//等待通道6传输完成
                                {
                                        DMA_ClearFlag(DMA1_FLAG_TC6);//清除通道6传输完成标志
                                       
                                        break;
                        }

}
while(1);


为什么每次只能接收一位啊,数据的DMA使能接收应该写在USART2的接收中断函数里面吗,求助

最佳答案

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

已解决,函数都没有错,我在while(1)函数后面加了一些算法使CPU一直执行,就解决这个问题了
我只喜欢喜欢我的人
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2018-7-20
在线时间
117 小时
 楼主| 发表于 2018-8-16 15:18:16 | 显示全部楼层
1208 发表于 2018-8-17 11:49
明白,楼主问题解决了吗

已解决,函数都没有错,我在while(1)函数后面加了一些算法使CPU一直执行,就解决这个问题了
我只喜欢喜欢我的人
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2018-8-16 15:53:29 | 显示全部楼层
http://www.openedv.com/forum.php?mod=viewthread&tid=109577,可以移植到串口2试试。数据的DMA使能接收不用写在接收中断函数中
回复

使用道具 举报

27

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2018-7-20
在线时间
117 小时
 楼主| 发表于 2018-8-16 17:49:30 | 显示全部楼层
peng1554 发表于 2018-8-16 15:53
http://www.openedv.com/forum.php?mod=viewthread&tid=109577,可以移植到串口2试试。数据的DMA使能接收不 ...

谢谢回帖,我仔细的改了一下程序,但还是不行,用的就是串口2,都是按照相关配置写的,DMA数据能收到一个字节,后面的就收不到了,能收到数据说明DMA相关配置应该没有问题,是标志位没有清还是其它哪里没有注意到
我只喜欢喜欢我的人
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-8-16 20:03:12 | 显示全部楼层
本帖最后由 1208 于 2018-8-16 20:21 编辑

为什么加两个while(1)少了对数据的填充处理
j=sizeof(TEXT_TO_SEND);   
for(i=0;i<SEND_BUF_SIZE;i++)//填充数据到SendBuff
    {
  if(t>=j)//加入换行符
  {
   if(mask)
   {
    SendBuff=0x0a;
    t=0;
   }else
   {
    SendBuff=0x0d;
    mask++;
   }
  }else//复制TEXT_TO_SEND语句
  {
   mask=0;
   SendBuff=TEXT_TO_SEND[t];
   t++;
  }        
    }

业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

2

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2017-8-20
在线时间
49 小时
发表于 2018-8-16 20:42:24 | 显示全部楼层
本帖最后由 中技电子实验室 于 2018-8-16 20:50 编辑

你这测试程序写得那么古怪,既然能接收了,就当OK,最后一个while(1);不能加,你没用中断,就会停在那,另DMA传输要重新新设置缓冲大小,
     DMA_Cmd(DMA1_Channel6, DISABLE);       /* 失能 DMA_USART1 */
     **********
     DMA_SetCurrDataCounter(DMA1_Channel6,10);//从新设置缓冲大小,连续接收10个字节
     DMA_Cmd(DMA1_Channel6, ENABLE);         /* 重新使能 DMA_USART1 */·
回复

使用道具 举报

27

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2018-7-20
在线时间
117 小时
 楼主| 发表于 2018-8-17 10:02:48 | 显示全部楼层
中技电子实验室 发表于 2018-8-16 20:42
你这测试程序写得那么古怪,既然能接收了,就当OK,最后一个while(1);不能加,你没用中断,就会停在那,另DM ...

我用了DMA接收中断
void DMA1_Channel6_IRQHandler(void)
{
       
    if(DMA_GetITStatus(DMA1_IT_TC6)!= RESET)//DMA接收完成标志
        {
                DMA_Cmd(DMA1_Channel6, DISABLE );   //关闭USART1 TX DMA1 所指示的通道  
         DMA1_Channel6->CMAR=(u32)Send_Data;
        }

                DMA_SetCurrDataCounter(DMA1_Channel6,USART2_RXBUF_SIZE);//DMA通道的DMA缓存的大小
        DMA_Cmd(DMA1_Channel6, ENABLE);     //使能USART1 TX DMA1 所指示的通道        
        DMA_ClearITPendingBit(DMA1_IT_TC6); //清除中断标志  

}

那个while(1)不影响中断的啊,除非是中断出了问题

    //DMA1通道5 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel6_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
    DMA_ITConfig(DMA1_Channel6,DMA_IT_TC,ENABLE);   //使能DMA1通道5的传输完成中断

    DMA_Cmd(DMA_CHx, ENABLE);  //使能USART1 RX DMA1 所指示的通道
我只喜欢喜欢我的人
回复

使用道具 举报

27

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2018-7-20
在线时间
117 小时
 楼主| 发表于 2018-8-17 10:06:25 | 显示全部楼层
1208 发表于 2018-8-16 20:03
为什么加两个while(1)少了对数据的填充处理
j=sizeof(TEXT_TO_SEND);   
for(i=0;i=j)//加入换行符
...

第一个while是保证数据传输结束,则退出while循环
第二个while是为了程序一直执行,有相关的中断服务函数
楼主的程序是DMA接收,从外设到存储器的DMA
我只喜欢喜欢我的人
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-8-17 10:15:50 | 显示全部楼层
本帖最后由 1208 于 2018-8-17 10:17 编辑

为什么从外设到内存就不需要数据填充,
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

27

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2018-7-20
在线时间
117 小时
 楼主| 发表于 2018-8-17 10:42:48 | 显示全部楼层
1208 发表于 2018-8-17 10:15
为什么从外设到内存就不需要数据填充,

已经建立了一个数组,不是等待数据接收,放在数组里面吗,
填充数据不是很明白
我只喜欢喜欢我的人
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-8-17 11:49:48 | 显示全部楼层
明白,楼主问题解决了吗
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 15:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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