STM32 MicroSecond 함수 (us)

DongHee Lim·2022년 4월 13일
0

STM32 함수

목록 보기
2/2

HAL_Delay()는 ms 단위이다.

그래서, us 신호를 만드는데 사용할 수 없다.

그 때 필요한 Delay_us 함수를 만드는 것이다.

혹시, uint32_t TYPE 에러가 뜬다면
#include "stdint.h" 를 추가해준다.

uint32_t DWT_Delay_Init(void)
{
  /* Disable TRC */
  CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk; // ~0x01000000;
  /* Enable TRC */
  CoreDebug->DEMCR |=  CoreDebug_DEMCR_TRCENA_Msk; // 0x01000000;

  /* Disable clock cycle counter */
  DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; //~0x00000001;
  /* Enable  clock cycle counter */
  DWT->CTRL |=  DWT_CTRL_CYCCNTENA_Msk; //0x00000001;

  /* Reset the clock cycle counter value */
  DWT->CYCCNT = 0;

     /* 3 NO OPERATION instructions */
  __ASM volatile ("NOP");
  __ASM volatile ("NOP");
  __ASM volatile ("NOP");

  /* Check if clock cycle counter has started */
  if(DWT->CYCCNT)
  {
 	return 0; /*clock cycle counter started*/
  }
  else
  {
  	return 1; /*clock cycle counter not started*/
  }
  
}

void DWT_Delay_us(volatile uint32_t microseconds)
{
  uint32_t clk_cycle_start = DWT->CYCCNT;

  /* Go to number of cycles for system */
  microseconds *= (HAL_RCC_GetHCLKFreq() / 1000000);

  /* Delay till end */
  while ((DWT->CYCCNT - clk_cycle_start) < microseconds);
}

profile
하고 싶은 것, 소유하고 싶은 것, 좋아하는 것

0개의 댓글