新手上路
- 积分
- 32
- 金钱
- 32
- 注册时间
- 2014-4-1
- 在线时间
- 1 小时
|
我修改了战舰开发板的 触摸按键的代码,然后自己画了板子,出现了一个很奇怪的问题,向各位朋友们求助下!
芯片: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++)//á¬Dø¶áè¡10′Î
{
buf=TPAD_Get_Val();
delay_ms(10);
}
for(i=0;i<9;i++)//ÅÅDò
{
for(j=i+1;j<10;j++)
{
if(buf>buf[j])//éyDòÅÅáD
{
temp=buf;
buf=buf[j];
buf[j]=temp;
}
}
}
temp=0;
for(i=2;i<8;i++)temp+=buf;//è¡ÖD¼äμÄ6¸öêy¾Y½øDDƽ¾ù
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õê¼»ˉóöμ½3¬1yTPAD_ARR_MAX_VAL/2μÄêyÖμ,2»Õy3£!
return 0;
}
//¸′λò»′Î
void TPAD_Reset(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ê1ÄüPA¶Ë¿úê±Öó
//éèÖÃGPIOA.0ÎaíÆíìê13ö
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA0 ¶Ë¿úÅäÖÃ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //íÆíìêä3ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_2); //PA.0êä3ö0,·Åμç
delay_ms(5);
TIM_SetCounter(TIM2,0); //1é0
TIM_ClearITPendingBit(TIM2, TIM_IT_CC3|TIM_IT_Update); //Çå3yÖD¶Ï±êÖ¾
//éèÖÃGPIOA.0Îa¸¡¿Õêäèë
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //¸¡¿Õêäèë
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//μÃμ½¶¨ê±Æ÷2¶»ñÖμ
//èç1û3¬ê±,ÔòÖ±½ó·μ»Ø¶¨ê±Æ÷μļÆêyÖμ.
u16 TPAD_Get_Val(void)
{
TPAD_Reset();
while(TIM_GetFlagStatus(TIM2, TIM_IT_CC3) == RESET)//μè′y2¶»ñéÏéyÑØ
{
if(TIM_GetCounter(TIM2)>TPAD_ARR_MAX_VAL-500)return TIM_GetCounter(TIM2);//3¬ê±áË,Ö±½ó·μ»ØCNTμÄÖμ
};
return TIM_GetCapture2(TIM2);
}
//¶áè¡n′Î,è¡×î′óÖμ
//n£oá¬Dø»ñè¡μÄ′Îêy
//·μ»ØÖμ£on′ζáêyàïÃæ¶áμ½μÄ×î′ó¶áêyÖμ
u16 TPAD_Get_MaxVal(u8 n)
{
u16 temp=0;
u16 res=0;
while(n--)
{
temp=TPAD_Get_Val();//μÃμ½ò»′ÎÖμ
if(temp>res)res=temp;
};
return res;
}
//é¨Ãè′¥Ãt°′¼ü
//mode:0,2»Ö§3Öá¬Dø′¥·¢(°′ÏÂò»′αØDëËé¿a2ÅÄü°′ÏÂò»′Î);1,Ö§3Öá¬Dø′¥·¢(¿éòÔò»Ö±°′ÏÂ)
//·μ»ØÖμ:0,ûóD°′ÏÂ;1,óD°′ÏÂ;
#define TPAD_GATE_VAL 1 //′¥ÃtμÄÃÅÏTÖμ,ò2¾íêDZØDë′óóútpad_default_val+TPAD_GATE_VAL,2ÅèÏÎaêÇóDD§′¥Ãt.
u8 TPAD_Scan(u8 mode)
{
static u8 keyen=0; //0,¿éòÔ¿aê¼¼ì2a;>0,»12»Äü¿aê¼¼ì2a
u8 res=0;
u8 sample=3; //ĬèÏ2éÑù′ÎêyÎa3′Î
u16 rval;
if(mode)
{
sample=6; //Ö§3Öᬰ′μÄê±oò£¬éèÖÃ2éÑù′ÎêyÎa6′Î
keyen=0; //Ö§3Öᬰ′
}
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; //ÖáéùòaÔù1y3′ÎÖ®oó2ÅÄü°′¼üóDD§
}
if(keyen)keyen--;
return res;
}
//¶¨ê±Æ÷2í¨μà1êäèë2¶»ñÅäÖÃ
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ÄüTIM5ê±Öó
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ê1ÄüPA¶Ë¿úê±Öó
//éèÖÃGPIOA.0Îa¸¡¿Õêäèë
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA1 ¶Ë¿úÅäÖÃ
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //Ëù¶è50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //¸¡¿Õêäèë
GPIO_Init(GPIOA, &GPIO_InitStructure); //éèÖÃÎa¸¡¿Õêäèë
//3õê¼»ˉTIM5
TIM_TimeBaseStructure.TIM_Period = arr; //é趨¼ÆêyÆ÷×Ô¶ˉ֨װÖμ
TIM_TimeBaseStructure.TIM_Prescaler =psc; //Ô¤·ÖÆμÆ÷
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //éèÖÃê±Öó·Ö¸î:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòéϼÆêyÄ£ê½
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //¸ù¾YTIM_TimeBaseInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉTIMxμÄê±¼ä»ùêyμ¥λ
//3õê¼»ˉí¨μà2
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_3; //CC1S=01 Ñ¡Ôñêäèë¶Ë IC2ó3éäμ½TI5éÏ
TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //éÏéyÑØ2¶»ñ
TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //ÅäÖÃêäèë·ÖÆμ,2»·ÖÆμ
TIM2_ICInitStructure.TIM_ICFilter = 0x03;//IC2F=0011 ÅäÖÃêäèëÂË2¨Æ÷ 8¸ö¶¨ê±Æ÷ê±ÖóÖüÆúÂË2¨
TIM_ICInit(TIM2, &TIM2_ICInitStructure);//3õê¼»ˉI5 IC2
TIM_Cmd(TIM2,ENABLE ); //ê1Äü¶¨ê±Æ÷5
}
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "tpad.h"
/********************************
ALIENTEKÕ½½¢STM32¿a·¢°åêμÑé4
′®¿úêμÑé
¼¼êõÖ§3Ö£owww.openedv.com
ìÔ±|μêÆì£ohttp://eboard.taobao.com
1Ø×¢Î¢DÅ1«Öúƽì¨Î¢DÅoÅ£o"ÕyμãÔ-×ó"£¬Ãa·Ñ»ñè¡STM32×êáÏ¡£
1ãÖYêDDÇòíμç×ó¿Æ¼¼óDÏT1«Ë¾
×÷ÕߣoÕyμãÔ-×ó @ALIENTEK
********************************/
int main(void)
{
u16 t;
u16 a;
u16 *b;
a=*b;
a=1;
delay_init(); //Ñóê±oˉêy3õê¼»ˉ
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //éèÖÃNVICÖD¶Ï·Ö×é2:2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
uart_init(115200); //′®¿ú3õê¼»ˉÎa115200
TPAD_Init(6); //3õê¼»ˉ′¥Ãt°′¼ü
while(1)
{
if(TPAD_Scan(0)) //3é1|2¶»ñμ½áËò»′ÎéÏéyÑØ(′ËoˉêyÖ′DDê±¼äÖáéù15ms)
{
printf("1");
}
delay_ms(10);
}
}
|
|