본문 바로가기

임베디드/STM32

stm32f asm("nop")을 활용한 MicroSecond Delay 만들기

systick을 활용한 micro delay는... Hal_Delay();함수와 같이 사용했을 때 코드가 실행중 멈춰 버렸기에...

윤덕용 교수님의 책 'STM32F103 정복'에서 사용한 방법을 따라 해보았다.

 

내가 사용한 칩은 STM32F423ZHT 이며, 오실로 스코프로 찍어가면서 적당한 타이밍에 맞추어서 asm("NOP");을 추가 했다. 코드는 하기와 같다.

 

void us_Delay(uint32_t delay_us_time) {
register uint32_t i;
for (i = 0; i < delay_us_time; i++) {
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP"); //10
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP"); //20
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP"); //30
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP"); //40
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP"); //50
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP"); //60
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP"); //70
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP"); //80
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
}
}

 

단, 적당히 타협을 해서 사용해야 한다...

정확한 타이밍을 맞추려 여러 시도를 해보았지만...

us_Delay(1); 일 때 1us를 맞추면, us_Delay(1000)일 때 오차가 있고,

us_Delay(5); 일 때 5us를 맞추면, 또한 다른 인자값을 입력했을 때 시간의 오차가 조금씩 생긴다..

 

atmega의 경우 각 명령어를 실행할때 얼만큼의 사이클을 사용하는지 정해져 있으나..

stm32의 경우 고속으로 처리하기에 명령어의 실행 사이클을 정확히 알 수 없다고... (내가 정확히 이해한건진 모르겠지만..ㅎㅎ;;)

그래서 정확한 시간을 맞추기 위한 행동은 약간 시간 낭비처럼 느껴졌다...

 

어떤 사람은 us_Delay 함수를 만들기 위해 타이머 인터럽트를 사용하는 듯 하나...

나는 이걸로 쓰기로 했다.

 

정확한 딜레이 타임을 만들 이유가 없다 판단했다..

i2c 통신할 때 적당한 딜레이만 주면 되는데 us_delay 때문에 너무 많은 시간을 허비했다.

'임베디드 > STM32' 카테고리의 다른 글

STM32F I2C 통신 _ MCP3426 ADC  (0) 2022.10.24
stm32f Systick을 활용한 MicroSecond Delay 만들기  (0) 2022.10.22