硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2705|回复: 3
收起左侧

[有问必答] STM32F407+FreeRtos+StemWin(HAL库)触摸问题

[复制链接]

3

主题

5

回帖

14

积分

新手上路

积分
14
发表于 2018-9-27 21:24:11 | 显示全部楼层 |阅读模式
请问一下有没有HAL库 STM32F407 FreeRTOS与STemWin结合的例程我自己移植的这个工程,不知道触摸为什么有点小问题,其它都是没有问题的
文件链接:文件太大,只能发百度云盘
链接: https://pan.baidu.com/s/1rMrZ1MKzf66sCnZbDJxWhg 提取码: cr62

问题:我其实不太知道STemWin的触摸部分和没有操作系统时的区别(在不带操作系统的时候触摸校正是没有问题的)



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107626
QQ
发表于 2018-9-28 00:16:28 | 显示全部楼层

回帖奖励 +3 个金币

这个可以这样检查,将emWin的游标箭头显示出来,然后水平或者垂直滑动,看看箭头的走向。
回复

使用道具 举报

3

主题

5

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2018-9-28 13:44:51 | 显示全部楼层
本帖最后由 zidone 于 2018-9-28 14:15 编辑
eric2013 发表于 2018-9-28 00:16
这个可以这样检查,将emWin的游标箭头显示出来,然后水平或者垂直滑动,看看箭头的走向。

video_20180928_140204.mp4 (25.87 MB, 下载次数: 15) video_20180928_133725.mp4 (44 MB, 下载次数: 13)
1.箭头只在屏幕的上三分之一的部分内移动,且与手指移动方向相反
2.执行触摸校正程序的时候,屏幕左上以及右上坐标点是可以正确校正的,下半部分两个点无法正确校正
3.我手指移动屏幕最左边,箭头基本上是移到屏幕的最右边;我手指移动到屏幕最右边,箭头基本上是移动到屏幕最左边;我手指移动到屏幕最下边,箭头移动到屏幕最上边;
但是我手指移动到屏幕最上边,箭头不能移动到屏幕最下边,基本在屏幕的上三分之一处。
4.且箭头不与手指紧密跟随
  1. /*********************************************************************
  2. *                SEGGER Microcontroller GmbH & Co. KG                *
  3. *        Solutions for real time microcontroller applications        *
  4. **********************************************************************
  5. *                                                                    *
  6. *        (c) 1996 - 2015  SEGGER Microcontroller GmbH & Co. KG       *
  7. *                                                                    *
  8. *        Internet: www.segger.com    Support:  support@segger.com    *
  9. *                                                                    *
  10. **********************************************************************

  11. ** emWin V5.30 - Graphical user interface for embedded applications **
  12. All  Intellectual Property rights  in the Software belongs to  SEGGER.
  13. emWin is protected by  international copyright laws.  Knowledge of the
  14. source code may not be used to write a similar product.  This file may
  15. only be used in accordance with the following terms:

  16. The software has been licensed to  ARM LIMITED whose registered office
  17. is situated at  110 Fulbourn Road,  Cambridge CB1 9NJ,  England solely
  18. for  the  purposes  of  creating  libraries  for  ARM7, ARM9, Cortex-M
  19. series,  and   Cortex-R4   processor-based  devices,  sublicensed  and
  20. distributed as part of the  MDK-ARM  Professional  under the terms and
  21. conditions  of  the   End  User  License  supplied  with  the  MDK-ARM
  22. Professional.
  23. Full source code is available at: www.segger.com

  24. We appreciate your understanding and fairness.
  25. ----------------------------------------------------------------------
  26. Licensing information

  27. Licensor:                 SEGGER Software GmbH
  28. Licensed to:              ARM Ltd
  29. Licensed SEGGER software: emWin
  30. License number:           GUI-00181
  31. License model:            LES-SLA-20007, Agreement, effective since October 1st 2011
  32. Licensed product:         MDK-ARM Professional
  33. Licensed platform:        ARM7/9, Cortex-M/R4
  34. Licensed number of seats: -
  35. ----------------------------------------------------------------------
  36. File        : GUI_TOUCH_X.C
  37. Purpose     : Config / System dependent externals for GUI
  38. ---------------------------END-OF-HEADER------------------------------
  39. */

  40. #include "GUI.h"
  41. #include "touch/bsp_touch.h"
  42. void GUI_TOUCH_X_ActivateX(void) {
  43. }

  44. void GUI_TOUCH_X_ActivateY(void) {
  45. }

  46. int  GUI_TOUCH_X_MeasureX(void) {
  47.   return XPT2046_ReadAdc_Fliter(XPT2046_CHANNEL_Y);
  48. }

  49. int  GUI_TOUCH_X_MeasureY(void) {
  50.   return XPT2046_ReadAdc_Fliter(XPT2046_CHANNEL_X);
  51. }

复制代码
  1. #define SAMP_CNT        4          // 定义采集次数
  2. #define SAMP_CNT_DIV2   2          // 采集次数/2
  3. /**
  4.   * 函数功能: 选择一个模拟通道,启动ADC,并返回ADC采样结果
  5.   * 输入参数: channel :通道选择
  6.   *           参数值:0x90 :通道Y
  7.   *           参数值:0xd0 :通道X
  8.   * 返 回 值: 滤波后的12位ADC值
  9.   * 说    明:无
  10.   */
  11. uint16_t XPT2046_ReadAdc_Fliter(uint8_t channel)
  12. {
  13.   uint8_t i, j, min;
  14.   uint16_t temp;
  15.   uint16_t tempXY[SAMP_CNT];
  16.   
  17.   static uint16_t adc_x = 0,adc_y = 0;

  18.   /* 如果检查到触摸屏被按下,才进行触摸屏通道采集,否则直接退出函数 */
  19.   /* 通过触摸屏IRQ引脚可以判断触摸屏是否被触摸,有被触摸时为低电平,否则为高电平 */
  20.   if(XPT2046_EXTI_Read()== XPT2046_EXTI_ActiveLevel)
  21.   {
  22.     /* 连续采样SAMP_CNT次数的数据 */
  23.     for(i = 0;i < SAMP_CNT;i++)
  24.     {
  25.       XPT2046_WriteCMD(channel);
  26.       tempXY[i] = XPT2046_ReadCMD();     
  27.     }
  28.     /* 降序排列 */
  29.     for(i=0; i<SAMP_CNT-1; i++)
  30.     {
  31.       min=i;
  32.       for (j=i+1; j<SAMP_CNT; j++)
  33.       {
  34.         if (tempXY[min] > tempXY[j]) min=j;
  35.       }
  36.       temp = tempXY[i];
  37.       tempXY[i] = tempXY[min];
  38.       tempXY[min] = temp;
  39.     }
  40.    
  41.     // 设定阈值
  42.     if((tempXY[SAMP_CNT_DIV2]-tempXY[SAMP_CNT_DIV2-1]) > 5)
  43.     {
  44.       /* 若两个中间值相差太远,则舍弃这个新数据,返回上一次的触摸数据*/
  45.       if(channel == XPT2046_CHANNEL_Y )
  46.         return adc_x; //x通道
  47.       else
  48.         return adc_y; //y通道   
  49.     }
  50.    
  51.    // 求中间值的均值   
  52.    if(channel == XPT2046_CHANNEL_Y)
  53.    {
  54.       adc_x = (tempXY[SAMP_CNT_DIV2]+tempXY[SAMP_CNT_DIV2-1]) / 2;
  55.       //printf("x->%d \n",adc_x);
  56.       return adc_x;
  57.     }      
  58.     else
  59.     {
  60.       adc_y = (tempXY[SAMP_CNT_DIV2]+tempXY[SAMP_CNT_DIV2-1]) / 2;
  61.       //printf("y->%d ",adc_y);
  62.       return adc_y;
  63.     }      
  64.   }
  65.   else
  66.   {
  67.     return 0;   //没有触摸,返回0
  68.   }
  69. }
复制代码
  1. /**
  2.   * 函数功能: 触摸校准计算
  3.   * 输入参数: 无
  4.   * 返 回 值: 无
  5.   * 说    明: 无
  6.   */
  7. void TOUCH_Calibrate(void)
  8. {
  9.   uint16_t Calibrate_data[10];
  10.   int aPhysX[2], aPhysY[2], aLogX[2], aLogY[2], i;
  11.   GUI_SetBkColor(GUI_WHITE);
  12.   GUI_Clear();
  13.   GUI_SetColor(GUI_BLACK);
  14.   GUI_SetFont(&GUI_Font13B_ASCII);
  15.   _Explain();
  16.   /* Set the logical values */
  17.   aLogX[0] = 15;
  18.   aLogY[0] = 15;
  19.   aLogX[1] = LCD_GetXSize() - 20;
  20.   aLogY[1] = LCD_GetYSize() - 20;
  21.   /* Get the physical values of the AD converter for 2 positions */
  22.   for (i = 0; i < 2; i++) {
  23.     _GetPhysValues(aLogX[i], aLogY[i], &aPhysX[i], &aPhysY[i], _acPos[i]);
  24.   }
  25.   
  26.   
  27.   Calibrate_data[0]=0xAA55;
  28.   Calibrate_data[1]=aLogX[0];
  29.   Calibrate_data[2]=aLogX[1];
  30.   Calibrate_data[3]=aPhysX[0];
  31.   Calibrate_data[4]=aPhysX[1];
  32.   
  33.   Calibrate_data[5]=aLogY[0];
  34.   Calibrate_data[6]=aLogY[1];
  35.   Calibrate_data[7]=aPhysY[0];
  36.   Calibrate_data[8]=aPhysY[1];
  37.   Calibrate_data[9]=0x55AA;
  38.    
  39.   if((Calibrate_data[3]<490&&Calibrate_data[3]>260)&&(Calibrate_data[4]<3780&&Calibrate_data[4]>3490)
  40.     &&(Calibrate_data[7]<3920&&Calibrate_data[7]>3660)&&(Calibrate_data[8]<500&&Calibrate_data[8]>270))
  41.   {
  42.     SPI_FLASH_SectorErase(CALIBRATE_DATA_ADDR);
  43.     SPI_FLASH_BufferWrite((uint8_t *)Calibrate_data,CALIBRATE_DATA_ADDR, sizeof(Calibrate_data));        
  44.     /* Use the physical values to calibrate the touch screen */
  45.     GUI_TOUCH_Calibrate(GUI_COORD_X, aLogX[0], aLogX[1], aPhysX[0], aPhysX[1]); /* Calibrate X-axis */
  46.     GUI_TOUCH_Calibrate(GUI_COORD_Y, aLogY[0], aLogY[1], aPhysY[0], aPhysY[1]); /* Calibrate Y-axis */
  47.    
  48.     printf("\nGUI_COORD_X:aLogX[0]=%d,aLogX[1]=%d,aPhysX[0]=%d,aPhysX[1]=%d\n",aLogX[0], aLogX[1], aPhysX[0], aPhysX[1]);
  49.     printf("\nGUI_COORD_Y:aLogY[0]=%d,aLogY[1]=%d,aPhysY[1]=%d,aPhysY[1]=%d\n",aLogY[0], aLogY[1], aPhysY[0], aPhysY[1]);
  50.   }
  51.   else
  52.   {
  53.     printf("触摸屏校验失败,触摸误差太大。\n");
  54.     GUI_Clear();
  55.     GUI_Delay(10);
  56.     GUI_SetColor(GUI_RED);
  57.     GUI_SetFont(GUI_FONT_20B_ASCII);
  58.     GUI_DispStringAt("Touch Calibrate Failure!!!\n   The System will Reboot",10,100);
  59.     GUI_Delay(3000);
  60.     Soft_Reset();
  61.   }
  62.   
  63.   SPI_FLASH_BufferRead((uint8_t *)Calibrate_data,CALIBRATE_DATA_ADDR, sizeof(Calibrate_data));
  64.   printf("Calibrate_data:\n [0]->0x%X\n [1]->%d\n [2]->%d\n [3]->%d\n [4]->%d\n",
  65.           Calibrate_data[0],Calibrate_data[1],Calibrate_data[2],Calibrate_data[3],Calibrate_data[4]);
  66.   printf(" [5]->%d\n [6]->%d\n [7]->%d\n [8]->%d\n [9]->0x%X\n",
  67.           Calibrate_data[5],Calibrate_data[6],Calibrate_data[7],Calibrate_data[8],Calibrate_data[9]);
  68.   /* Display the result */
  69.   GUI_CURSOR_Show();
  70.   GUI_Clear();
  71.   _DispStringCentered("Congratulation, your\n"
  72.                       "touch screen has been\n"
  73.                       "calibrated. Please use\n"
  74.                       "the cursor to test\n"
  75.                       "the calibration...");
  76.   /* Let the user play */
  77.   while(1) {
  78.     GUI_PID_STATE State;
  79.     GUI_TOUCH_GetState(&State);
  80.     if (State.Pressed == 1) {
  81.       GUI_FillCircle(State.x, State.y, 3);
  82.     }
  83.     GUI_Delay(10);
  84.   }
  85. }
复制代码





1.png
2.png
3.png
4.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107626
QQ
发表于 2018-9-29 10:36:53 | 显示全部楼层
zidone 发表于 2018-9-28 13:44
1.箭头只在屏幕的上三分之一的部分内移动,且与手指移动方向相反
2.执行触摸校正程序的时候,屏幕左上 ...

你的这个程序裸机的时候,触摸能正常使用不,这种情况是否有测试过。

从你当前的描述来看,你的触摸驱动在垂直方向,是没有正确获取数值的,而水平方向是镜像了。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-8 02:44 , Processed in 0.271939 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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