问题:本程序是在miniSTM32开发板上实验的,一个按键key0一端是与PA.13相接,另一端是接地。PA.12为TIM1_ETR通道,用杜邦线连接PA.13和PA.12,则通过按键key0,将脉冲输入到PA.12(TIM1_ETR通道),给TIM1_CNT计数器计数,能计数。但是我设置的PA.12脚是下拉,也就是当没有按键下去时,PA.12应该保持低电平,而设置ETP时,设置为ETP=0,即上升沿有效,但是key0的另一端是接地的,不可能产生高电平或上升沿,怎么可能会计数呢?试验了下,却能计数。
当我把按键换了另一个按键WK_UP时,不能计数。这个按键的一端是接PA.0,另一端是接3.3V电源,用杜邦线接PA.0和PA.12,即把按键WK_UP按键的脉冲通过PA.0,杜邦线送到PA.12(TIM1_ETR通道里),PA.12设置为下拉,当没有WK_UP按键下去时,为低电平,当按键下去,会产生高电平或上升沿,为有效电平,因为ETP=0,但是试验了,却不能计数。
求解释原因。。。。
void tim1ETR_init(u16 arr,u16 psc)
{
RCC->APB2ENR|=1<<11; //设置TIM1时钟
RCC->APB2ENR|=1<<2; //PA时钟开启
GPIOA->CRH&=0XFFF0FFFF; //PA12 清除之前设置
GPIOA->CRH|=0X00080000; //PA12 上拉下拉输入
GPIOA->ODR&=0XEFFF; //PA12 下拉
TIM1->SMCR|=1<<14; //ECE=1,即选择外部时钟模式2
TIM1->SMCR&=0X7FFF; //ETP=0,即不反相,上升沿有效,关闭分频器,无滤波器
TIM1->ARR=arr; //设置自动装载寄存器值
TIM1-> SC=psc; //分频器值
/*###中央对齐模式1###*/
TIM1->CR1&=0XFF9F; //清除CMS[1:0]为00
TIM1->CR1|=1<<5; //设置CMS[1:0]=10,即中央对齐模式1
TIM1->CR1|=1; //启动计数器,CEN=1
}
int main(void)
{ u16 f=0,x=0;
Stm32_Clock_Init(9);
uart_init(72,9600);
tim1ETR_init(0X0F,0);
while(1)
{
f=TIM1->CNT;
if(f!=x && !(f==15 && x==0)) //f!=x是防止没按键时,串口一直打印出f的值
//!(f==15 && x==0)是防止f=15时,f和x清零,但在没有继续按键下,TIM1->CNT依旧为15,继续赋值给f,使得一直打印f=15
{
x=f;
printf("f=%d\r\n",f);
if(f==15)
{
f=0;
x=0;
}
}
}
|