【复旦微车规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屏显示后,就无法输出串口显示内容了,也就遑论桌面化的触摸管控了!
|