OpenEdv-开源电子网

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

谁能帮我看一下程序,串口用DMA接收再DMA发送。 现在只能一次

[复制链接]

145

主题

477

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1264
金钱
1264
注册时间
2012-4-2
在线时间
69 小时
发表于 2012-7-23 22:22:20 | 显示全部楼层 |阅读模式

void MyDMA_Config4(DMA_Channel_TypeDef *DMA_CHx,u32 cmar,u32 cpar,u8 cndtr)   //发送
{
 RCC->AHBENR|=1<<0;
 
 DMA_CHx->CCR&=~(1<<14);
 DMA_CHx->CCR&=~(3<<12); //优先级最低
 DMA_CHx->CCR&=~(3<<10);
 DMA_CHx->CCR&=~(3<<8);
 DMA_CHx->CCR|=1<<7;
 DMA_CHx->CCR&=~(1<<6);
 DMA_CHx->CCR&=~(1<<5); //非循环
// DMA_CHx->CCR|=1<<5;  //循环
 DMA_CHx->CCR|=1<<4;
 
  DMA_CHx->CCR&=~(7<<1);
 DMA_CHx->CCR|=1<<1; // 允许传输完成中断
 MY_NVIC_Init(2,2,DMA1_Channel4_IRQChannel,2);

 length=cndtr;
 DMA_CHx->CNDTR=cndtr;//0;
 DMA_CHx->CMAR=cmar;
 DMA_CHx->CPAR=cpar;

// DMA_CHx->CCR|=1<<0;
}

void MyDMA_Config5(DMA_Channel_TypeDef *DMA_CHx,u32 cpar,u32 cmar,u8 cndtr)  //接收
{
 RCC->AHBENR|=1<<0;
 
 DMA_CHx->CCR&=~(1<<14);
 DMA_CHx->CCR|=3<<12;  //优先级最高
 DMA_CHx->CCR&=~(3<<10);
 DMA_CHx->CCR&=~(3<<8);
 DMA_CHx->CCR|=1<<7;
 DMA_CHx->CCR&=~(1<<6);
 DMA_CHx->CCR&=~(1<<5);  //非循环
// DMA_CHx->CCR|=1<<5;    // 循环
// DMA_CHx->CCR|=1<<4;
 DMA_CHx->CCR&=~(1<<4);

 DMA_CHx->CCR&=~(7<<1);
 DMA_CHx->CCR|=1<<1; // 允许传输完成中断
 MY_NVIC_Init(2,1,DMA1_Channel5_IRQChannel,2);

 DMA_CHx->CNDTR=cndtr;
 DMA_CHx->CMAR=cmar;
 DMA_CHx->CPAR=cpar;

 DMA_CHx->CCR|=1<<0;
}

void DMAChannel5_IRQHandler(void) //接收
{
 DMA_Channel_TypeDef *DMA_CHx;

 DMA_CHx=DMA1_Channel4;
 if(DMA1->ISR&1<<17)
 {
  DMA_CHx->CCR&=~(1<<0);
  DMA_CHx->CNDTR=length;
  DMA_CHx->CCR|=1<<0;
 }
 DMA1->IFCR|=1<<17;   //清除中断标志
}
/**/
void DMAChannel4_IRQHandler(void)  //发送
{
 DMA_Channel_TypeDef *DMA_CHx;
  
 DMA_CHx=DMA1_Channel5;
 if(DMA1->ISR&1<<13)
 {
  
  DMA_CHx->CCR&=~(1<<0);
  DMA_CHx->CNDTR=length;
  DMA_CHx->CCR|=1<<0;
 }
 DMA1->IFCR|=1<<13;   //清除中断标志
}


谁能帮我看一下程序,串口用DMA接收再DMA发送。 现在只能一次

我想要的功能是接收发送循环,用上DMA中断。
过程是这样的:

先接收
完了就中断接受
在中断里给发送置数打开传送
传送完了就中断
中断里给发送置数打开接收

这个过程只能循环一次,之后发送的就不接收了。

USART1_DMA接收发送.rar

651.21 KB, 下载次数: 96

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-7-23 23:44:25 | 显示全部楼层
DMA的重新传输,需要:
DMA_CHx->CCR&=~(1<<0);       //关闭DMA传输 
DMA_CHx->CNDTR=size;   //DMA,传输数据量 
DMA_CHx->CCR|=1<<0;            //开启DMA传输
每次都要这么设置.你的设置了么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

145

主题

477

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1264
金钱
1264
注册时间
2012-4-2
在线时间
69 小时
 楼主| 发表于 2012-7-24 00:18:06 | 显示全部楼层
我在中断里面已经有这个动作了,
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 23:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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