STM32CubeMX+寄存器(REGISTER)实现TIM定时计数器准确定时方法
## 方法一
- 与普通配置CubeMX定时器步骤一样
- 在stm32f1xx_it.c文件中找到TIMx对应的定时中断函数(这里用TIM3演示)void TIM3_IRQHandler(void),并在 HAL_TIM_IRQHandler(&htim3);函数中找到对应判断定时中断if判断语句 /* TIM Update event */复制回void TIM3_IRQHandler(void),再将其注释掉。
中断记得勾选中断?
void TIM3_IRQHandler(void)
{
TIM_HandleTypeDef *htim = &htim3;
if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET)
{
if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) != RESET)
{
__HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
htim->PeriodElapsedCallback(htim);
#else
HAL_TIM_PeriodElapsedCallback(htim);
#endif
}
}
}
- 再重定义 *void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef htim) 函数
uint32_t i=0,time=0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim ->Instance == TIM3)
{ __HAL_TIM_CLEAR_FLAG(&htim3,TIM_FLAG_UPDATE);
printf("%d \t",TIM3_num++);
}
}
该方法可以准确1~2mm左右的时间
STM32CubeMX+寄存器实现准确定时中断
## 方法二
-
与上面配置普通定时中断一致 -
找到对应中断响应函数void TIM2_IRQHandler(void) -
uint32_t NUM_register; void TIM2_IRQHandler(void) { /* USER CODE BEGIN TIM2_IRQn 0 */ if(TIM2->SR & TIM_SR_UIF) { /* 清除更新中断 / TIM2->SR &= ~ TIM_SR_UIF; / 定时时间到达需要做的处理 */ //verify NUM_register = HAL_GetTick(); printf("%dmm\n",NUM_register); } -
刷新TIM配置函数
void capture_ctr_refresh_timer(uint16_t new_period)
{
TIM2->CR1&= ~TIM_CR1_CEN;
TIM2->CNT = 7199;
TIM2->ARR = new_period;
TIM2->EGR|= TIM_EGR_UG;
TIM2->CR1|= TIM_CR1_CEN;
}
该函数在cubemx生成的TIM初始化之后再调用一遍并赋予其period的值。
|