起因

最近跟着正点原子的大佬学习STM32单片机,学到了触摸实验这一节,就想着既然数据可以输出到TFTLCD屏幕上,那我能不能将数据提取出来,然后导入MATLAB中使触摸轨迹再现。

目录

起因

STM32硬软件介绍

MATLAB显示轨迹

憧憬



STM32硬软件介绍

MINI板硬件连接(资料来源于正点原子)

android触摸轨迹 触摸屏显示运动轨迹_matlab

程序分析

主函数:(本实验用的是电阻屏)

int main(void)
  { 
      delay_init();             //延时函数初始化      
     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
     uart_init(115200);         //串口初始化为9600 
     LED_Init();                  //初始化与LED连接的硬件接口
     LCD_Init();                   //初始化LCD     
     KEY_Init();                //按键初始化             
     tp_dev.init();            //触摸屏初始化
     POINT_COLOR=RED;//设置字体为红色 
     
     LCD_ShowString(60,50,200,16,16,"Mini STM32");    
     LCD_ShowString(60,70,200,16,16,"TOUCH TEST");    
     LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
     LCD_ShowString(60,110,200,16,16,"2014/3/11");
     if(tp_dev.touchtype!=0XFF)LCD_ShowString(60,130,200,16,16,"Press KEY0 to Adjust");//电阻屏才显示
     delay_ms(1500);
     Load_Drow_Dialog();         
     if(tp_dev.touchtype&0X80)ctp_test();    //电容屏测试
         else rtp_test();                         //电阻屏测试      
 }

电阻屏测试函数   :将触摸处的坐标,存储在SendBuff数组中随后使能串口的DMA,开启传输,等待传输完成。

void rtp_test(void)
 {
     #define TEXT_LENTH  2        //TEXT_TO_SEND字符串长度(不包含结束符)
     u8 key;
     u8 i=0;      
     u8 SendBuff[TEXT_LENTH];    
     u32 flag = 0 ;
     MYDMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)SendBuff,TEXT_LENTH);
                  
     while(1)
     {
          key=KEY_Scan(0);
         tp_dev.scan(0);         
         if(tp_dev.sta&TP_PRES_DOWN)            //触摸屏被按下
         {    
              if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
             {    
                 if(tp_dev.x[0]>(lcddev.width-24)&&tp_dev.y[0]<16)Load_Drow_Dialog();//清除
                 else 
                 {
                     TP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED);        //画图    
                     SendBuff[0] = tp_dev.x[0];        
                     SendBuff[1] = tp_dev.y[0];                                
                     USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); //????1?DMA??        
                     MYDMA_Enable(DMA1_Channel4);//开始一次DMA传输!      
                         //等待DMA传输完成,此时我们来做另外一些事,点灯
                         //实际应用中,传输数据期间,可以执行另外的任务
                     while(1)
                     {
                         if(DMA_GetFlagStatus(DMA1_FLAG_TC4)!=RESET)//等待通道4传输完成
                         {
                             DMA_ClearFlag(DMA1_FLAG_TC4);//清除通道4传输完成标志
                             break; 
                         }
                     }
                 }
             }
         }else delay_ms(10);    //没有按键按下的时候         
         if(key==KEY0_PRES)    //KEY0按下,则执行校准程序
         {
             LCD_Clear(WHITE);//清屏
             TP_Adjust();  //屏幕校准 
             TP_Save_Adjdata();     
             Load_Drow_Dialog();
         }
         i++;
         if(i%20==0)LED0=!LED0;
     }
     
 }

STM32的触摸屏上的输入,如下图:

android触摸轨迹 触摸屏显示运动轨迹_stm32_02

 MATLAB显示轨迹

close all
 clear 
 delete(instrfindall);
 s = serial('COMX', 'BaudRate', 115200, 'DataBits', 8, 'StopBits', 1, 'Parity', 'none', 'FlowControl', 'none');
 s.ReadAsyncMode = 'continuous';
 fopen(s);
 fwrite(s,1,'uint8');%向单片机发送握手信号
 while(1)
  for i = 1:1000 %循环读取 ,1000个数据
     for j =1:2
         Coordinate_Values(i,j)=fread(s,1,'uint8')  %读取 数据个数 与 类型  
     end
   i=i+1;  
  end
      fclose(s);%关闭串口
 end

数据接收完成后在命令行窗口执行以下程序显示数据

axis square;
   plot(Coordinate_Values(:,2),Coordinate_Values(:,1),'+')%画图% hold on;%使下次画的图不被覆盖,方便与上次图形进行对比
      axis([0,400,0,400]);%设置x,y轴坐标范围 
      axis square;
      hold on

显示结果如下:

android触摸轨迹 触摸屏显示运动轨迹_matlab_03

憧憬

在本次试验,虽然实现了轨迹复现,但还存在着数据接收时间过长实时性不足的问题,第一次写文章,还有甚多不足之处,还望各位看官海涵。