본문 바로가기
  • SpokeHouse
STM32/STM32C

GetTick 함수 활용 - Non blocking Delay

by SpokeHouse 2024. 4. 29.
728x90
728x90

안녕하세요 스포크하우스 오토입니다.

이번시간에는 시스템 Tick을 활용하여 시스템을 Non blocking  하면서 딜레이처럼 사용할 수 있는 타이머? 딜레이? 를 포스팅하겠습니다.

지난번 GPIO 컨트롤을 활용하여 LED를 on/off하였는데 그걸 활용하여 실습하겠습니다.

2024.04.24 - [STM32/STM32C] - STM32C031 - GPIO control

 

STM32C031 - GPIO control

안녕하세요 (주)스포크하우스 오토입니다.이번에는 STM32C031 사용하여 GPIO 컨트롤 하는 방법에 대해 포스팅해보겠습니다.앞으로 ADC, PWM, i2c, spi 등 mcu 관련 포스팅을 전체적으로 진행해보겠습니다

spokehouse.tistory.com

못보신분들은 위에 포스팅 참고해주시면 될것같습니다.

보통의 경우 led를 켜고 끄기 위해서

HAL_Delay(1000);
 

요런 딜레이를 넣고 GPIO를 토글해줍니다.

HAL_DELAY(1000);

...
...
...

그렇게 되면 딜레이함수 밑에 있는 모든 코드는 1초 동안 동작을 못하고 말그대로 딜레이가 걸리게되죠

LED만 켜고 끄는 간단한 코드에서는 문제가 없지만 여러가지 기능을 수행해야하는 코드가 되면 곤란한일이 발생하기 시작합니다.

인터럽트 등을 활용하여 중간에 필요한 부분으로 빼올수는 있겠지만 전체적으로 보면 딜레이가 한개 두개 모여서 커지죠..

그래서 시스템 클럭에 관련된 tick이라는 것을 활용하여 딜레이처럼 동작하지만 전체 시스템에는 지연이 없는 간단한 방법이 있어서 포스팅에 공유합니다.

(정확한 시간텀으로 동작해야하는 부분에는 별도로 timer 만들어서 쓰셔야합니다. 해당 코드는 인디게이터 led 깜박임 같은 간단한 부분에 적용하면 좋습니다.)

u_int32_t pretime = 0;

if((Get_millis()-pretime) >= 500)
{
  gpio_control(ledport, ledpin, _USE_AP_GPIO_TGL);    
  pretime = Get_millis();
}

 

처음에 pretime이라는 변수 선언해주고 조건문에 표기되어있는 것과 같이 비교 연산하여 led 토글해주는 코드입니다.

uint32_t Get_millis(void)
{
  return HAL_GetTick();
}

Get_millis() 함수는 위와 같이 되어있구요 

전체적으로 간단합니다 시스템 Tick 가져오고 현재랑 비교해서 tick이 500보다 크면  GPIO 토글해주는 코드입니다.

그러면 다음을 위해 pretime을 현재 tick으로 바꿔주시구요.

이렇게 하면 대략적으로 500미리 타이머처럼 동작합니다. ( 48Mhz 기준) 시스템 클럭에 따라서 해당 Tick의 증감이 달라지게됩니다.

사용하시는 MCU 스펙 보시고 조건문에 숫자는 변경하시면 됩니다.

인디게이터 LED컨트롤 때문에 타이머 하나 쓰고 하시는것보다는 간편하게 쓰실 수 있을거라고 생각합니다.

그럼 이만 오늘도 대단히 맛있는것 많이 드시고 들어가세요!^^

728x90
728x90

'STM32 > STM32C' 카테고리의 다른 글

STM32C031 - GPIO control  (0) 2024.04.24

댓글