OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2811|回复: 2

STM32F103-4路触摸按键问题求助

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2014-4-1
在线时间
1 小时
发表于 2016-1-4 10:55:55 | 显示全部楼层 |阅读模式
我修改了战舰开发板的 触摸按键的代码,然后自己画了板子,出现了一个很奇怪的问题,向各位朋友们求助下!
芯片:STM32F103CBT6
引脚定义:
PA0 -- K1 TIM2_CH1
PA1 -- K2 TIM2_CH2
PA3 -- K3 TIM2_CH3
PA4 -- K4 TIM2_CH4

问题描述:
在原子战舰开发板的触摸按键范例基础上修改,出现的问题:
4个通道中,只有通道2 能够实现触摸按键检测功能,通道1、3、4均不能。
代码如下:
#include "tpad.h"
#include "delay.h"                    
#include "usart.h"

#define TPAD_ARR_MAX_VAL         0XFFFF        //×î′óμÄARRÖμ
vu16 tpad_default_val=0;//¿ÕÔØμÄê±oò(ûóDêÖ°′ÏÂ),¼ÆêyÆ÷DèòaμÄê±¼ä


//3õê¼»ˉ′¥Ãt°′¼ü
//»ñμÿÕÔØμÄê±oò′¥Ãt°′¼üμÄè¡Öμ.
//·μ»ØÖμ:0,3õê¼»ˉ3é1|;1,3õê¼»ˉê§°ü
u8 TPAD_Init(u8 psc)
{
        u16 buf[10];
        u16 temp;
        u8 j,i;
        TIM5_CH2_Cap_Init(TPAD_ARR_MAX_VAL,psc-1);//òÔ1MhzμÄÆμÂê¼Æêy
        for(i=0;i<10;i++)//á&#172;D&#248;&#182;áè&#161;10′&#206;
        {                                 
                buf=TPAD_Get_Val();
                delay_ms(10);            
        }                                    
        for(i=0;i<9;i++)//&#197;&#197;Dò
        {
                for(j=i+1;j<10;j++)
                {
                        if(buf>buf[j])//éyDò&#197;&#197;áD
                        {
                                temp=buf;
                                buf=buf[j];
                                buf[j]=temp;
                        }
                }
        }
        temp=0;
        for(i=2;i<8;i++)temp+=buf;//è&#161;&#214;D&#188;&#228;μ&#196;6&#184;&#246;êy&#190;Y&#189;&#248;DD&#198;&#189;&#190;ù
        tpad_default_val=temp/6;
        printf("tpad_default_val:%d\r\n",tpad_default_val);       
        if(tpad_default_val>TPAD_ARR_MAX_VAL/2)return 1;//3&#245;ê&#188;&#187;ˉó&#246;μ&#189;3&#172;1yTPAD_ARR_MAX_VAL/2μ&#196;êy&#214;μ,2&#187;&#213;y3£!
        return 0;                                                                           
}
//&#184;′&#206;&#187;ò&#187;′&#206;
void TPAD_Reset(void)
{

                GPIO_InitTypeDef  GPIO_InitStructure;
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         //ê1&#196;üPA&#182;&#203;&#191;úê±&#214;ó
        //éè&#214;&#195;GPIOA.0&#206;aí&#198;íìê13&#246;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                                 //PA0 &#182;&#203;&#191;ú&#197;&#228;&#214;&#195;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //í&#198;íìê&#228;3&#246;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOA,GPIO_Pin_2);                                                 //PA.0ê&#228;3&#246;0,·&#197;μ&#231;

        delay_ms(5);

        TIM_SetCounter(TIM2,0);                //1é0
        TIM_ClearITPendingBit(TIM2, TIM_IT_CC3|TIM_IT_Update); //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;
        //éè&#214;&#195;GPIOA.0&#206;a&#184;&#161;&#191;&#213;ê&#228;è&#235;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;         //&#184;&#161;&#191;&#213;ê&#228;è&#235;
        GPIO_Init(GPIOA, &GPIO_InitStructure);


}
//μ&#195;μ&#189;&#182;¨ê±&#198;÷2&#182;&#187;&#241;&#214;μ
//è&#231;1&#251;3&#172;ê±,&#212;ò&#214;±&#189;ó·μ&#187;&#216;&#182;¨ê±&#198;÷μ&#196;&#188;&#198;êy&#214;μ.
u16 TPAD_Get_Val(void)
{                                  
        TPAD_Reset();
        while(TIM_GetFlagStatus(TIM2, TIM_IT_CC3) == RESET)//μè′y2&#182;&#187;&#241;é&#207;éy&#209;&#216;
        {
                if(TIM_GetCounter(TIM2)>TPAD_ARR_MAX_VAL-500)return TIM_GetCounter(TIM2);//3&#172;ê±á&#203;,&#214;±&#189;ó·μ&#187;&#216;CNTμ&#196;&#214;μ
        };       
        return TIM_GetCapture2(TIM2);          
}          
//&#182;áè&#161;n′&#206;,è&#161;×&#238;′ó&#214;μ
//n£oá&#172;D&#248;&#187;&#241;è&#161;μ&#196;′&#206;êy
//·μ&#187;&#216;&#214;μ£on′&#206;&#182;áêyà&#239;&#195;&#230;&#182;áμ&#189;μ&#196;×&#238;′ó&#182;áêy&#214;μ
u16 TPAD_Get_MaxVal(u8 n)
{
        u16 temp=0;
        u16 res=0;
        while(n--)
        {
                temp=TPAD_Get_Val();//μ&#195;μ&#189;ò&#187;′&#206;&#214;μ
                if(temp>res)res=temp;
        };
        return res;
}  
//é¨&#195;è′¥&#195;t°′&#188;ü
//mode:0,2&#187;&#214;§3&#214;á&#172;D&#248;′¥·¢(°′&#207;&#194;ò&#187;′&#206;±&#216;D&#235;&#203;é&#191;a2&#197;&#196;ü°′&#207;&#194;ò&#187;′&#206;);1,&#214;§3&#214;á&#172;D&#248;′¥·¢(&#191;éò&#212;ò&#187;&#214;±°′&#207;&#194;)
//·μ&#187;&#216;&#214;μ:0,&#195;&#187;óD°′&#207;&#194;;1,óD°′&#207;&#194;;                                                                                  
#define TPAD_GATE_VAL         1        //′¥&#195;tμ&#196;&#195;&#197;&#207;T&#214;μ,ò2&#190;íê&#199;±&#216;D&#235;′óóútpad_default_val+TPAD_GATE_VAL,2&#197;è&#207;&#206;aê&#199;óDD§′¥&#195;t.
u8 TPAD_Scan(u8 mode)
{
        static u8 keyen=0;        //0,&#191;éò&#212;&#191;aê&#188;&#188;ì2a;>0,&#187;12&#187;&#196;ü&#191;aê&#188;&#188;ì2a         
        u8 res=0;
        u8 sample=3;                //&#196;&#172;è&#207;2é&#209;ù′&#206;êy&#206;a3′&#206;         
        u16 rval;
        if(mode)
        {
                sample=6;                //&#214;§3&#214;á&#172;°′μ&#196;ê±oò£&#172;éè&#214;&#195;2é&#209;ù′&#206;êy&#206;a6′&#206;
                keyen=0;                //&#214;§3&#214;á&#172;°′          
        }
        rval=TPAD_Get_MaxVal(sample);
        if(rval>(tpad_default_val+TPAD_GATE_VAL))//′óóútpad_default_val+TPAD_GATE_VAL,óDD§
        {                                                         
                if(keyen==0)res=1;                //keyen==0,óDD§
                //printf("r:%d\r\n",rval);                                                                           
                keyen=3;                                //&#214;áéùòa&#212;ù1y3′&#206;&#214;&#174;oó2&#197;&#196;ü°′&#188;üóDD§   
        }
        if(keyen)keyen--;                                                                                                                                                         
        return res;
}       
//&#182;¨ê±&#198;÷2í¨μà1ê&#228;è&#235;2&#182;&#187;&#241;&#197;&#228;&#214;&#195;
void TIM5_CH2_Cap_Init(u16 arr,u16 psc)
{
        //CH3 -- PA2
                GPIO_InitTypeDef  GPIO_InitStructure;
           TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_ICInitTypeDef  TIM2_ICInitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);         //ê1&#196;üTIM5ê±&#214;ó
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         //ê1&#196;üPA&#182;&#203;&#191;úê±&#214;ó
        //éè&#214;&#195;GPIOA.0&#206;a&#184;&#161;&#191;&#213;ê&#228;è&#235;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                                 //PA1 &#182;&#203;&#191;ú&#197;&#228;&#214;&#195;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //&#203;ù&#182;è50MHz
           GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;         //&#184;&#161;&#191;&#213;ê&#228;è&#235;
        GPIO_Init(GPIOA, &GPIO_InitStructure);         //éè&#214;&#195;&#206;a&#184;&#161;&#191;&#213;ê&#228;è&#235;

           //3&#245;ê&#188;&#187;ˉTIM5  
        TIM_TimeBaseStructure.TIM_Period = arr; //éè&#182;¨&#188;&#198;êy&#198;÷×&#212;&#182;ˉ&#214;&#216;×°&#214;μ   
        TIM_TimeBaseStructure.TIM_Prescaler =psc;         //&#212;¤·&#214;&#198;μ&#198;÷           
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //éè&#214;&#195;ê±&#214;ó·&#214;&#184;&#238;:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM&#207;òé&#207;&#188;&#198;êy&#196;£ê&#189;
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //&#184;ù&#190;YTIM_TimeBaseInitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉTIMxμ&#196;ê±&#188;&#228;&#187;ùêyμ¥&#206;&#187;
        //3&#245;ê&#188;&#187;ˉí¨μà2
          TIM2_ICInitStructure.TIM_Channel = TIM_Channel_3; //CC1S=01         &#209;&#161;&#212;&#241;ê&#228;è&#235;&#182;&#203; IC2ó3é&#228;μ&#189;TI5é&#207;
          TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //é&#207;éy&#209;&#216;2&#182;&#187;&#241;
          TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
          TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //&#197;&#228;&#214;&#195;ê&#228;è&#235;·&#214;&#198;μ,2&#187;·&#214;&#198;μ
          TIM2_ICInitStructure.TIM_ICFilter = 0x03;//IC2F=0011 &#197;&#228;&#214;&#195;ê&#228;è&#235;&#194;&#203;2¨&#198;÷ 8&#184;&#246;&#182;¨ê±&#198;÷ê±&#214;ó&#214;ü&#198;ú&#194;&#203;2¨
          TIM_ICInit(TIM2, &TIM2_ICInitStructure);//3&#245;ê&#188;&#187;ˉI5 IC2

    TIM_Cmd(TIM2,ENABLE );         //ê1&#196;ü&#182;¨ê±&#198;÷5
}




#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "tpad.h"


/********************************
ALIENTEK&#213;&#189;&#189;¢STM32&#191;a·¢°&#229;êμ&#209;é4
′&#174;&#191;úêμ&#209;é
&#188;&#188;ê&#245;&#214;§3&#214;£owww.openedv.com
ì&#212;±|μê&#198;ì£ohttp://eboard.taobao.com
1&#216;×¢&#206;¢D&#197;1&#171;&#214;ú&#198;&#189;ì¨&#206;¢D&#197;o&#197;£o"&#213;yμ&#227;&#212;-×ó"£&#172;&#195;a·&#209;&#187;&#241;è&#161;STM32×êá&#207;&#161;£
1&#227;&#214;YêDD&#199;òíμ&#231;×ó&#191;&#198;&#188;&#188;óD&#207;T1&#171;&#203;&#190;  
×÷&#213;&#223;£o&#213;yμ&#227;&#212;-×ó @ALIENTEK
********************************/


int main(void)
{               
        u16 t;
        u16 a;
        u16 *b;
        a=*b;
        a=1;
        delay_init();                     //&#209;óê±oˉêy3&#245;ê&#188;&#187;ˉ          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //éè&#214;&#195;NVIC&#214;D&#182;&#207;·&#214;×é2:2&#206;&#187;&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;£&#172;2&#206;&#187;&#207;ìó|ó&#197;&#207;è&#188;&#182;
        uart_init(115200);         //′&#174;&#191;ú3&#245;ê&#188;&#187;ˉ&#206;a115200
        TPAD_Init(6);                        //3&#245;ê&#188;&#187;ˉ′¥&#195;t°′&#188;ü

        while(1)
        {
                if(TPAD_Scan(0))        //3é1|2&#182;&#187;&#241;μ&#189;á&#203;ò&#187;′&#206;é&#207;éy&#209;&#216;(′&#203;oˉêy&#214;′DDê±&#188;&#228;&#214;áéù15ms)
                {
                        printf("1");
                       
                }
                        delay_ms(10);   
                }
        }         











正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2014-4-1
在线时间
1 小时
 楼主| 发表于 2016-1-4 10:57:28 | 显示全部楼层
这里的是通道3的初始化设置,还是不成功。串口返回的 空载情况下的充电时间计数均为0.
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2014-4-1
在线时间
1 小时
 楼主| 发表于 2016-1-4 10:58:25 | 显示全部楼层
朋友们,请教下,这是什么原因啊~~苦恼了好几天了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 21:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表