STM32 定時器控制微秒延時

定時器控制微秒延時

void MX_TIM3_Init(void)
{
  TIM_SlaveConfigTypeDef sSlaveConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 16-1;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 10000;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_DISABLE;
  sSlaveConfig.InputTrigger = TIM_TS_ITR0;
  if (HAL_TIM_SlaveConfigSynchro(&htim3, &sSlaveConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

}

主程序

//main.c
extern uint64_t microTick;
//初始化
 if (HAL_TIM_Base_Start_IT(&htim3) != HAL_OK)
{
	Error_Handler();
}

uint64_t getMicroSeconds()
{
    return microTick + (htim3.Instance->CNT);
}

void delayMicroseconds(uint32_t micros)
{
    uint64_t tickStart = getMicroSeconds();
    while ((getMicroSeconds() - tickStart) < micros)
    {
    }
}

int main(void)
{
	while (1)
  	{
		led_on();
		delayMicroseconds(1000000);
		led_off();
		delayMicroseconds(1000000);
	}
}
//stm32f0xx_it.c
extern TIM_HandleTypeDef htim3;
volatile uint64_t microTick = 0;

void TIM3_IRQHandler(void)
{
  	HAL_TIM_IRQHandler(&htim3);
	microTick += 10000;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章