OpenEdv-开源电子网

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

求STM32串口DMA方式接收数据的例程

[复制链接]

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-3-13
在线时间
3 小时
发表于 2012-8-30 14:30:16 | 显示全部楼层 |阅读模式

哪位大侠有串口DMA接收的例程共享一下。
最好是寄存器编程的,呵呵。因为整个工程都是寄存器编程的,用着比较方便。
另外,我自己用串口dma发送数据的例程改了一下,但是收不到数据,代码如下,哪位大侠给指点指点:

u8 DmaTest[30];
volatile bool FlagofDmaTest;

void DMA1_Channel6_IRQHandler(void)
{
 FlagofDmaTest = TRUE;
}

void MYDMA1CH6_Config(u32 cpar)
{
 u32 DR_Base;    //做缓冲用,不知道为什么.非要不可
 RCC->AHBENR|=1<<0; //开启DMA1时钟
 DR_Base=cpar;
 //DMA1_Channel6->CPAR=DR_Base;    //DMA1 外设地址
 DMA1_Channel6->CPAR=(u32)&USART2->DR;    //DMA1 外设地址
 DMA1_Channel6->CCR=0X00000000; //复位
 DMA1_Channel6->CCR &= ~(1<<4);   //从外设读
 DMA1_Channel6->CCR &= ~(1<<5);   //普通模式,不执行循环操作
 DMA1_Channel6->CCR &= ~(1<<6);   //外设地址非增量模式
 DMA1_Channel6->CCR |= 1<<7;        //存储器增量模式
 DMA1_Channel6->CCR &= ~(3<<8);   //外设数据宽度为8位
 DMA1_Channel6->CCR &= ~(3<<10);  //存储器数据宽度8位
 DMA1_Channel6->CCR |= 1<<12;       //中等优先级
 DMA1_Channel6->CCR &= ~(1<<14);  //非存储器到存储器模式
 
 //传输完成中断
 DMA1_Channel6->CCR |= 1<<1;                         //允许传输完成中断
 MY_NVIC_Init(2,2,DMA1_Channel6_IRQChannel,2);//组2,最低优先级
}

//开启一次DMA传输
void MYDMA1CH6_Enable(u32 cmar,u16 cndtr)
{
 DMA1_Channel6->CCR &= ~(1<<0);                 //关闭DMA传输
 DMA1_Channel6->CPAR=(u32)&USART2->DR;    //外设地址
 DMA1_Channel6->CMAR=(u32)cmar;                 //存储器地址
 DMA1_MEM_LEN6=cndtr;
 DMA1_Channel6->CNDTR=DMA1_MEM_LEN6;     //DMA1,传输数据量
 DMA1_Channel6->CCR|=1<<0;                         //开启DMA传输
}  

int main(int argc,char** argv)
{
  Stm32_Clock_Init(9);  //frequent init:72M
 delay_init(72);    //delay init


 uart2_init(36,19200,8,1,'N',200);
 MYDMA1CH6_Config((u32)&USART2->DR);
 //MYDMA1CH6_Enable((u32)DmaTest,10);

 FlagofDmaTest = FALSE;
 while(1)
 {
  FlagofDmaTest = FALSE;
  uart2_send("Hi,yumei test\r\n",15);
  MYDMA1CH6_Enable((u32)DmaTest,10);
  while(FlagofDmaTest == FALSE);
   }
}
哪位大侠给指点一下吧,可以肯定的是串口dma方式发送及串口中断方式接收肯定没问题,但是作如上设置后,dma的存储缓冲区内始终为空,收不到任何字符。
调试好几天了,谢谢各位了。

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-30 15:40:06 | 显示全部楼层
串口1的RX是有DMA的CH5控制的,你使劲在配置CH6,能用才怪。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-3-13
在线时间
3 小时
 楼主| 发表于 2012-8-30 17:15:17 | 显示全部楼层
不好意思,我忘了说了
我用的是串口2,:)
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-30 17:50:12 | 显示全部楼层
void MYDMA1CH6_Config(u32 cpar)
{
 u32 DR_Base;    //做缓冲用,不知道为什么.非要不可
 RCC->AHBENR|=1<<0; //开启DMA1时钟
delay_ms(2);//加延时试试。
 DR_Base=cpar;
 //DMA1_Channel6->CPAR=DR_Base;    //DMA1 外设地址 
 DMA1_Channel6->CPAR=(u32)&USART2->DR;    //DMA1 外设地址 
 DMA1_Channel6->CCR=0X00000000; //复位
 DMA1_Channel6->CCR &= ~(1<<4);   //从外设读
 DMA1_Channel6->CCR &= ~(1<<5);   //普通模式,不执行循环操作
 DMA1_Channel6->CCR &= ~(1<<6);   //外设地址非增量模式
 DMA1_Channel6->CCR |= 1<<7;        //存储器增量模式
 DMA1_Channel6->CCR &= ~(3<<8);   //外设数据宽度为8位
 DMA1_Channel6->CCR &= ~(3<<10);  //存储器数据宽度8位
 DMA1_Channel6->CCR |= 1<<12;       //中等优先级
 DMA1_Channel6->CCR &= ~(1<<14);  //非存储器到存储器模式
 
 //传输完成中断
 DMA1_Channel6->CCR |= 1<<1;                         //允许传输完成中断
 MY_NVIC_Init(2,2,DMA1_Channel6_IRQChannel,2);//组2,最低优先级 

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-3-13
在线时间
3 小时
 楼主| 发表于 2012-8-31 10:39:03 | 显示全部楼层
谢谢原子哥!
加延时试过了,还是收不到东西。
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-3-13
在线时间
3 小时
 楼主| 发表于 2012-8-31 14:30:43 | 显示全部楼层
串口用DMA方式接收应该有调通的大侠吧,给点建议呗!
实在是没办法了,呵呵!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-31 14:34:08 | 显示全部楼层
回复【5楼】rainy0415:
---------------------------------
其他好像也没问题,呵呵。你再琢磨下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-3-13
在线时间
3 小时
 楼主| 发表于 2012-9-1 10:15:25 | 显示全部楼层
问题找到了!
不好意思,DMA的设置没有问题,是我没把USART2的DMA使能接收位打开!太大意了!
贴出来提醒一下大家!
回复 支持 反对

使用道具 举报

12

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2014-4-11
在线时间
0 小时
发表于 2014-8-22 01:00:14 | 显示全部楼层
回复【8楼】rainy0415:
---------------------------------
根本进不了中断
成功
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2015-6-2
在线时间
0 小时
发表于 2015-6-2 14:40:02 | 显示全部楼层
可以看一下你的串口程序吗?
回复 支持 反对

使用道具 举报

19

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
229
金钱
229
注册时间
2014-1-11
在线时间
0 小时
发表于 2015-7-2 15:17:30 | 显示全部楼层
回复【8楼】rainy0415:
---------------------------------
您好~串口DMA接收的程序能分享一下吗
战舰因我而精彩
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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