79|0

1524

帖子

1

TA的资源

五彩晶圆(初级)

楼主
 

【复旦微车规MCU FM32FT0A测评】触摸功能检测 [复制链接]

FM32FT0A开发板集成了触摸功能,共含有BT0、BT1两个触摸按键和一个触摸滑条SLDER,见图1所示。

 

图1 触摸单元

 

触摸单元的电路如图2所示:

 

图2 触摸电路

 

为能直观地观察触摸后的变化情况,于是为它配备了串口输出功能。

串口的初始化函数为:

void MF_UART4_Init(void)
{
    FL_UART_InitTypeDef uart = {0};
    FL_GPIO_InitTypeDef gpio = {0};
  
    FL_GPIO_StructInit(&gpio);
    gpio.pin = FL_GPIO_PIN_2 | FL_GPIO_PIN_3;
    gpio.mode = FL_GPIO_MODE_DIGITAL;
    gpio.pull = FL_GPIO_BOTH_DISABLE;
    gpio.outputType = FL_GPIO_OUTPUT_PUSHPULL;
    gpio.remapPin = FL_GPIO_PINREMAP_FUNCTON1;
    FL_GPIO_Init(GPIOB, &gpio);
    
    uart.baudRate = 115200;
    uart.dataWidth = FL_UART_DATA_WIDTH_8B;
    uart.parity = FL_UART_PARITY_NONE;
    uart.stopBits = FL_UART_STOP_BIT_WIDTH_1B;
    uart.transferDirection = FL_UART_DIRECTION_TX_RX;
    FL_UART_Init(UART4, &uart);
    
    FL_UART_ClearFlag_TXShiftBuffEmpty(UART4);
    FL_UART_EnableIT_TXShiftBuffEmpty(UART4);
}

int fputc(int ch, FILE *f)
{
    FL_UART_WriteTXBuff(UART4,(uint8_t)ch);                   /* 将发送数据写入发送寄存器 */
    while(FL_UART_IsActiveFlag_TXBuffEmpty(UART4) != 0x01UL){};  /* 等待发送完成 */
    return ch;      
}

触摸处理的初始化函数为:

TSI_RetCodeType TSI_Init(void)
{
#if (TSI_CALIB_METHOD == TSI_CALIB_METHOD_NONE && TSI_STATISTIC_SENSOR_CS)
    int i;
#endif  /* TSI_CALIB_METHOD && TSI_STATISTIC_SENSOR_CS */

    /* Init objects ---------------------------------------------------------*/
    memcpy(&TSI_Module, &TSI_ModuleConstInit, sizeof(TSI_ModuleTypeDef));
    memcpy(&TSI_WidgetList, &TSI_WidgetListConstInit, sizeof(TSI_WidgetListTypeDef));
    memcpy(&TSI_SensorList, &TSI_SensorListConstInit, sizeof(TSI_SensorListTypeDef));
    
    /* Driver init on first entry -------------------------------------------*/
    if (TSI_RDSTAT_LIB_STAT() == TSI_LIB_RESET)
    {
        TSI_LL_Init();
    }

    /* Driver reset */
    TSI_LL_Reset();

    /* Configure hardware ---------------------------------------------------*/
    /* Set sample clock source */
    TSI_LL_SetSampleClockSource(TSI_SAMPLE_CLK_SOURCE);
    
#if (TSI_USE_SHIELD)
    /* Enable shield driver output */
    TSI_LL_EnableShield(TSI);
#endif

    /* Init TSI library -----------------------------------------------------*/
    /* Set lib status */
    TSI_WRSTAT_LIB_STAT(TSI_LIB_INIT);

#if (TSI_CALIB_METHOD == TSI_CALIB_METHOD_HARDWARE)
    
    /* Hardware parameter auto calibration */
    TSI_CalibrateAllWidgets();

#endif  /* TSI_CALIB_METHOD */

    /* Set scan period */
    TSI_LL_SetScanTiming(TSI_Module.scanCfg);

    /* Reconfigure TSI, which will apply hw params and peform an initial scan */
    TSI_Widget_EnableAll();
    TSI_Reconfig();
    
#if (TSI_CALIB_METHOD == TSI_CALIB_METHOD_NONE && TSI_STATISTIC_SENSOR_CS)
    
    for(i=0; i<TSI_TOTAL_WIDGETS_NUM; i++)
    {
        TSI_WidgetTypeDef* widget = TSI_WidgetPointers[i];
        int j;
        for(j=0; j<widget->meta->sensorCnt; j++)
        {
            TSI_Sensor_CalculateCs(&widget->meta->sensors[j]);
        }
    }

#endif  /* TSI_CALIB_METHOD && TSI_STATISTIC_SENSOR_CS */

    /* Disable all widget */
    TSI_Widget_DisableAll();

    /* Continuous scan */
    TSI_LL_SetScanMode(TSI_SCAN_MODE_CONTINUOUS);
    
    /* User callback */
    TSI_InitCallback();

    return TSI_PASS;
}

实现功能检测的主程序为:

int main(void)
{
	uint8_t f,p;
    /* 使能IWDT */
    IWDT_Init(FL_IWDT_PERIOD_4000MS);

    /* Init FL driver library */
    FL_Init();

    /* 使能SVD, 阈值4.157V(falling)~4.257V(rising) */
    SVD_Init(SVD_MONTIOR_VDD, FL_SVD_WARNING_THRESHOLD_GROUP11, FL_SVD_REFERENCE_1P0V);
    /* 确认SVD监测结果是否高于阈值,如否则持续等待 */
    while(false == SVD_Result_Confirmed(SVD_HIGHER_THRESHOLD, 2000U/*us*/));
    
    /* 使能BOR */
    RMU_BOR_Init(FL_RMU_BOR_THRESHOLD_2P00V);

    /* Init system clock */
    SystemClockInit();

	MF_UART4_Init();

    /* Init TSI */
    TSI_Init();
    printf("TSI test \r\n");
	FL_IWDT_ReloadCounter(IWDT);
    /* Enable all widgets */
    TSI_Widget_EnableAll();

    /* Feed watchdog */
    FL_IWDT_ReloadCounter(IWDT);

    /* Start TSI */
    TSI_Start();

    /* Feed watchdog */
    FL_IWDT_ReloadCounter(IWDT);

	f=0;
	p=0;
    while(1)
    {   
        /* Feed watchdog */
        FL_IWDT_ReloadCounter(IWDT);
        /* 电源掉电监测处理 */
        PowerDownMonitoring();

        /* Handle debug event */
        TSI_Debug_Handler();
			
        FL_IWDT_ReloadCounter(IWDT);  
        /* Wait until a scan sequence has completed */
        if(TSI_GETSTAT_SCAN_CPLT())
        {   
            TSI_CLRSTAT_SCAN_CPLT();
            
            /* Update all widgets */
            TSI_Widget_UpdateAll();

			if((TSI_WidgetList.bt0.buttonStatus==1)&&(f!=1))
			{
			     printf("bt0 is touched\r\n");
				 f=1;
		    }

			if((TSI_WidgetList.bt1.buttonStatus==1)&&(f!=2))
		    {
			     printf("bt1 is touched\r\n");
				 f=2;
			}
              
            
			if(TSI_WidgetList.slider.sliderStatus==1)
		    {
				  f=TSI_WidgetList.slider.centerPos;
				  if(f!=p)
				  {
						printf("silder is touched,position:%d--[range:0-255]\n",TSI_WidgetList.slider.centerPos);
						p=f;
				  }
			}
       }
    }
}

经程序的编译和下载,其测试效果如图3至图5所示。

在输出触摸状态是之所以加判别处理,是因为它太灵敏了,点一下会出现N多个同样的状态输出,会严重影响操控处理。

 

图3 触摸键及点触测试

 

 

图2 滑动测试1

 

 

图5 滑动测试2

 

原规划的目标是实现桌面化的界面下通过触摸操作来进行功能选择及参数的设置,但比较糟糕的是这款板子似乎只适合小程序的测试,而无法组织像样规模的应用设计。

在借助串口实现了触摸操作的测试后,就为其添加了LCD屏的显示功能,结果狗粮几乎是遍地撒,就怕它没执行几条语句就复位,结果还是在添加LCD屏显示后,就无法输出串口显示内容了,也就遑论桌面化的触摸管控了!

 

此帖出自汽车电子论坛
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表