44.1 初学者重要提示
学习本章节前,务必优先学习第40章,需要对LTDC的基础知识和HAL库的几个常用API有个认识。
LTDC驱动设计和相关问题在第41章有详细说明。
电阻触摸支持2点和4点校准,而电容屏无需校准。
电阻触摸校准解决的是触摸板的线性度问题,而飞点要另外处理,当前程序已经做了支持。总的来说,V6配套的电阻触摸方案已经比较成熟,可以放心用于项目。
44.2 电阻触摸和电容触摸相关知识
这部分知识点在第42章的2.2小节有详细说明,必看。
44.3 电阻屏硬件设计
电阻触摸STMPE811的原理图如下:
通过STMPE811的原理图要了解以下几点:
I2C的两根通信线I2C_SCL和I2C_SDA的上拉电阻在V7的主板上。
原理图右侧的GPIO-0到GPIO-7可以作为扩展IO使用,支持输入和输出。其中GPIO-4到GPIO-7用于电阻触摸校准(使用那个IO是可以配置的)。
对于X-,X+,Y-和Y+,只要不是X和Y进行组合,其它组合方式可以随意接,配套的触摸校准算法都可以正常识别。
44.4 电容屏硬件设计
电容触摸主要有三种:FT5X06,GT911和GT811,其中GT811已经停产。下面是FT5X06和GT911触摸板效果(触摸板和触摸芯片是一体的):
触摸芯片已经集成到柔性PCB上,且已经校准好。用户使用的话,直接通过I2C方式读取数据即可。下面是电容触摸板引出的引脚:
注意I2C_SDK和I2C_SCL的上拉电阻在V7主板上。
44.5 电阻触摸驱动设计
下面将电阻触摸程序设计中的相关问题逐一为大家做个说明。
44.5.1 STMPE811的驱动实现
电阻触摸要比电容触摸麻烦很多,因为电阻触摸要做校准,还要做滤波,否则采集回来的触摸值会抖动或者出现飞点,出现这种情况的主要原因是电阻触摸板的线性度不够好。开发板电阻屏使用的触摸芯片是STMPE811,这个芯片其实就是12位分辨率的ADC,用来采集电阻触摸板的X轴ADC值和Y轴ADC值,然后按照一定的线性关系将ADC值转换为实际的坐标值。其中这个线性关系是通过触摸校准建立起来的,每次采集的X轴和Y轴ADC就可以代入这个线性关系,从而获得实际的坐标值。
总的来说,STMPE811的驱动不难实现,可以结合STMPE811的数据手册:http://www.armbbs.cn/forum.php?mod=viewthread&tid=23306 研究开发板提供的驱动配置。配置好后仅需要提供读取的X轴,Y轴的ADC值以及触摸按下状态(判断STMPE811的中断输出引脚就可以了,如果有触摸,这个引脚输出低电平,反之,输出高电平。通过判断这个引脚就可以选择是否读取X轴,Y轴的ADC值,避免不必要的操作)。这些函数在bsp_ts_stmpe811.c文件实现。而触摸值滤波,触摸扫描和触摸校准是在bsp_ts_touch.c文件里面实现。
下面是清除触摸中断标志函数和X轴,Y轴的ADC值读取函数,这些函数被bsp_touch.c文件所调用,而函数TOUCH_PenInt是在bsp_ts_touch.c文件,这里也贴出来。
1. /*
2. ******************************************************************************************************
3. * 函 数 名: TOUCH_PenInt
4. * 功能说明: 判断触摸按下
5. * 形 参: 无
6. * 返 回 值: 0表示无触笔按下,1表示有触笔按下
7. ******************************************************************************************************
8. */
9. uint8_t TOUCH_PenInt(void)
10. {
11. if ((TP_INT_GPIO_PORT->IDR & TP_INT_PIN) == 0)
12. {
13. return 1;
14. }
15. return 0;
16. }
17.
18. /*
19. ******************************************************************************************************
20. * 函 数 名: STMPE811_ClearInt
21. * 功能说明: 清楚触笔中断
22. * 形 参: 无
23. * 返 回 值: 无
24. ******************************************************************************************************
25. */
26. void STMPE811_ClearInt(void)
27. {
28. STMPE811_WriteReg1(REG811_INT_STA, 0xFF);
29. }
30.
31. /*
32. ******************************************************************************************************
33. * 函 数 名: STMPE811_ReadX
34. * 功能说明: 读取X坐标adc
35. * 形 参: 无
36. * 返 回 值: X坐标值adc
37. ******************************************************************************************************
38. */
39. uint16_t STMPE811_ReadX(void)
40. {
41. /* 按照 XY 读取模式,连续读取3字节数据,然后分解出X,Y
42. | byte0 | byte1 | byte2 |
43. | X[11:4], | X[3:0],Y[11:8] | Y[7:0] |
44. */
45. uint8_t buf[3];
46.
47. #if 0
48. STMPE811_ReadBytes(buf, REG811_TSC_DATA1, 3);
49.
50. s_AdcX = ((uint16_t)buf[0] << 4) | (buf[1] >> 4);
51. s_AdcY = ((uint16_t)(buf[1] & 0xF) << 8) | buf[2];
52. #else
53. if (STMPE811_ReadReg1(REG811_TSC_CTRL) & 0x80)
54. {
55. STMPE811_ReadBytes(buf, REG811_TSC_DATA1, 3);
56.
57. s_AdcX = ((uint16_t)buf[0] << 4) | (buf[1] >> 4);
58. s_AdcY = ((uint16_t)(buf[1] & 0xF) << 8) | buf[2];
59.
60. #if 0
61. /* for debug */
62. {
63. static int32_t s_t1 = 0;
64. int32_t tt;
65.
66. tt = bsp_GetRunTime();
67. if (tt - s_t1 > 1000)
68. {
69. printf("rn");
70. s_t1 = tt;
71. }
72. printf("(%7d) %5d %5drn", tt, s_AdcX, s_AdcY);
73. }
74. #endif
75. }
76. else
77. {
78. s_AdcX = 0;
79. s_AdcY = 0;
80. }
81. #endif
82.
83. return s_AdcX;
84. }
85.
86. /*
87. ******************************************************************************************************
88. * 函 数 名: STMPE811_ReadX
89. * 功能说明: 读取Y坐标adc
90. * 形 参: 无
91. * 返 回 值: Y坐标值adc
92. ******************************************************************************************************
93. */
94. uint16_t STMPE811_ReadY(void)
95. {
96. return s_AdcY;
97. }
下面将程序设计中的关键地方做个阐释:
第9-16行,通过判断STMPE811的中断输出引脚的高低电平来判断触摸板是否被按下,如果有触摸,这个引脚输出低电平,反之,输出高电平。通过判断这个引脚就可以选择是否读取X轴,Y轴的ADC值,避免不必要的操作。
第26-29行,清除触摸中断标志,检测到触摸屏未被按下时,要做清除。
第39-84行,读取X轴ADC数值。
第94-97行,读取Y轴ADC数值。
44.5.2 电阻触摸扫描函数TOUCH_Scan
接下来再来看bsp_touch.c文件中STMPE811触摸扫描函数TOUCH_Scan的实现:
1. /*
2. ******************************************************************************************************
3. * 函 数 名: TOUCH_Scan
4. * 功能说明: 触摸板事件检测程序。该函数被周期性调用,每ms调用1次. 见 bsp_Timer.c
5. * 形 参: 无
6. * 返 回 值: 无
7. ******************************************************************************************************
8. */
9. void TOUCH_Scan(void)
10. {
11. uint16_t usAdcX;
12. uint16_t usAdcY;
13. static uint16_t s_usXBuf[SAMPLE_COUNT];
14. static uint16_t s_usYBuf[SAMPLE_COUNT];
15. static uint8_t s_ucPos = 0;
16. static uint8_t s_count = 0;
17. static uint8_t s_down = 0;
18. static uint16_t s_usSaveAdcX, s_usSaveAdcY; /* 用于触笔抬起事件,保存按下和移动的最后采样值 */
19. static uint8_t s_ms = 0;
20.
21. if (g_GT811.Enable == 1)
22. {
23. GT811_Timer1ms(); /* 电容触摸屏程序计数器 */
24. return;
25. }
26.
27. if (g_GT911.Enable == 1)
28. {
29. GT911_Timer1ms(); /* 电容触摸屏程序计数器 */
30. return;
31. }
32.
33. if (g_tFT5X06.Enable == 1)
34. {
35. FT5X06_Timer1ms(); /* 电容触摸屏程序计数器 */
36. return;
37. }
38.
39. /* 下面用于电阻触摸 */
40.
41. if (g_tTP.Enable == 0)
42. {
43. return;
44. }
45.
46. if (++s_ms >= 2)
47. {
48. return;
49. }
50.
51. /* 2ms进入一次 */
52. s_ms = 0;
53.
54. /* 触笔中断发生 */
55. if (TOUCH_PenInt())
56. {
57. /* 获得原始的ADC值,未滤波 */
58. usAdcX = STMPE811_ReadX();
59. usAdcY = STMPE811_ReadY();
上一篇:第45章 STM32F429的图形加速器DMA2D的基础知识和HAL库API
下一篇:第43章 STM32F429的LTDC应用之汉字小字库和全字库制作
推荐阅读最新更新时间:2024-11-16 23:35
推荐帖子
- 漏电保护开关的正确选用与运行维护
- 漏电保护开关的正确选用与运行维护http://www.iacmall.com/news-4-2622.html或下载附件漏电保护开关的正确选用与运行维护
- 锐特0086 移动便携
- DM8148 开发板研发记录
- ThistutorialisusefulforHardwareandSoftwareengineers.ForHWengineersitdemonstrateshowtobuildLinuxforaboardandSoftwareengineerswillfindheresomeusefulcommandsforusingTIEZSDK.Beforeyoustart–installTIEZSDKasdesc
- DM8148 DSP 与 ARM 处理器
- 求助 关于AD9854的
- 小弟自己做了个AD9854的板子,这一上电后线性电源有110MA,寄存器什么都没有操作!还有20M的系统晶振,UD管脚只有153K,应该默认是八分频的吧,请教大侠们这正常吗??求助关于AD9854的现在updata信号输出正常了,就是改写寄存器能改变出正确的UPDATA频率,可是输出就是没有小弟用的是Singletone模式有哪些特别要注意的寄存器使能没,write_register(OSK_S,0x00);20H的寄存器打成00了已经,哪位大侠帮帮忙?!
- yufenzhilang DIY/开源硬件专区
- 纳米CMOS电路和物理设计
- 本书将纳米工艺、器件可制造性、先进电路设计和相关物理实现等内容整合到一起,形成了一套先进的半导体技术,探讨了器件和工艺的新发展,提供了设计考虑,重点关注了技术与设计的相互影响,并且描述了可制造性设计和波动性的影响。重要的主题包括纳米CMOS工艺缩小问题及其对设计的影响;亚波长光刻;运行问题的物理与理论以及解决方案;可制造性设计和波动性。本书适合集成电路设计者和该领域的专业人员阅读。https://download.eeworld.com.cn/detail/%E6%8A%9B%E7%A0
- arui1999 下载中心专版
- 单片机来电显示器的设计与实现
- 摘要:介绍一种利用单片机AT89C52接收并显示电话主叫号码的来电显示器。该显示器在被叫挂机状态下接收以频移键控(FSK)方式传送的主叫识别信息,可显示主叫电话号码、呼叫日期、时间等信息,并可存储多达120条的主叫号码信息。用户使用上、下翻转键及删除键可方便地查阅或删除来电信息。关键词:来电显示单片机AT89C52FSKMC145447引言主叫识别信息传送CID(CallingIdentityDelivery)是向被用户电话提供的一种服务业务。其方法是发端交换机
- rain 单片机
- 用20脚2553芯片代替28脚芯片进行DIY的思路
- 用20脚2553芯片代替28脚芯片进行DIY的思路在收到板子第一天,就想把板子焊好。可是等我一看在TI网站上申请的2553芯片,傻眼了。寄来的是20脚的。怪我当时太粗心,收到申请的芯片时也没进行检查。没有办法,只好看看20脚2553芯片能否使用。下面分别是28脚2553芯片和20脚2553芯片的引脚图:通过对比,可以看出,28脚2553芯片和20脚的最大区别就是多了P3的8个引脚。厨房部分电路原理图如下:上图中,最下面8个脚对应的分别是两个按键、温湿
- exiao DIY/开源硬件专区
设计资源 培训 开发板 精华推荐
- 使用 NXP Semiconductors 的 MC9S08JM60CLHE 的参考设计
- KITFS85AEEVM: FS84/FS85 24V/36V卡车安全SBC评估板
- LTC3101 的典型应用 - 宽输入电压、多输出 DC/DC 转换器和 PowerPath 控制器
- 具有手动复位按钮的 LTC1727EMS8-2.5 三路电源监视器的典型应用
- LT1634AIS8-4.096 单节锂离子电池监控电路的典型应用 (IQ = 20uA)
- NCP45560 Eco Switch 高级负载管理的典型应用
- ATX电源测试仪
- 双路可调光大功率LED手电
- fu6832吸尘器低压
- AP1694AEV10,基于 AP1694 120VAC TRIAC 可调光 GU10 LED 驱动器的评估板