/** * @brief Acquisition completed callback in non blocking mode * @param htsc: pointer to a TSC_HandleTypeDef structure that contains * the configuration information for the specified TSC. * @retval None */ void HAL_TSC_ConvCpltCallback(TSC_HandleTypeDef* htsc) { /*##-5- Discharge the touch-sensing IOs ####################################*/ HAL_TSC_IODischarge(&TscHandle, ENABLE); /* Note: a delay can be added here */ /*##-6- Check if the acquisition is correct (no max count) #################*/ if (HAL_TSC_GroupGetStatus(&TscHandle, TSC_GROUP8_IDX) == TSC_GROUP_COMPLETED) { /*##-7- Read the acquisition value #######################################*/ uhTSCAcquisitionValue[IdxBank] = HAL_TSC_GroupGetValue(&TscHandle, TSC_GROUP8_IDX); /* Note: Show the touch activity on LEDs. The threshold values are indicative and may need to be adjusted */ if ((uhTSCAcquisitionValue[0] > 1000) && (uhTSCAcquisitionValue[0] < TSCx_TS1_MAXTHRESHOLD)) // Channel 1 { BSP_LED_On(LED1); } else { BSP_LED_Off(LED1); } if ((uhTSCAcquisitionValue[1] > 1000) && (uhTSCAcquisitionValue[1] < TSCx_TS2_MAXTHRESHOLD)) // Channel 2 { BSP_LED_On(LED2); } else { BSP_LED_Off(LED2); } } /*##-8- Configure the next channels to be acquired #########################*/ if (IdxBank == 0) { IoConfig.ChannelIOs = TSC_GROUP8_IO4; /* TS2 touchkey */ IdxBank = 1; } else { IoConfig.ChannelIOs = TSC_GROUP8_IO2; /* TS1 touchkey */ IdxBank = 0; } if (HAL_TSC_IOConfig(&TscHandle, &IoConfig) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*##-8- Re-start the acquisition process ###################################*/ if (HAL_TSC_Start_IT(&TscHandle) != HAL_OK) { /* Acquisition Error */ Error_Handler(); } }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /* STM32F3xx HAL library initialization: - Configure the Flash prefetch - Systick timer is configured by default as source of time base, but user can eventually implement his proper time base source (a general purpose timer for example or other time source), keeping in mind that Time base duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and handled in milliseconds basis. - Set NVIC Group Priority to 4 - Low Level Initialization */ HAL_Init(); /* Configure the system clock to 72 MHz */ SystemClock_Config(); /* Configure LEDs */ BSP_LED_Init(LED1); /* Touch activity */ BSP_LED_Init(LED2); /* Touch activity */ BSP_LED_Init(LED3); /* Touch activity */ BSP_LED_Init(LED4); /* Error */ /*##-1- Configure the TSC peripheral #######################################*/ TscHandle.Instance = TSCx; TscHandle.Init.AcquisitionMode = TSC_ACQ_MODE_NORMAL; TscHandle.Init.CTPulseHighLength = TSC_CTPH_1CYCLE; TscHandle.Init.CTPulseLowLength = TSC_CTPL_1CYCLE; TscHandle.Init.IODefaultMode = TSC_IODEF_OUT_PP_LOW; TscHandle.Init.MaxCountInterrupt = DISABLE; TscHandle.Init.MaxCountValue = TSC_MCV_16383; TscHandle.Init.PulseGeneratorPrescaler = TSC_PG_PRESC_DIV64; TscHandle.Init.SpreadSpectrum = DISABLE; TscHandle.Init.SpreadSpectrumDeviation = 127; TscHandle.Init.SpreadSpectrumPrescaler = TSC_SS_PRESC_DIV1; TscHandle.Init.SynchroPinPolarity = TSC_SYNC_POLARITY_FALLING; TscHandle.Init.ChannelIOs = TSC_GROUP8_IO2; /* TS1 touchkey */ TscHandle.Init.SamplingIOs = (TSC_GROUP8_IO1 | TSC_GROUP6_IO1); TscHandle.Init.ShieldIOs = TSC_GROUP6_IO2; if (HAL_TSC_Init(&TscHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Infinite loop */ while (1) { /*##-2- Discharge the touch-sensing IOs ##################################*/ /* Must be done before each acquisition */ HAL_TSC_IODischarge(&TscHandle, ENABLE); HAL_Delay(1); /* 1 ms is more than enough to discharge all capacitors */ /*##-3- Start the acquisition process ####################################*/ if (HAL_TSC_Start(&TscHandle) != HAL_OK) { /* Acquisition Error */ Error_Handler(); } /*##-4- Wait for the end of acquisition ##################################*/ /* Before starting a new acquisition, you need to check the current state of the peripheral; if it’s busy you need to wait for the end of current acquisition before starting a new one. */ while (HAL_TSC_GetState(&TscHandle) == HAL_TSC_STATE_BUSY) { /* For simplicity reasons, this example is just waiting till the end of the acquisition, but application may perform other tasks while acquisition operation is ongoing. */ } /*##-5- Clear flags ######################################################*/ __HAL_TSC_CLEAR_FLAG(&TscHandle, (TSC_FLAG_EOA | TSC_FLAG_MCE)); /*##-6- Check if the acquisition is correct (no max count) ###############*/ if (HAL_TSC_GroupGetStatus(&TscHandle, TSC_GROUP8_IDX) == TSC_GROUP_COMPLETED) { /*##-7- Store the acquisition value ####################################*/ uhTSCAcquisitionValue = HAL_TSC_GroupGetValue(&TscHandle, TSC_GROUP8_IDX); /* Show touch activity on LEDs */ /* Threshold values are indicative and may need to be adjusted */ if ((uhTSCAcquisitionValue > TSCx_MIN_THRESHOLD) && (uhTSCAcquisitionValue < TSCx_LOW_MAXTHRESHOLD)) { BSP_LED_On(LED1); if (uhTSCAcquisitionValue < TSCx_MEDIUM_MAXTHRESHOLD) { BSP_LED_On(LED2); if (uhTSCAcquisitionValue < TSCx_HIGH_MAXTHRESHOLD) { BSP_LED_On(LED3); } else { BSP_LED_Off(LED3); } } else { BSP_LED_Off(LED2); BSP_LED_Off(LED3); } } else { BSP_LED_Off(LED1); BSP_LED_Off(LED2); BSP_LED_Off(LED3); } } } }