【STM32F4】HAL库 CubeMX(九)--------定时器输入捕获实验
前言
上一篇,我们介绍了 STM32F4 的通用定时器作为 PWM 输出的使用方法,这一篇,我们将向大家介绍通用定时器作为输入捕获的使用。在本章中,我们将用 TIM5 的通道 1(PA0)来做输入捕获,捕获 PA0 上高电平的脉宽(用 KEY_UP 按键输入高电平),通过串口打印高电平脉宽时间。
一、输入捕获是什么?
输入捕获模式可以用来测量脉冲宽度或者测量频率。(原理方面不做过多讲解,需要则可以查看STM32F4开发指南库函数版本本节知识,我们开始配置)
二、输入捕获实验
1.功能配置
1、根据库函数本实验是以定时器5的CH1为例,在功能选择区选择TIM5。
2、根据库函数配置,选择对应的参数
3、设置串口,接收数据。
4、采用LED0作为实验提示。
2.时钟配置
RCC时钟配置如前文一样(此处一般情况是不变的)。
【STM32F4】HAL库 CubeMX(一)--------创建工程(点亮LED)
3.生成代码
1、串口代码中,定义printf和scanf。此处参看【STM32F4】HAL库 CubeMX(三)--------串口实验
2、此处虽然改定时器32位,数据范围比较宽广,但是为了适应更加多的场合,我们采用宁外一种方式,记录溢出中断次数。(请注意溢出中断和捕获中断是两个不同的中断回调函数)
uint32_t TIM5CH1_CAPTURE_STA,TIM5CH1_CAPTURE_VAL;
uint32_t high_time;
HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_1);
if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获第一次高电平
{
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);//获取一次翻转一次LED
high_time=TIM5CH1_CAPTURE_STA&0X3F;
high_time*=0xFFFFFFFF; //溢出时间总和
high_time+=TIM5CH1_CAPTURE_VAL; //得到总的高电平时间
TIM5CH1_CAPTURE_STA=0;
printf("%d us\n",high_time);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM5)
{
if((TIM5CH1_CAPTURE_STA & 0x80) == 0)
{
if(TIM5CH1_CAPTURE_STA & 0x40)
{
if((TIM5CH1_CAPTURE_STA & 0x3f) == 0x3f)
{
TIM5CH1_CAPTURE_STA |= 0x80;
TIM5CH1_CAPTURE_VAL = 0XFFFFFFFF;
}else TIM5CH1_CAPTURE_STA++;
}
}
}
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if ( (TIM5CH1_CAPTURE_STA & 0x80) == 0 )
{
if (TIM5CH1_CAPTURE_STA & 0x40)
{
TIM5CH1_CAPTURE_STA |= 0x80;
TIM5CH1_CAPTURE_VAL = HAL_TIM_ReadCapturedValue(&htim5, TIM_CHANNEL_1);
TIM_RESET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_1);
TIM_SET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_1, TIM_ICPOLARITY_RISING);
}
else
{
TIM5CH1_CAPTURE_STA = 0;
TIM5CH1_CAPTURE_VAL = 0;
TIM5CH1_CAPTURE_STA |= 0x40;
__HAL_TIM_DISABLE(&htim5);
__HAL_TIM_SET_COUNTER(&htim5,0);
TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1);
TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);
__HAL_TIM_ENABLE(&htim5);
}
}
}
代码注释就不写了(太难打了),大家可以对应库函数实验代码进行理解。有问题也可以在评论里提出来。一起解决,如果以上有误请提出来,谢谢
总结
输入捕获就存在两种中断。在定时器中断我们也具体说过两个的不同。
到此为止,我们大概了解了32的一些基本的操作,后面我们将一一推出模块的调试和实验。
上一篇: 自上而下渐显图片的CSS3实现
下一篇: 朗姆酒好喝吗?你觉得不好喝别人觉得好喝