野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15482|回复: 3

通过DMA将串口2数据传到内存,并打印出来的配置

[复制链接]
发表于 2015-4-28 09:22:30 | 显示全部楼层 |阅读模式
通过DMA将串口2数据传到内存,并打印出来。我在main函数里动态分配1024byte空间,希望把串口2的数据存到该内存中,实在网页抓取例程基础上改的,一直没有成功,将DMA缓存改为512以下,可以接受一部分数据,高于这个值,就死机。不知为什么?具体该怎么配置?主要代码如下
////************************串口二传送到内存的DMA配置************************************************///
void USART2_DMA_Config(u32 *RxBuff)
{
     
  DMA_InitTypeDef DMA_InitStructure;

  /*开启DMA时钟*/
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

  /*设置DMA源:串口数据寄存器地址*/
  DMA_InitStructure.DMA_PeripheralBaseAddr = ( u32 ) ( & ( USART2->DR ) );   
  /*内存地址(要传输的变量的指针)*/
   DMA_InitStructure.DMA_MemoryBaseAddr =(u32)RxBuff;
  /*方向:从外设到内存*/  
   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  /*传输大小DMA_BufferSize=SENDBUFF_SIZE*/
      DMA_InitStructure.DMA_BufferSize =512;
  /*外设地址不增*/     
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  /*内存地址自增*/
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  /*外设数据单位*/
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  /*内存数据单位 8bit*/
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  /*DMA模式:不断循环*/
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;//正常缓存模式
  /*优先级:中*/
  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  
  /*禁止内存到内存的传输 */
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  /*配置DMA1的6通道*/        
        DMA_Init(DMA1_Channel6, &DMA_InitStructure);
}

int main(void)
{
u8 t,*print;
u32 *RxBuff=NULL;

RxBuff=(u32 *)malloc(1024*sizeof(char));  
/* 初始化 */
WiFi_RST_INIT();
    WiFi_USART1_INIT();
WiFi_USART2_INIT();
USART2_DMA_Config(RxBuff);
WiFi_NVIC_INIT();                                                                 //初始化WiFi模块使用的接口和外设
SysTick_Init();                                                                //配置 SysTick 为 1ms 中断一次
KEY_Init();

Delay_ms ( 3000 );
PC_Usart ("\r\n 测试开始\r\n");                            //打印测试例程提示信息
if(RxBuff==NULL)
{
  PC_Usart ( "\r\nmemory allocation failed.goodbye\r\n");
}
ESP8266_fresh ();
while(1)
{
  t=KEY_Scan(0);  //得到键值
  if(t)
  {         
   switch(t)
   {     
    case KEY_DOWN:  
     Web_To_ESP();
     print=(u8*)RxBuff;
     PC_Usart ( "%s", print );
     PC_Usart ( "\r\nhello3\r\n");
     free(RxBuff);
     PC_Usart ( "\r\nhello1\r\n");
     t=0;
     break;
    default:
     break;
   }
  }else Delay_ms(10);
   
}
}
void Web_To_ESP(void)
{  
bool state;
do
{
  strEsp8266_Fram_Record .InfBit .FramLength = 0;               //从新开始接收新的数据包
  ESP8266_Usart ( "%s\r\n", "AT+CIPSTART=\"TCP\",\"eat.weixincore.com\",80" );
  Delay_ms ( 500);                 //延时
  strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ]  = '\0';
  PC_Usart ( "%s", strEsp8266_Fram_Record .Data_RX_BUF );
        state= ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "OK" )||( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "ALREAY CONNECT" )||
   ( ! ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "ERROR" ));

}
while(state==false);
// ESP8266_Link_Server ( enumTCP, "eat.weixincore.com", "80", Single_ID )  ; //此处连接服务器3次,需要优化,但是如果用while,又卡死
// ESP8266_Link_Server ( enumTCP, "eat.weixincore.com", "80", Single_ID );
// ESP8266_Link_Server ( enumTCP, "eat.weixincore.com", "80", Single_ID );
    ESP8266_Cmd ( "AT+CIPMODE=1", "OK", 0, 500 );            //0,非透传;1,透传
ESP8266_Cmd ( "AT+CIPSEND", "\r\n", ">", 500 );
ESP8266_SendString ( ENABLE, "GET /index.php?s=/Mobile/PrinterTest/index HTTP/1.1\r\n", NULL, Single_ID );
ESP8266_SendString ( ENABLE, "Host: eat.weixincore.com\r\n",                            NULL, Single_ID );
ESP8266_SendString ( ENABLE, "User-Agent: abc\r\n",                                     NULL, Single_ID );
ESP8266_SendString ( ENABLE, "Connection: close\r\n",                                   NULL, Single_ID );
ESP8266_SendString ( ENABLE, "\r\n",                                                    NULL, Single_ID );
USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);
DMA_Cmd(DMA1_Channel6, DISABLE );  //关闭USART1 TX DMA1 所指示的通道      
  DMA_SetCurrDataCounter(DMA1_Channel4,512);//DMA通道的DMA缓存的大小
DMA_Cmd(DMA1_Channel6, ENABLE);
while(1)
{
  if(DMA_GetFlagStatus(DMA1_FLAG_TC6)!=RESET) //判断通道6传输完成
  {
   DMA_ClearFlag(DMA1_FLAG_TC6);//清除通道6传输完成标志
   break;
  }
}
}

实验4 web实验-串口2到动态内存.zip

345.5 KB, 下载次数: 15

DMA配置

回复

使用道具 举报

发表于 2015-4-28 09:28:59 | 显示全部楼层
dma地址要4字节对齐
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-28 10:22:28 | 显示全部楼层
我刚刚把动态分配的内存扩大一倍,可以接收到的数据长度就也扩大了一倍
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-28 11:07:42 | 显示全部楼层
flyleaf 发表于 2015-4-28 09:28
dma地址要4字节对齐

现在有个新的问题,动态分配内存给DMA,只能成功一次。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-20 23:33 , Processed in 0.048213 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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