double time = 0;
/*
利用tim5测量按键按下的时间
由于TIM5_CH1跟按键一是一起的
TIM5_CH1是PA0
按键1是高电平有效
*/
/*
函数功能:初始化tim5并测量按键1按下的时间长度
*/
void tim5_init(void)
{
RCC->AHB1ENR |= 1 << 0; //使能GPIOA时钟
GPIOA->MODER &= ~(0x3 << 0); //清零
GPIOA->MODER |= (0x2 << 0); //开启复用功能
GPIOA->AFR[0] |= (0x2 << 0); //复用成TIM5_CH1功能
RCC->APB1ENR |= 1 << 5; //使能TIM5时钟
//**************************配置TIM5************************/
TIM5->PSC = 84 - 1; //设置分频值
TIM5->ARR = 10000 - 1; //设置重载值
TIM5->CR1 = 0; //配置CR1相关数据
TIM5->CCMR1 &= ~(0XF << 4); // 无滤波
TIM5->CCER &= ~(0x1 << 1);
TIM5->CCER &= ~(0X1 << 3); //边沿检测设置为高电平有效,与按键对应
TIM5->CCMR1 |= (0X1 << 0); //CC1通道为输入,映射到TI1上
TIM5->CCMR1 &= ~(0X3 <<2); //捕获分频器设置为不分频
TIM5->CCER |= 1 << 0; //使能捕获
//设置中断
TIM5->DIER |= 1 << 1; //使能CC1中断
NVIC_EnableIRQ(TIM5_IRQn);
TIM5->CR1 |= 1 << 0; //开启计数器计数
}
/*
错误:没有进入中断
*/
void TIM5_IRQHandler(void)
{
if(TIM5->SR & 1 << 1) //判断捕获中断标志
{
time = TIM5->CCR1;
printf("%lf
",time);
TIM5->SR = 0; //清除中断标志位
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>