新手上路
- 积分
- 46
- 金钱
- 46
- 注册时间
- 2019-5-15
- 在线时间
- 18 小时
|

楼主 |
发表于 2020-5-13 15:12:42
|
显示全部楼层
#include "input.h"
#include "oled.h"
#include "gizwits_product.h"
extern dataPoint_t currentDataPoint;
TIM_HandleTypeDef TIM5_Handler; //定时器5句柄
//定时器5通道1输入捕获配置
//arr:自动重装值(TIM2,TIM5是32位的!!)
//psc:时钟预分频数
void TIM5_CH1_Cap_Init(u32 arr,u16 psc)
{
TIM_IC_InitTypeDef TIM5_CH1Config;
TIM5_Handler.Instance=TIM5; //通用定时器5
TIM5_Handler.Init.Prescaler=psc; //分频系数
TIM5_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM5_Handler.Init.Period=arr; //自动装载值
TIM5_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频银子
HAL_TIM_IC_Init(&TIM5_Handler);//初始化输入捕获时基参数
TIM5_CH1Config.ICPolarity=TIM_ICPOLARITY_RISING; //上升沿捕获
TIM5_CH1Config.ICSelection=TIM_ICSELECTION_DIRECTTI;//映射到TI1上
TIM5_CH1Config.ICPrescaler=TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM5_CH1Config.ICFilter=0; //配置输入滤波器,不滤波
HAL_TIM_IC_ConfigChannel(&TIM5_Handler,&TIM5_CH1Config,TIM_CHANNEL_1);//配置TIM5通道1
HAL_TIM_IC_Start_IT(&TIM5_Handler,TIM_CHANNEL_1); //开启TIM5的捕获通道1,并且开启捕获中断
__HAL_TIM_ENABLE_IT(&TIM5_Handler,TIM_IT_UPDATE); //使能更新中断
}
//定时器5底层驱动,时钟使能,引脚配置
//此函数会被HAL_TIM_IC_Init()调用
//htim:定时器5句柄
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{
GPIO_InitTypeDef GPIO_Initure;
if(htim->Instance == TIM5)
{
__HAL_RCC_TIM5_CLK_ENABLE(); //使能TIM5时钟
__HAL_RCC_GPIOH_CLK_ENABLE(); //开启GPIOH时钟
GPIO_Initure.Pin=GPIO_PIN_10; //PH10
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //输入
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Alternate=GPIO_AF2_TIM5; //PH10复用为TIM5通道1
HAL_GPIO_Init(GPIOH,&GPIO_Initure);
HAL_NVIC_SetPriority(TIM5_IRQn,2,0); //设置中断优先级,抢占优先级2,子优先级0
HAL_NVIC_EnableIRQ(TIM5_IRQn); //开启ITM5中断通道
}
}
//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到低电平;1,已经捕获到低电平了.
//[5:0]:捕获低电平后溢出的次数(对于32位定时器来说,1us计数器加1,溢出时间:4294秒)
u8 TIM5CH1_CAPTURE_STA=0; //输入捕获状态
u32 TIM5CH1_CAPTURE_VAL=0; //输入捕获值(TIM2/TIM5是32位)
u16 TIM5_CH1_CAPTURE_Times=0; //溢出时间
extern u32 speed;
extern u8 wifi_sta;
//定时器5中断服务函数
void TIM5_IRQHandler(void)
{
if(__HAL_TIM_GET_FLAG(&TIM5_Handler, TIM_FLAG_UPDATE) != RESET)
{
if(__HAL_TIM_GET_IT_SOURCE(&TIM5_Handler, TIM_IT_UPDATE) !=RESET)
{
__HAL_TIM_CLEAR_IT(&TIM5_Handler, TIM_IT_UPDATE);
TIM5_CH1_CAPTURE_Times++; //计数器溢出次数+1
if(TIM5_CH1_CAPTURE_Times>=1000) //如果计时到达1秒
{
TIM5CH1_CAPTURE_STA=1; //建立测速有效标志
if(TIM5CH1_CAPTURE_STA==1) //如果成功捕获
{
speed=TIM5CH1_CAPTURE_VAL*20; //计算每分钟转速
if(wifi_sta)
{
//OLED_ShowString(0,40,"speed",12);
//printf("转速:%d\r\n",speed);
//OLED_ShowNum(50,40,speed,6,12);
//OLED_Refresh_Gram();//更新显示到OLED
}
currentDataPoint.valueFan_Speed = speed;
TIM5CH1_CAPTURE_STA=0; //准备下一次测速
TIM5CH1_CAPTURE_VAL=0;
}
TIM5_CH1_CAPTURE_Times=0; //清0,准备下一次计时
}
}
}
/* Capture compare 1 event */
if(__HAL_TIM_GET_FLAG(&TIM5_Handler, TIM_FLAG_CC1) != RESET)
{
if(__HAL_TIM_GET_IT_SOURCE(&TIM5_Handler, TIM_IT_CC1) !=RESET)
{
{
__HAL_TIM_CLEAR_IT(&TIM5_Handler, TIM_IT_CC1);
/* Input capture event */
if((TIM5_Handler.Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00)
{
if(TIM5CH1_CAPTURE_STA & 0x40) //如果捕获到低电平(下降沿)
{
TIM5CH1_CAPTURE_STA&=0xdf; //建立“捕获到低电平”标志
TIM5CH1_CAPTURE_VAL++; //旋转次数加1
__HAL_TIM_DISABLE(&TIM5_Handler); //关闭定时器5
TIM_RESET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1); //一定要先清除原来的设置!!
TIM_SET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);//配置TIM5通道1上升沿捕获
__HAL_TIM_ENABLE(&TIM5_Handler); //使能定时器5
}
else //如果捕获到高电平(上升沿)
{
TIM5CH1_CAPTURE_STA|=0x40; //建立“捕获到高电平”标志
__HAL_TIM_DISABLE(&TIM5_Handler); //关闭定时器5
TIM_RESET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1); //一定要先清除原来的设置!!
TIM_SET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);//配置TIM5通道1下降沿捕获
__HAL_TIM_ENABLE(&TIM5_Handler);//使能定时器5
}
}
}
}
}
//HAL_TIM_IRQHandler(&TIM5_Handler);//定时器共用处理函数
}
|
|