OpenEdv-开源电子网

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

关于dma接收的问题

[复制链接]

5

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2014-10-21
在线时间
31 小时
发表于 2014-11-16 18:16:31 | 显示全部楼层 |阅读模式
5金钱
程序为pc机发送字符串到串口,由dma接收,且一直等待接收100%,接收完成后,再发送回pc机上
现在有如下问题:
当程序执行到MY_DMA_CONFIG(DMA1_Channel5,(u32)&USART1->DR,(u32)Receive_Buff,10);也就是配置完之后,而串口1的dma并没有使能接收,奇怪的是此时如果pc机通过串口发送数据,比如“1”,然后在按键按下之后,执行到MYDMA_Enable(DMA1_Channel5);//开始进行一次传输;却发现Receive_Buff[]里第一个数据为“1”了,应该并没有使能才对啊,为什么在使能之前发送的数据会传到Receive_Buff[]中呢,而且只有“1”传到Receive_Buff[]里了,回车的0x0d和0x0a却没传进去


后来发现在USART_Cmd(USART1, ENABLE);这句话之后,好像就给串口1留了一个位置,不管串口1的dma是否使能接收,都能收到第一个数,而且第一个数不能被覆盖,不知道有没有人和我遇到一样的问题,求解,下面附上程序



最佳答案

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

回复【4楼】正点原子: --------------------------------- 谢原子哥帮顶啊,主要是我的问题说的不是很清楚。。我想我找到原因了,是因为之前使能了串口,因此串口的BUF能收到数据,而且只能放一个,由于没有使能DMA,所以数据没有被移走,一直在BUF中,直到DMA使能后,数据被DMA移到了RECEIVE_BUF,而后,传到串口BUF的数据便能被DMA搬到RECEIVE_BUF中了,总的来说,DMA只是一个搬运工 请问原子哥,串口的接收BUF是不是不能被覆盖 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2014-10-21
在线时间
31 小时
 楼主| 发表于 2014-11-16 18:16:32 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
谢原子哥帮顶啊,主要是我的问题说的不是很清楚。。我想我找到原因了,是因为之前使能了串口,因此串口的BUF能收到数据,而且只能放一个,由于没有使能DMA,所以数据没有被移走,一直在BUF中,直到DMA使能后,数据被DMA移到了RECEIVE_BUF,而后,传到串口BUF的数据便能被DMA搬到RECEIVE_BUF中了,总的来说,DMA只是一个搬运工

请问原子哥,串口的接收BUF是不是不能被覆盖的?
回复

使用道具 举报

5

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2014-10-21
在线时间
31 小时
 楼主| 发表于 2014-11-16 18:18:11 | 显示全部楼层
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"  
#include "dma.h"
//ALIENTEK????STM32??·?°????é21
//DMA ???é  
//?????§????www.openedv.com
//?????????í??×?????????????
u8 Receive_Buff[20];

void usart_init(void)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
USART_DeInit(USART1);  //????????1
//USART1_TX
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    //USART1_RX
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    USART_Init(USART1, &USART_InitStructure);
     
    USART_Cmd(USART1, ENABLE);
}

 int main(void)
 {  
u16 i;
u8 t=0;
float pro=0;//????

delay_init();       //???±??????????   
NVIC_Configuration();   //?è??NVIC????·?×é2:2??????????????2???ì????????
//uart_init(9600);   //????????????9600
usart_init();//??????????
  LED_Init();      //LED??????????
LCD_Init();    //??????LCD
  KEY_Init(); //°??ü??????

MY_DMA_CONFIG(DMA1_Channel5,(u32)&USART1->DR,(u32)Receive_Buff,10);//DMA1?¨??5,???è??????1,?????÷??Receive_Buff,?¤??88.     

  POINT_COLOR=RED;//?è??×??????ì?? 
LCD_ShowString(60,50,200,16,16,"WarShip STM32");
LCD_ShowString(60,70,200,16,16,"DMA TEST");
LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(60,110,200,16,16,"2012/9/8");
  LCD_ShowString(60,130,200,16,16,"KEY0:Start");
//USART_Cmd(USART1, DISABLE);//?ó??????????????USART????°??ü°??????ó????????????????????
while(1)
{
t=KEY_Scan(0);
if(t==KEY_RIGHT)//KEY0°???
{
LCD_ShowString(60,150,200,16,16,"Start Transimit....");
LCD_ShowString(60,170,200,16,16,"   %");//????°?·???
USART_Cmd(USART1, ENABLE);
printf("\r\nDMA DATA:\r\n"); 
// MY_DMA_CONFIG(DMA1_Channel5,(u32)&USART1->DR,(u32)Receive_Buff,10);//DMA1?¨??5,???è??????1,?????÷??Receive_Buff,?¤??88.
USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); //????????1??DMA???? 
MYDMA_Enable(DMA1_Channel5);//????????DMA??????   
    //????DMA?????ê???????±??????×??í??????????????
    //???????????????????????????????????í????????
    while(1)
    {
if(DMA_GetFlagStatus(DMA1_FLAG_TC5)!=RESET) //?????¨??5?????ê??
{
DMA_ClearFlag(DMA1_FLAG_TC5);//?????¨??5?????ê??±ê??
printf("%s",Receive_Buff);
printf("end");
break; 
}
pro=DMA_GetCurrDataCounter(DMA1_Channel5);//?????±?°?????à?à????????
pro=1-pro/10;//????°?·?±?   
pro*=100;      //???ó100±?
LCD_ShowNum(60,170,pro,3,16);   
    }     
LCD_ShowNum(60,170,100,3,16);//????100%   
LCD_ShowString(60,150,200,16,16,"Transimit Finished!");//?á???????ê??
}
i++;
delay_ms(10);
if(i==20)
{
LED0=!LED0;//?á??????????????
i=0;
}    
}
}
这。。不知道怎么复制。。中文注释都成乱码了,请大家勉强看下吧
回复

使用道具 举报

5

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2014-10-21
在线时间
31 小时
 楼主| 发表于 2014-11-16 18:19:16 | 显示全部楼层
//????????DMA????
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)

DMA_Cmd(DMA_CHx, DISABLE );  //??±?USART1 TX DMA1 ?ù???????¨??      
  DMA_SetCurrDataCounter(DMA1_Channel4,DMA1_MEM_LEN);//DMA?¨????DMA???????ó??
  DMA_Cmd(DMA_CHx, ENABLE);  //????USART1 TX DMA1 ?ù???????¨?? 
}   

 
/********    test    ***********/
void MY_DMA_CONFIG(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //????DMA????

  DMA_DeInit(DMA_CHx);   //??DMA???¨??1?????÷???è???±????
DMA1_MEM_LEN=cndtr;//cndtr±í?????????????¤??
DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMA???èADC?ù???·
DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA?????ù???·
// DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  //????????·??ò????????????·????????è
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//????????·??ò???????è????·????????? 
DMA_InitStructure.DMA_BufferSize = cndtr;  //DMA?¨????DMA???????ó??
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //???è???·?????÷??±?
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //???????·?????÷????
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //?????í????8??
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //?????í????8??
//DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //?¤×÷??????????????
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//?????????¤×÷?????·????
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA?¨?? x???????????? 
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA?¨??x?????è??????????????????
DMA_Init(DMA_CHx, &DMA_InitStructure);  //?ù??DMA_InitStruct?????¨????????????DMA???¨??USART1_Tx_DMA_Channel?ù±ê?????????÷
  
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-16 19:43:51 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2014-10-21
在线时间
31 小时
 楼主| 发表于 2014-11-16 21:36:14 | 显示全部楼层
回复【5楼】你干嘛:
---------------------------------
啊啊啊啊啊,凌乱了,好像是可以覆盖的,,但是刚才仿真的时候,并没有覆盖啊。。现在现场已经被我改了,找不到原因了。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-16 22:09:49 | 显示全部楼层
回复【5楼】你干嘛:
---------------------------------
当然可以被覆盖了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2014-10-21
在线时间
49 小时
发表于 2014-12-3 15:31:50 | 显示全部楼层
回复【2楼】你干嘛:
---------------------------------
先在edit->configuration,在editor中的Encoding选项中选择Chinese GB2312,就不会出现乱码了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-4 00:23:21 | 显示全部楼层
回复【5楼】你干嘛:
---------------------------------
可以啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 09:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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