본문 바로가기
임베디드 개발/STM32 (ARM Cortex-M)

STM32 ] microseconds 딜레이 함수 만들기

by eteo 2024. 6. 4.

 

 

 

 

사용보드 : STM32F429ZI

 

 

먼저 타이머를 사용할건데 16-bit 타이머 중에 고르면 충분하다. 65.535ms까지 제어가 되는데 그 이상의 지연이 필요하면 HAL_Delay() 함수를 쓰면 되니까 말이다.

여기선 TIM1을 쓴다. 

 

 

 

datasheet p35

 

 

 

 

 

 

TIM1는 APB2에서 클락을 공급받는다.

 

datasheet p20

 

APB2 timer clock은 180MHz로 설정되어있다.

 

 

 

 

 

Prescaler 값은 180-1로 해서 1MHz(주기 1us) 클락을 얻고 Counter Period는 최대값으로 설정한다.

 

 

 

 

다음과 같이 코드를 작성한다.

 

/* USER CODE BEGIN 0 */
void delay_us(uint16_t us)
{
	htim1.Instance->CNT = 0;
	while(htim1.Instance->CNT < us){}
}
/* USER CODE END 0 */
// ...
int main(void)
{
  // ...
  HAL_TIM_Base_Start(&htim1);
  // ...
  while(1) 
  {
    // ...
  }
}

 

 

그리고 GPIO를 토글시키는 테스트코드를 돌려봤는데 10kHz 신호를 발생시키면 스코프에 9.93kHz로 찍히고 50kHz를 발생시키면 스코프에 46.6kHz로 찍혔다.

 

주기적으로 반복되는 작업을 하기 위해서는 타이머 인터럽트를 사용하는게 낫고 단순히 us단위의 시간지연을 발생할 필요가 있는 경우 사용할 수 있을 것 같다.