打印

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

[复制链接]
309|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
过期账户|  楼主 | 2019-11-27 13:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过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;
  }
}
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

395

主题

395

帖子

0

粉丝