STM32H750XB_RT-THREAD/38-SAI—音频/SAI—录音与回放/User/touch_pad/bsp_touchpad.c

242 lines
6.0 KiB
C
Raw Permalink Normal View History

2025-07-21 06:34:29 +00:00
/**
******************************************************************************
* @file bsp_touchpad.c
* @author fire
* @version V1.0
* @date 2015-xx-xx
* @brief <EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
******************************************************************************
* @attention
*
* ʵ<EFBFBD><EFBFBD>ƽ̨:Ұ<EFBFBD><EFBFBD> STM32 H750 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD>̳ :http://www.firebbs.cn
* <EFBFBD>Ա<EFBFBD> :https://fire-stm32.taobao.com
*
******************************************************************************
*/
#include "./touch_pad/bsp_touchpad.h"
#include "./delay/core_delay.h"
TIM_HandleTypeDef TIM_Handle;
//<2F><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
__IO uint16_t tpad_default_val=0;
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
#define TPAD_ARR_MAX_VAL 0XFFFF
//<2F><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(tpad_default_val + TPAD_GATE_VAL),<2C><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>.
#define TPAD_GATE_VAL 100
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
static void TPAD_Reset(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPIO_InitStructure.Pin = TPAD_TIM_CH_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStructure.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(TPAD_TIM_CH_PORT, &GPIO_InitStructure);
//<2F><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ƽ,<2C>ŵ<EFBFBD>
HAL_GPIO_WritePin(TPAD_TIM_CH_PORT, TPAD_TIM_CH_PIN ,GPIO_PIN_RESET);
//<2F><><EFBFBD><EFBFBD>һС<D2BB><D0A1>ʱ<EFBFBD><CAB1><EFBFBD>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>֤<EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD>ȫ
HAL_Delay(5);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD>־
__HAL_TIM_CLEAR_FLAG(&TIM_Handle,TIM_FLAG_CC1);
__HAL_TIM_CLEAR_FLAG(&TIM_Handle,TIM_FLAG_UPDATE);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
__HAL_TIM_SET_COUNTER(&TIM_Handle,0);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ù<EFBFBD><C3B9>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD>ϡ<EFBFBD><CFA1><EFBFBD><EFBFBD><EFBFBD>
GPIO_InitStructure.Pin = TPAD_TIM_CH_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.Alternate = TPAD_TIMx_AF;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStructure.Pull = GPIO_NOPULL;
HAL_GPIO_Init(TPAD_TIM_CH_PORT,&GPIO_InitStructure);
}
/**
* @brief <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>TIMx<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void TIM_Mode_Config(void)
{
TIM_IC_InitTypeDef TIM_IC_Config;
GPIO_InitTypeDef GPIO_InitStructure;
TPAD_TIM_CLK_ENABLE();
TPAD_TIM_GPIO_CLK_ENABLE();
//<2F>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>
GPIO_InitStructure.Pin = TPAD_TIM_CH_PIN;
//<2F><><EFBFBD>ù<EFBFBD><C3B9><EFBFBD>
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.Alternate = TPAD_TIMx_AF;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPIO_InitStructure.Pull = GPIO_NOPULL;
HAL_GPIO_Init(TPAD_TIM_CH_PORT, &GPIO_InitStructure);
TIM_Handle.Instance = TPAD_TIMx;
TIM_Handle.Init.RepetitionCounter = 0;
TIM_Handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
TIM_Handle.Init.CounterMode = TIM_COUNTERMODE_UP;
TIM_Handle.Init.Period = TPAD_ARR_MAX_VAL;
//<2F><EFBFBD><E8B6A8>ʱ<EFBFBD><CAB1>Ԥ<EFBFBD><D4A4>Ƶ<EFBFBD><C6B5>Ŀ<EFBFBD><C4BF>ʱ<EFBFBD><CAB1>Ϊ<EFBFBD><CEAA>9MHz(200Mhz/22)
TIM_Handle.Init.Prescaler = 23 - 1;
HAL_TIM_IC_Init(&TIM_Handle);
TIM_IC_Config.ICFilter = 0;
TIM_IC_Config.ICPolarity = TIM_ICPOLARITY_RISING;
TIM_IC_Config.ICPrescaler = TIM_ICPSC_DIV1;
TIM_IC_Config.ICSelection = TIM_ICSELECTION_DIRECTTI;
HAL_TIM_IC_ConfigChannel(&TIM_Handle, &TIM_IC_Config, TPAD_TIM_Channel_X);
//<2F><><EFBFBD><EFBFBD>TIM
HAL_TIM_IC_Start(&TIM_Handle, TPAD_TIM_Channel_X);
}
/**
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* @param <EFBFBD><EFBFBD>
* @retval TIMx_CCRx<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>ֵ
*/
static uint16_t TPAD_Get_Val(void)
{
uint16_t temp;
/* <20>ȷŵ<C8B7><C5B5><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
TPAD_Reset();
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while(__HAL_TIM_GET_FLAG(&TIM_Handle,TIM_FLAG_CC1) == RESET )
{
//<2F><>ʱ<EFBFBD><CAB1><>ӷ<EFBFBD><D3B7><EFBFBD>CNT<4E><54>ֵ
if(__HAL_TIM_GET_COUNTER( &TIM_Handle)>TPAD_ARR_MAX_VAL-500)
return __HAL_TIM_GET_COUNTER(&TIM_Handle);
};
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD><EFBFBD>TIMx_CCRx<52>Ĵ<EFBFBD><C4B4><EFBFBD>ֵ */
temp = HAL_TIM_ReadCapturedValue(&TIM_Handle, TPAD_TIM_Channel_X);
// printf("scan_rval=%d\n",temp);
return temp;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>n<EFBFBD>β<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* @param n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>
* @retval n<EFBFBD>ζ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*/
static uint16_t TPAD_Get_MaxVal(uint8_t n)
{
uint16_t temp=0;
uint16_t res=0;
while(n--)
{
temp=TPAD_Get_Val();//<2F>õ<EFBFBD>һ<EFBFBD><D2BB>ֵ
if(temp>res)res=temp;
};
return res;
}
/**
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @note <EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD>ص<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡֵ
* @param <EFBFBD><EFBFBD>
* @retval 0,<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>;1,<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>
*/
uint8_t TPAD_Init(void)
{
uint16_t buf[10];
uint32_t temp=0;
uint8_t j,i;
TIM_Mode_Config();
for(i=0;i<10;i++)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ10<31><30>
{
buf[i]=TPAD_Get_Val();
HAL_Delay(10);
}
for(i=0;i<9;i++)//<2F><><EFBFBD><EFBFBD>
{
for(j=i+1;j<10;j++)
{
if(buf[i]>buf[j])//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
temp=buf[i];
buf[i]=buf[j];
buf[j]=temp;
}
}
}
temp=0;
//ȡ<>м<EFBFBD><D0BC><EFBFBD>6<EFBFBD><36><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>ƽ<EFBFBD><C6BD>
for(i=2;i<8;i++)
{
temp+=buf[i];
}
tpad_default_val=temp/6;
/* printf<74><66>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>ֵTPAD_GATE_VAL<41><4C><EFBFBD><EFBFBD>Ӧ<EFBFBD>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD>Ӧע<D3A6>͵<EFBFBD> */
//printf("tpad_default_val:%d\r\n",tpad_default_val);
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TPAD_ARR_MAX_VAL/2<><32><EFBFBD><EFBFBD>ֵ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!
if(tpad_default_val>TPAD_ARR_MAX_VAL/2)
{
return 1;
}
return 0;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><EFBFBD><EFBFBD>
* @note <EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD>ص<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡֵ
* @param mode:0,<EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>α<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܰ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>);1,֧<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
* @retval 0,û<EFBFBD>а<EFBFBD><EFBFBD><EFBFBD>;1,<EFBFBD>а<EFBFBD><EFBFBD><EFBFBD>;
*/
uint8_t TPAD_Scan(uint8_t mode)
{
//0,<2C><><EFBFBD>Կ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>;>0,<2C><><EFBFBD><EFBFBD><EFBFBD>ܿ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
static uint8_t keyen=0;
//ɨ<><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t res=0;
//Ĭ<>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ3<CEAA><33>
uint8_t sample=3;
//<2F><><EFBFBD><EFBFBD>ֵ
uint16_t rval;
if(mode)
{
//֧<><D6A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ6<CEAA><36>
sample=6;
//֧<><D6A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
keyen=0;
}
/* <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ֵ(<28><><EFBFBD><EFBFBD> sample <20><>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ) */
rval=TPAD_Get_MaxVal(sample);
/* printf<74><66>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>ֵTPAD_GATE_VAL<41><4C><EFBFBD><EFBFBD>Ӧ<EFBFBD>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD>Ӧע<D3A6>͵<EFBFBD> */
// printf("scan_rval=%d\n",rval);
//<2F><><EFBFBD><EFBFBD>tpad_default_val+TPAD_GATE_VAL,<2C><>С<EFBFBD><D0A1>10<31><30>tpad_default_val,<2C><><EFBFBD><EFBFBD>Ч
if(rval>(tpad_default_val+TPAD_GATE_VAL)&&rval<(10*tpad_default_val))
{
//keyen==0,<2C><>Ч
if(keyen==0)
{
res=1;
}
keyen=3; //<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD>ٹ<EFBFBD>3<EFBFBD><33>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD>ܰ<EFBFBD><DCB0><EFBFBD><EFBFBD><EFBFBD>Ч
}
if(keyen)
{
keyen--;
}
return res;
}
/*********************************************END OF FILE**********************/