STM8S 的stm8l 触摸按键库是如何在主程序中查询键的呢

基于STM8的电容触摸式感应按键软件库(TSSL)常见问题和解答 STM8应用笔记
基于STM8的电容触摸式感应按键软件库(TSSL)常见问题和解答
以下资料由微雪电子整理并发布,未经许可不得转载,否则追究相应责任!
触摸感应库设计的用意是什么?
该软件可以使任何8-位的STM8和32-位的STM32微控制器成为一个电容触摸按键的控制器。
该方案使得设计者能够通过采用触摸感应控制库来方便使用通用单片机来设计出高端的"外观和手感"的人性化接口来替代机电开关。
设计者可以混合使用多种配置的触摸感应功能(触摸键、滚轮、滑条)和传统的MCU功能(通讯、LED控制、蜂鸣、LCD控制等等)。
电容式触摸感应软件库仅是应用固件的一部分。
成熟、稳定、灵活和高性能使得该方案可以方便实现和快速市场响应来开发出任何类型的应用,比如移动电话、厨房电气和打印机等等。
TSSL检测人手指电容的基本原理是什么?
对于人手的触摸的检测是通过监控由一个电阻和电极电容组成的RC网络的充电/放电时间的周期来获取的。
任何由于电极电容改变所引起的RC时间的改变被检测到后再经滤波最后通过专门的I/O或者I2C/SPI接口报告给主机系统。
采用最少量的元器件,仅仅只需要在每一个触摸通道上一个电阻就可以使能该功能。
RC 采集方法是基于 1976年的 US 专利,但是现在是到期不受保护的。
电极电容的工作原理是什么?
铜箔电极发出电场通过主要是由玻璃或者塑料作为电介质触面板,当一个手指触摸到面板上时由于人体和周边环境的耦合会增加电极的电容值少量几个pF,该增加的电容值通过触摸感应库被检测到。
哪些是推荐用来保护PCB电极的面板?
最重要的因素是面板的厚度和它的"ε"值(材料的介电常数),充足的厚度和它的"ε"值是相互关联的。玻璃和塑料是常用的材质。例如:一块塑料面板可以达10mm的厚度,同时面板和PCB衬底之间的良好连接对于优化性能也是很重要的。最好的PSA(压敏粘合剂)胶水例子是:3M的 467 和 3M的468。
ST 会提供完整库的源代码给客户吗?
是的,提供的库源代码是采用C语言编写的。
该触摸感应软件库必须遵守授权许可吗?
是的,这是一个带许可的版权软件。
当下载该库时,客户必须遵守授权许可来安装和使用该软件库。所提供的软件和相关的文档必须是专门用在由ST 微控制器组成的系统中的,不可以用来其他微控制器。
是否有一些特殊的软件算法来去除噪声干扰?
用户无需增加任何附加的软件层。
在TSSL中内嵌了2个数字滤波器,从而使得该软件方案对于噪声干扰非常稳定。
1.重复采样:对于每个通道执行多次的RC充电/放电采集来过滤高频噪声,从而给出一个精确的测量;
2.第二个功能是使用用户可编程的防抖滤波器来有助于过滤低频噪声。对于一次触摸被确定该数字滤波器机制要求连续执行多次检测。
在制造过程中需要校准吗?
不需要。校准处理已经是后台处理层的一部分,在MCU上电或者用户需要时按键是自动校准的。
该功能使触摸感应系统自动来适应最终的安装和环境条件。因此在制作过程中无需调整。
在产品应用时期,是否要采样什么特殊的功能来补偿环境的改变?
是的。为了避免由于供电的变化、电极电容、温度、湿度、污渍和其他环境影响导致检测失败或者无检测。在TSSL中环境改变系统(ECS)会自动补偿信号随时间的漂移。
有低功耗模式来降低功耗吗?
有。对于用户来说基本的MCU的低功耗模式都保持有效的。因此,通过在应用固件中周期性地插入一些低功耗模式,用户可以显著地减少平均功耗同时保持有效的触摸感应检测。
该平均功耗主要取决于目标MCU(运行时的IDD 值)和按键的数量,以及应用固件的总体。
哪些是按键的响应时间影响因素?
按键的响应时间取决于很多参数,比如通道数量、防抖滤波器的值、重复采样值、用户固件工作任务、电介质厚度、电极电容和电阻R的值。
如下公式可以用来估算最大的按键响应时间:
最大响应时间 = [(DF+1) x tS x NB_channels] + (DF x tU)
tS = 近似1ms (对于一个通道的标准 RC 采集时间)
NB_channels = 通道的编号
DF = 防抖动的滤波器的值(用户可编程)
tU = 用户固件的执行时间
例如:对于一个4个按键的应用:
DF = 2 (标准值)
tU = 1 ms (例子/取决于应用)
响应时间 = 14 ms (在该配置情况下)
相对于竞争对手的大部分现成方案TSSL有哪些主要的优势?
相比于竞争对手建议的单独的或者特别应用的触摸感应IC时,开源的触摸感应软件的方案同众所周知微控制器架构结合,在应用方面提供更好的灵活性和稳定性。由于用户非常熟悉微控制器,因此可以通过简单配置、更改或者调整库来满足应用要求。
从系统层面来说,最重要性能是能通过特定内嵌的软件参数用户可配置的函数(降噪,滤波)来非常完美地控制的灵敏度、稳定性和抗噪声干扰。
相对于竞争对手提供的类似软件方案,一个关键的优势是内嵌在库中的校准和补偿那些由于环境改变而导致的信号漂移的特色,因此在生产过程或者使用的时候该&安全控制&有如一个先进的算法来确保随着时间流逝仍然有正确的触摸感应操作。
基于STM8的电容触摸式感应按键软件库(TSSL)常见问题和解答后使用快捷导航没有帐号?
查看: 9722|回复: 10
STM8S简易版触摸按键程序
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
看了STM8的触摸按键库,没耐心看下去,就自己写了一个简易版的单触摸按键程序,经过测试,效果还不错,和大家分享一下,有不足之处,大家讨论
简单说下硬件电路,PD6为触摸按键输入,PG1为测试用LED,PA6,PB7为灵敏度微调输入口 ,用的是500K的充放电电阻
#include &stm8s.h&
#define DC_MOTOR PA5
#define uchar unsigned char
#define uint&&unsigned int
void TIME3_INIT(void);
void SYSTEM_INIT(void);
#define LED& &PG1&&//测试用LED
u16 m=100;
u8 Sensor=15;
u8 time=0;
void main(void)
/*系统初始*/
SYSTEM_INIT();
GPIOA-&ODR=0XFF;
TIME3_INIT();//
//enableInterrupts();
GPIOD-&CR2=0;
TIM3_Cmd(ENABLE);
GPIOD-&DDR=0XC0;//PD7 PD6 OUTPUT
GPIOD-&CR1=0XC0;//推挽输出
GPIOD-&ODR=0X80;//PD=0X80;
if(time&11)//time m为12次测试结果总和
if(m&(760+Sensor*2)) //760为阀值,sensor为微调
n=5000;//按键延时
GPIOG-&ODR=0;
GPIOG-&ODR=2;
TIM3-&CNTRH=0;
TIM3-&CNTRL=0;& &
GPIOD-&CR1=0X80;//PD6 悬浮输入
GPIOD-&DDR=0X80;//PD6 INPUT
while(!((GPIOD-&IDR)&(0X40)))
m=TIM3-&CNTRL+m;
GPIOD-&DDR=0XC0;//PD7 PD6 OUTPUT
GPIOD-&CR1=0XC0;//推挽输出
GPIOD-&ODR=0X80;//PD=0X80;
/*微调灵敏度调节*/
if(((GPIOA-&IDR)&0X40)==0)
&&if(sn1==1)
if( Sensor&30)
if(((GPIOB-&IDR)&0X80)==0)
&&if(sn2==1)
&&if( Sensor&0)
/*系统初始化*/
void SYSTEM_INIT(void)
/*设置时钟*/
CLK_HSECmd(ENABLE);
CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE, DISABLE);
CLK_ClockSwitchCmd(ENABLE);
CLK_ClockSecuritySystemEnable();
CLK-&CKDIVR=0;
//设置引脚,输出
GPIO_Init(GPIOG,GPIO_PIN_1,GPIO_MODE_OUT_PP_HIGH_SLOW);//led
GPIO_Init(GPIOE,GPIO_PIN_0,GPIO_MODE_OUT_PP_LOW_SLOW);//OUT 1
GPIO_Init(GPIOD,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_LOW_SLOW);//OUT2,3, 4 5 6 7 8
GPIO_Init(GPIOA,GPIO_PIN_5,GPIO_MODE_OUT_PP_LOW_SLOW);//DC_PWM
GPIO_Init(GPIOA,GPIO_PIN_6|GPIO_PIN_4,GPIO_MODE_IN_FL_NO_IT);//IN1,DC_ERROR
GPIO_Init(GPIOB,GPIO_PIN_ALL,GPIO_MODE_IN_FL_NO_IT);//IN2~IN9
GPIO_Init(GPIOE,GPIO_PIN_5,GPIO_MODE_IN_FL_NO_IT);//IN10
GPIO_Init(GPIOC,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,GPIO_MODE_IN_FL_NO_IT);//IN10
//ADC输入通道配置
/*计数器初始化*/
void TIME3_INIT(void)
&&TIM3_DeInit();
&&TIM3_TimeBaseInit(0, 0XFFFF);
&&//TIM3_ITConfig(0x01,ENABLE);
&&TIM3_UpdateRequestConfig(TIM3_UPDATESOURCE_REGULAR);
&&//TIM3_ARRPreloadConfig(ENABLE);
&&//TIM3_Cmd(ENABLE);
下载次数:24
&&&&&&&&&&
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
& & & & & & & & & & & & & & & &&&有谁验证一下吗?如果确实好用,将发裤子一条,
在线时间4 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
& & & & & & & & & & & & & & & &&&嗯,我也在弄STM8,过几天再测试。
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
& & & & & & & & & & & & & & & &&&貌似比较适合少许按键
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
& & & & & & & & & & & & & & & &&&楼主可否写个教程?说说触摸按键实现的步骤。
在线时间22 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
好,touch库简直就是脱裤子放屁,其主要目的是让人用它的产品。看他的那个破API是浪费人的生命啊,那么简单的测试原理它给绕弯绕了十万八千里。
在线时间22 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
芯片厂商的很多所谓的库就是将简单问题复杂化,这是他们的策略。
在线时间6 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
不错,学习中
在线时间10 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
嗯,我也在弄STM8,过几天再测试。
在线时间10 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
不能下载了....
在线时间3 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
赛元集控制,LED显示,触摸按键三合一触摸MCU,可以加我Q咨询索取资料Q
本帖子中包含更多资源
才可以下载或查看,没有帐号?
Powered by
逛了这许久,何不进去瞧瞧?关于触摸库中代码 - STM8 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 4193|回复: 8
关于触摸库中代码
主题帖子积分
初级会员, 积分 152, 距离下一级还需 48 积分
初级会员, 积分 152, 距离下一级还需 48 积分
基于RC充放电原理的触摸按键检测代码是基于软件查询方式还是中断方式?库中
中断代码中根本看不到处理按键检测计时的代码,如果我的应用代码中的中断程
序中有5毫秒的代码需要执行,那么触摸按键检测还能够顺利进行吗?st 触摸应
用相关的应用笔记中描述扫描一个按键要耗时1ms,如果是基于软件查询方式的,
那么启动按键扫描后是不能被中断的,这样结构的程序库还有使用的价值吗?
主题帖子积分
初级会员, 积分 152, 距离下一级还需 48 积分
初级会员, 积分 152, 距离下一级还需 48 积分
RE:关于触摸库中代码运行的机制
没人回答,因为想利用触摸库才想选STM8的,结果还是被触摸库给挡住了。
主题帖子积分
初级会员, 积分 152, 距离下一级还需 48 积分
初级会员, 积分 152, 距离下一级还需 48 积分
RE:关于触摸库中代码
沉的厉害,居然找不到了。
主题帖子积分
初级会员, 积分 152, 距离下一级还需 48 积分
初级会员, 积分 152, 距离下一级还需 48 积分
RE:关于触摸库中代码
找到了个中断,在stm8_tls_timebase.c里。
只是看到时钟滴答处理,并没看到按键充放电时间读取处理,郁闷。
&&******************************************************************************
&&* @brief Manages the timer ticks for the whole application.
* Define as Interrupt Service Routine for HW Timer used as timebase
* (IT every 0.5ms)
* or called by a RTOS
&&* @par Parameters:
&&* @retval void None
&&* @par Required preconditions:
&&******************************************************************************
#if (RTOS_MANAGEMENT & 0)
void TSL_Timer_ISR(void)
#if defined(MCU_STM8L10X) || defined(MCU_STM8L15X_LD) || defined(MCU_STM8L15X_MDHD)
INTERRUPT_HANDLER(TSL_Timer_ISR, 25)
#else /* STM8S */
INTERRUPT_HANDLER(TSL_Timer_ISR, 23)
&&TIMTICK-&SR1 = 0;& && &// clear overflow flag
&&TSL_Tick_Base++;
&&TSL_Timer_Check_10ms_Tick();
&&if (TSL_Tick_Flags.b.User1_Start_100ms) /* Application request */
& & TSL_Tick_Flags.b.User1_Start_100ms = 0;
& & TSL_Tick_Flags.b.User1_Flag_100ms = 0;
& & TSL_Tick_User1 = (TICK_FACTOR_10MS * 10);
&&if (TSL_Tick_Flags.b.User2_Start_100ms) /* Application request */
& & TSL_Tick_Flags.b.User2_Start_100ms = 0;
& & TSL_Tick_Flags.b.User2_Flag_100ms = 0;
& & TSL_Tick_User2 = (TICK_FACTOR_10MS * 10);
&&if (TSL_Tick_User1 & 0)
& & TSL_Tick_User1--;
& & if (TSL_Tick_User1 == 0)
& && &TSL_Tick_Flags.b.User1_Flag_100ms = 1; /* Give information to Application */
&&if (TSL_Tick_User2 & 0)
& & TSL_Tick_User2--;
& & if (TSL_Tick_User2 == 0)
& && &TSL_Tick_Flags.b.User2_Flag_100ms = 1; /* Give information to Application */
#if TIMER_CALLBACK
&&USER_TickTimerCallback();
主题帖子积分
RE:关于触摸库中代码
没有用过你说的这种触摸按键,我想应该是会有一个电压来产生一个上升沿或者下降沿,然后用过外部中断来获取。还有一种,好像是可以通过总线来采集的。
主题帖子积分
初级会员, 积分 152, 距离下一级还需 48 积分
初级会员, 积分 152, 距离下一级还需 48 积分
回复:关于触摸库中代码
[face]006回复第 5 楼 于 07:28:31发表:
没有用过你说的这种触摸按键,我想应该是会有一个电压来产生一个上升沿或者下降沿,然后用过外部中断来获取。还有一种,好像是可以通过总线来采集的。
st的触摸按键相关文档说明了原理, 触摸检测是分别检测I/O口RC充、放电达到I/O口的高、低电平门限阈值,即分别充放电到ViH和ViL,然后记取定时器的计数值,分别为充电时间和放电时间,每个按键扫描一次要进行连续8次的充放电检测。记取充放电时间要用到2个定时器,假设定时器为8位T1和16位T2,T1设为250us定时中断,在触摸按键扫描函数开始运行时启动定时器T1和T2,T1中断发生后读取的T2值即为充电或放电时间。然而stm8触摸库中并看不到这样的处理。
既然是想利用stm8的触摸库就是为了利用它的成熟代码,又怎么会自己另选方案呢,如果自己编写代码那么就要将触摸库中的触摸代码的消抖、自动校准基准值、平滑滤波等功能都要重写一次,感觉有困难。
主题帖子积分
初级会员, 积分 152, 距离下一级还需 48 积分
初级会员, 积分 152, 距离下一级还需 48 积分
RE:关于触摸库中代码
终于找到早期的触摸库了,天啊,真是软件查询方式,充放电都是死等的,坑爹啊。
&&******************************************************************************
&&* @brief Local sub function to wait for vil on RC structure.
&&* @par Parameters:
&&* @retval void None
&&* @par Required preconditions:
&&* @warning
&&* This function must be aligned in memory (start at an even address). This is
&&* done automatically when pragma &section& is used.
&&******************************************************************************
void TSL_IO_SW_Burst_Wait_Vil(void)
&&ld a, _AcquisitionBitMask
&&ldw x, _sTouchIO& &// Input data register ...
&&// Loop = 1 + 1 + 2 + 2 + 2 cycles = 8 cycles
WaitForVil:
&&bcp a, (x)&&// 1 cycles
&&jreq EndWaitForVil
&&ldw y, _TIMACQ_CNTR // 2 hw counter also used for timeout ...
&&cpw y, #0x0E00& & // 2 Timeout compare
&&jrult WaitForVil
EndWaitForVil:
&&******************************************************************************
&&* @brief Local sub function to wait for vih on RC structure.
&&* @par Parameters:
&&* @retval void None
&&* @par Required preconditions:
&&* @warning
&&* This function must be aligned in memory (start at an even address). This is
&&* done automatically when pragma &section& is used.
&&******************************************************************************
void TSL_IO_SW_Burst_Wait_Vih(void)
&&ld a, _AcquisitionBitMask
&&ldw x, _sTouchIO& &// Input data register ...
&&// Loop = 1 + 1 + 2 + 2 + 2 cycles = 8 cycles
WaitForVih:
&&bcp a, (x)&&// 1 cycles
&&jrne EndWaitForVih
&&ldw y, _TIMACQ_CNTR // 2 hw counter also used for timeout ...
&&cpw y, #0x0E00& & // 2 Timeout compare
&&jrult WaitForVih
EndWaitForVih:
主题帖子积分
初级会员, 积分 152, 距离下一级还需 48 积分
初级会员, 积分 152, 距离下一级还需 48 积分
RE:关于触摸库中代码
&&******************************************************************************
&&* @brief Acquisition function for the 1st Channel IO of each group
&&* @par Parameters:
&&* @retval void None
&&* @par Required preconditions:
&&******************************************************************************
void TSL_IO_Acquisition_P1(u16 MaxAcqNumber)
&&u16 MeasurementC
&&/*reset the counter values*/
&&MeasurementCounter = 0x0000;
&&Channel_P1.Measure[0] = 0x0000;
&&Channel_P1.Measure[1] = 0x0000;
&&Channel_P1.State.whole = 0x00;
&&/*open the analog switches*/
&&COMP-&CCS &= (u8)(~(SAMP_CAP_COMP_MASK | P1_COMP_MASK));
&&/*All IO to pushpull LOW for discharging all capacitors (Ctouch and Csense)*/
&&/*discharging Csample*/
#ifdef PROTECT_IO_ACCESS
&&disableInterrupts();
&&SAMP_CAP_PORT-&DDR |= SAMP_CAP_IO_MASK;
&&SAMP_CAP_PORT-&CR1 |= SAMP_CAP_IO_MASK;
&&SAMP_CAP_PORT-&ODR &= (u8)(~(SAMP_CAP_IO_MASK));
&&/*discharging Ctouch*/
&&P1_PORT-&DDR |= P1_IO_MASK;
&&P1_PORT-&CR1 |= P1_IO_MASK;
&&P1_PORT-&ODR &= (u8)(~(P1_IO_MASK));
#ifdef PROTECT_IO_ACCESS
&&enableInterrupts();
&&/*wait a while for good discharging of all capacitors*/
&&wait(200);
&&/*All IO in input floating*/
#ifdef PROTECT_IO_ACCESS
&&disableInterrupts();
&&P1_PORT-&DDR &= (u8)(~(P1_IO_MASK));
&&P1_PORT-&CR1 &= (u8)(~(P1_IO_MASK));
#ifdef PROTECT_IO_ACCESS
&&enableInterrupts();
&&//close the Channel #1 analog switches (COMP1 CHA and COMP2 CH1 ie PB0 and PB2)
&&COMP-&CCS |= SAMP_CAP_COMP_MASK;
&&/*loop while all the 1st channel of each group have not reach the VIH level*/
& & /*Close the sampling capacitor analog switch*/
& & COMP-&CCS |= SAMP_CAP_COMP_MASK;
& & /*charging Ctouch with connecting the IO to Vdd (io in push-pull HIGH)*/
#ifdef PROTECT_IO_ACCESS
& & disableInterrupts();
& & P1_PORT-&DDR |= P1_IO_MASK;//output push pull config
& & P1_PORT-&CR1 |= P1_IO_MASK;
& & P1_PORT-&ODR |= P1_IO_MASK; //HIGH level
#ifdef PROTECT_IO_ACCESS
& & enableInterrupts();
& & /*wait a while for good charging*/
& & CLWHTA; //wait(5);
& & /*All IO in input */
#ifdef PROTECT_IO_ACCESS
& & disableInterrupts();
& & P1_PORT-&DDR &= (u8)(~(P1_IO_MASK));
& & P1_PORT-&CR1 &= (u8)(~(P1_IO_MASK));
#ifdef PROTECT_IO_ACCESS
& & enableInterrupts();
& & MeasurementCounter++;
& & /*charging the Csense cap with connecting it to Ctouch by closing the analog switch*/
& & COMP-&CCS |= P1_COMP_MASK;
& & /*wait a while for good charge transfering*/
& & CLWLTA; //wait(5);
#if SPREAD_SPECTRUM
& & TSL_SW_Spread_Spectrum();
& & /*open the analog switches to allow checking of the inputs*/
& & COMP-&CCS &= (u8)(~(SAMP_CAP_COMP_MASK | P1_COMP_MASK));
& & /*Sampling capacitor IOs in input floating*/
#ifdef PROTECT_IO_ACCESS
& & disableInterrupts();
& & SAMP_CAP_PORT-&DDR &= (u8)(~(SAMP_CAP_IO_MASK));
& & SAMP_CAP_PORT-&CR1 &= (u8)(~(SAMP_CAP_IO_MASK));
#ifdef PROTECT_IO_ACCESS
& & enableInterrupts();
& & if ((Channel_P1.State.b.Grp1 == 0) && ((SAMP_CAP_PORT-&IDR&SAMP_CAP_IO_MASK_1) == SAMP_CAP_IO_MASK_1))
& && &Channel_P1.Measure[0] += MeasurementC
& && &Channel_P1.State.whole |= Group1;
& & if ((Channel_P1.State.b.Grp2 == 0) && ((SAMP_CAP_PORT-&IDR&SAMP_CAP_IO_MASK_2) == SAMP_CAP_IO_MASK_2))
& && &Channel_P1.Measure[1] += MeasurementC
& && &Channel_P1.State.whole |= Group2;
& & /*it's better to implement this like that because it's much more faster than to put this test in the &while test& below and only the MSByte is tested in order to speed up the code execution*/
& & if ((u8)(MeasurementCounter && 8) & (u8)(MaxAcqNumber && 8))
&&while (((Channel_P1.State.whole & Channel_P1.EnabledChannels) != Channel_P1.EnabledChannels));
主题帖子积分
初级会员, 积分 152, 距离下一级还需 48 积分
初级会员, 积分 152, 距离下一级还需 48 积分
RE:关于触摸库中代码
&&******************************************************************************
&&* @brief Acquisition function for the 2nd Channel IO of each group
&&* @par Parameters:
&&* @retval void None
&&* @par Required preconditions:
&&******************************************************************************
#if (NUMBER_OF_ACQUISITION_PORTS & 1)
void TSL_IO_Acquisition_P2(u16 MaxAcqNumber)
&&u16 MeasurementC
&&/*reset the counter values*/
&&MeasurementCounter = 0x0000;
&&Channel_P2.Measure[0] = 0x0000;
&&Channel_P2.Measure[1] = 0x0000;
&&Channel_P2.State.whole = 0x00;
&&/*open the analog switches*/
&&COMP-&CCS &= (u8)(~(SAMP_CAP_COMP_MASK | P2_COMP_MASK));
&&/*All IO to pushpull LOW for discharging all capacitors (Ctouch and Csense)*/
&&/*discharging Csample*/
#ifdef PROTECT_IO_ACCESS
&&disableInterrupts();
&&SAMP_CAP_PORT-&DDR |= SAMP_CAP_IO_MASK;
&&SAMP_CAP_PORT-&CR1 |= SAMP_CAP_IO_MASK;
&&SAMP_CAP_PORT-&ODR &= (u8)(~(SAMP_CAP_IO_MASK));
&&/*discharging Ctouch*/
&&P2_PORT-&DDR |= P2_IO_MASK;
&&P2_PORT-&CR1 |= P2_IO_MASK;
&&P2_PORT-&ODR &= (u8)(~(P2_IO_MASK));
#ifdef PROTECT_IO_ACCESS
&&enableInterrupts();
&&/*wait a while for good discharge of all capacitors*/
&&wait(200);
&&/*All IO in input floating*/
#ifdef PROTECT_IO_ACCESS
&&disableInterrupts();
&&P2_PORT-&DDR &= (u8)(~(P2_IO_MASK));
&&P2_PORT-&CR1 &= (u8)(~(P2_IO_MASK));
#ifdef PROTECT_IO_ACCESS
&&enableInterrupts();
&&//close the Chanel #1 analog switches (COMP1 CHA and COMP2 CH1 ie PB0 and PB2)
&&COMP-&CCS |= SAMP_CAP_COMP_MASK;
&&/*loop while all the 1st channel of each group have not reach the VIH level*/
& & /*Close the sampling capacitor analog switch*/
& & COMP-&CCS |= SAMP_CAP_COMP_MASK;
& & /*charging Ctouch with connecting the IO to Vdd (io in push-pull HIGH)*/
#ifdef PROTECT_IO_ACCESS
& & disableInterrupts();
& & P2_PORT-&DDR |= P2_IO_MASK;//output push pull config
& & P2_PORT-&CR1 |= P2_IO_MASK;
& & P2_PORT-&ODR |= P2_IO_MASK; //HIGH level
#ifdef PROTECT_IO_ACCESS
& & enableInterrupts();
& & /*wait a while for good charging*/
& & CLWHTA; //wait(5);
& & /*All IO in input */
#ifdef PROTECT_IO_ACCESS
& & disableInterrupts();
& & P2_PORT-&DDR &= (u8)(~(P2_IO_MASK));
& & P2_PORT-&CR1 &= (u8)(~(P2_IO_MASK));
#ifdef PROTECT_IO_ACCESS
& & enableInterrupts();
& & MeasurementCounter++;
& & /*charging the Csense cap with connecting it to Ctouch by closing the analog switch*/
& & COMP-&CCS |= P2_COMP_MASK;
& & /*wait a while for good charge transfering*/
& & CLWLTA; //wait(5);
#if SPREAD_SPECTRUM
& & TSL_SW_Spread_Spectrum();
& & /*open the analog switches to allow checking of the inputs*/
& & COMP-&CCS &= (u8)(~(SAMP_CAP_COMP_MASK | P2_COMP_MASK));
& & /*Sampling capacitor IOs in input folating */
#ifdef PROTECT_IO_ACCESS
& & disableInterrupts();
& & SAMP_CAP_PORT-&DDR &= (u8)(~(SAMP_CAP_IO_MASK));
& & SAMP_CAP_PORT-&CR1 &= (u8)(~(SAMP_CAP_IO_MASK));
#ifdef PROTECT_IO_ACCESS
& & enableInterrupts();
& & if ((Channel_P2.State.b.Grp1 == 0) && ((SAMP_CAP_PORT-&IDR&SAMP_CAP_IO_MASK_1) == SAMP_CAP_IO_MASK_1))
& && &Channel_P2.Measure[0] += MeasurementC
& && &Channel_P2.State.whole |= Group1;
& & if ((Channel_P2.State.b.Grp2 == 0) && ((SAMP_CAP_PORT-&IDR&SAMP_CAP_IO_MASK_2) == SAMP_CAP_IO_MASK_2))
& && &Channel_P2.Measure[1] += MeasurementC
& && &Channel_P2.State.whole |= Group2;
& & /*it's better to implement this like that because it's much more faster than to put this test in the &while test& below&&and only the MSByte is tested in order to speed up the code execution*/
& & if ((u8)(MeasurementCounter && 8) & (u8)(MaxAcqNumber && 8))
&&while (((Channel_P2.State.whole & Channel_P2.EnabledChannels) != Channel_P2.EnabledChannels));
站长推荐 /1
欢迎大家分享基于STM32 Nucleo板的设计方案,社区将提供100套开发板团购,29.9元包邮,更有100-1000元不等的开发经费支持——赶紧来赢取ST MCU社区赞助吧!
Tel: 3-8056
备案号: 苏ICP备号-2
Powered by}

我要回帖

更多关于 stm8电容触摸按键 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信