起因
最近跟着正点原子的大佬学习STM32单片机,学到了触摸实验这一节,就想着既然数据可以输出到TFTLCD屏幕上,那我能不能将数据提取出来,然后导入MATLAB中使触摸轨迹再现。
目录
起因
STM32硬软件介绍
MATLAB显示轨迹
STM32硬软件介绍
-
MINI板硬件连接(资料来源于正点原子)
-
程序分析
主函数:(本实验用的是电阻屏)
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的触摸屏上的输入,如下图:
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显示结果如下:
憧憬
在本次试验,虽然实现了轨迹复现,但还存在着数据接收时间过长实时性不足的问题,第一次写文章,还有甚多不足之处,还望各位看官海涵。