不知道是那里出的问题,我是先获取的电池的AD值 再 打开触摸和 Buffer 然后触摸代码处理完后再关闭,就是电池 的ADC会获取不到东西。
而且有时候MounRiver Studio这个软件debug还会很奇怪。比如打断点在337行 他会跑到另一个函数去,或者在一个断点函数里面一直进去 ,跳不到另一个打了断点的函数。
先放配置代码
void Touch_Key_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
// ADC_InitTypeDef ADC_InitStructure = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
// RCC_ADCCLKConfig(RCC_PCLK2_Div8);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//通道2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//通道1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void ADC_Function_Init(void)
{
ADC_InitTypeDef ADC_InitStructure={0};
GPIO_InitTypeDef GPIO_InitStructure={0};
//
//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE );
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
Touch_Key_Init();
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 3;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE);
ADC_BufferCmd(ADC1, DISABLE); //disable buffer
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
然后下面是我获取AD值得步骤
先是获取电池的
if(ADCBAT_TimeFlag !=0 )
{
ADCBAT_TimeFlag = 0;
CntTime++;
cntdisply++;
if(CntTime >10)//200ms开启一次转换
{
CntTime = 0;
// ADC_Cmd(ADC1, ENABLE);
// ADC_BufferCmd(ADC1, DISABLE); //disable buffer
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5 );
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
flag = 1;
}
}
if(flag !=0)
{
if(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )==SET)
{
flag = 0;
Tmep_ADC = ADC_GetConversionValue(ADC1);
ADC_file = BAT_ADC_Sliding_filter(Tmep_ADC);
}
}
然后再到 触摸按键
if(Touch_ADC_Time_Flag != 0)//500ms
{
Touch_ADC_Time_Flag = 0;
if(collect_OKFlag !=0)
{
collect_OKFlag = 0;
ADC_Cmd(ADC1, ENABLE);
TKey1->CTLR1 |= (1 << 26) | (1 << 24); // Enable TouchKey and Buffer
ADCData[0] = Touch_Key1_Adc(ADC_Channel_1);
ADCData[1] = Touch_Key2_Adc(ADC_Channel_2);
TFTLCD_Show5x7num(5,50,ADCData[0],GREED_COLOR,BACK_MAIN_COLOR);
TFTLCD_Show5x7num(5,60,ADCData[1],GREED_COLOR,BACK_MAIN_COLOR);
TKey1->CTLR1 &= ~ (1 << 26) | (1 << 24); // Enable TouchKey and Buffer
}
}
//collect_OKFlag 这个标志位是获取到了ADC的数据就赋值1 然后触摸再开始
uint16_t BAT_ADC_Sliding_filter(uint16_t bat_val)
{
static int filter_init = -1;
uint32_t Return_num = 0,slid_Sum = 0;
static uint16_t i = 0;
uint8_t j = 0;
buffer_val[i] = bat_val;
i++;
if(i >(MAX_VAL-1))
{
ADC_OK_Flag = 1;
i = 0;
}
for(j =0;j
{
slid_Sum +=buffer_val[j];
}
Return_num = slid_Sum/MAX_VAL;
collect_OKFlag = 1;
return Return_num;
}