使用hal库编辑的时候,要学会使用普通的库编程的方法,这样可以用hal库来初始化引脚,配置寄存器,这样hal库的应用方法更加灵活。
经过硬石资料可知Cube编程生成的定时器输入捕获寄存器配置代码十分完善,
以下为主函数main.c中的补充函数,十分完善:
**void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
strCapture .usPeriod ++;
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
TIM_IC_InitTypeDef sConfigIC;
if ( strCapture .ucStartFlag == 0 )
{
// LED1_TOGGLE;
__HAL_TIM_SET_COUNTER(htim,0);
strCapture .usPeriod = 0;
strCapture .usCtr = 0;
sConfigIC.ICPolarity = GENERAL_TIM_END_ICPolarity;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0;
HAL_TIM_IC_ConfigChannel(&htim5, &sConfigIC, GENERAL_TIM_CHANNELx);
__HAL_TIM_CLEAR_IT(htim, GENERAL_TIM_IT_CCx);
HAL_TIM_IC_Start_IT(&htim5,GENERAL_TIM_CHANNELx);
strCapture .ucStartFlag = 1;
}
else
{
// LED1_TOGGLE;
strCapture .usCtr = HAL_TIM_ReadCapturedValue(&htim5,GENERAL_TIM_CHANNELx);
sConfigIC.ICPolarity = GENERAL_TIM_STRAT_ICPolarity;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0;
HAL_TIM_IC_ConfigChannel(&htim5, &sConfigIC, GENERAL_TIM_CHANNELx);
__HAL_TIM_CLEAR_IT(htim, GENERAL_TIM_IT_CCx);
HAL_TIM_IC_Start_IT(&htim5,GENERAL_TIM_CHANNELx);
strCapture .ucStartFlag = 0;
strCapture .ucFinishFlag = 1;
}
}**
在int main中的代码补充如下:
/ USER CODE END 2 /
/ Infinite loop /
/ USER CODE BEGIN WHILE /
ulTmrClk = HAL_RCC_GetHCLKFreq()/GENERAL_TIM_PRESCALER;
/ 启动定时器 /
HAL_TIM_Base_Start_IT(&htim5);
/ 启动定时器通道输入捕获并开启中断 /
HAL_TIM_IC_Start_IT(&htim5,GENERAL_TIM_CHANNELx);
以下为tim.h中的代码补充
/* USER CODE BEGIN Private defines
typedef struct
{
uint8_t ucFinishFlag;
uint8_t ucStartFlag;
uint16_t usCtr;
uint16_t usPeriod;
}STRUCT_CAPTURE;
#define GENERAL_TIMx TIM5
#define GENERAL_TIM_RCC_CLK_ENABLE() __HAL_RCC_TIM5_CLK_ENABLE()
#define GENERAL_TIM_RCC_CLK_DISABLE() __HAL_RCC_TIM5_CLK_DISABLE()
#define GENERAL_TIM_GPIO_RCC_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE();
#define GENERAL_TIM_CHANNELx TIM_CHANNEL_1
#define GENERAL_TIM_IT_CCx TIM_IT_CC1
#define GENERAL_TIM_IRQn TIM5_IRQn
#define GENERAL_TIM_IRQHANDLER TIM5_IRQHandler
#define KEY1_RCC_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define KEY1_GPIO_PIN GPIO_PIN_0
#define KEY1_GPIO GPIOA
//
#define GENERAL_TIM_PERIOD 0xFFFF
#define GENERAL_TIM_STRAT_ICPolarity TIM_INPUTCHANNELPOLARITY_RISING //
#define GENERAL_TIM_END_ICPolarity
以下为Cube中配置的图片:
芯片主频依然是72M
定时器5具体配置如下
注意事项:在使用定时器输入捕获的时候一定要使能定时器中断,并且对于脉冲宽度来书只需要打开输入捕获的一个功能即可,添加函数的时候一定要注意,不要丢下任何东西。而且在主函数中一定要使能定时器输入捕获中断开启函数,否贼定时器不能正常使用。
输入捕获测量脉冲时间的主要应用模块是超声波模块,经过实验发现超声波Trig引脚(距离测量使能引脚)使能时间不要过长,规定要求是大于等于10us使能,但是经过测试如果使能时间达到1ms,模块就不能正常使用,因此使能时间最好是20us左右:
超声波采集代码如下,注意一定要初始化定时器中断,定时器输入捕获通道中断开启,GPIO口复位,超声波初始化函数如下所示:
主函数中的定时器中断输入捕获回调函数: