还是Ch32V307触摸的问题太难了


    不知道是那里出的问题,我是先获取的电池的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;


}



从触摸切换到ADC以及从ADC切换到触摸都要重新初始化,触摸跟ADC共用一个模块,要注意互相之间的影响。目前我们CH32V307的触摸库还在验证,你可以给我一个邮箱,发给你帮忙测试一下看看效果如何。我的邮箱ccs@wch.cn


只有登录才能回复,可以选择微信账号登录