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 |