????不知道是那里出的問題,我是先獲取的電池的AD值 再 打開觸摸和 Buffer 然后觸摸代碼處理完后再關(guān)閉,就是電池 的ADC會獲取不到東西。
????????而且有時候MounRiver Studio這個軟件debug還會很奇怪。比如打斷點(diǎn)在337行 他會跑到另一個函數(shù)去,或者在一個斷點(diǎn)函數(shù)里面一直進(jìn)去 ,跳不到另一個打了斷點(diǎn)的函數(shù)。
先放配置代碼
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開啟一次轉(zhuǎn)換
? ? ? ? ? ?{
? ? ? ? ? ? ? ?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? 這個標(biāo)志位是獲取到了ADC的數(shù)據(jù)就賦值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;
}