HAL드라이버 내에 일정시간동안 지연시켜주는 HAL_Delay 함수가 있습니다.
/**
* @brief This function provides minimum delay (in milliseconds) based
* on variable incremented.
* @note In the default implementation , SysTick timer is the source of time base.
* It is used to generate interrupts at regular time intervals where uwTick
* is incremented.
* @note This function is declared as __weak to be overwritten in case of other
* implementations in user file.
* @param Delay specifies the delay time length, in milliseconds.
* @retval None
*/
__weak void HAL_Delay(uint32_t Delay)
지연 시간은 (Delay + 1)ms입니다.
즉 HAL_Delay(0);을 호출하면 1ms의 딜레이가 발생됩니다.
함수 내부를 보면
__weak void HAL_Delay(uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
uint32_t wait = Delay;
/* Add a freq to guarantee minimum wait */
if (wait < HAL_MAX_DELAY)
{
wait += (uint32_t)(uwTickFreq);
}
while ((HAL_GetTick() - tickstart) < wait)
{
}
}
함수가 호출된 시점부터 wait동안 while에 묶여있도록 코드가 작성되어있습니다.
default로 HAL 드라이버는 1ms마다 1Tick씩 증가하도록 코딩되어 있습니다.
또 mininum wait로 1ms(uwTickFreq)가 추가되도록 되어있어 Delay에 0을 넣으면 1ms의 딜레이가 발생되는 것 입니다.
HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */
typedef enum
{
HAL_TICK_FREQ_10HZ = 100U,
HAL_TICK_FREQ_100HZ = 10U,
HAL_TICK_FREQ_1KHZ = 1U,
HAL_TICK_FREQ_DEFAULT = HAL_TICK_FREQ_1KHZ
} HAL_TickFreqTypeDef;
1넣었을 때 1ms 딜레이가 걸리게 하고 싶다!
1000 넣었을 때 1초 딜레이가 걸리게 하고 싶다!
하시는 분은 HAL_Delay 함수를 아래처럼 따로 작성하시면 됩니다.
/* main.c */
void HAL_Delay(uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
while ((HAL_GetTick() - tickstart) < Delay)
{
}
}
하지만 HAL_Delay 함수를 사용하게 되면
그 위치에서 멈춰있기 때문에 저는 잘 사용하지 않습니다.
반응형
'MCU > STM32:HAL' 카테고리의 다른 글
[STM32F]FSMC와 LCD (0) | 2021.02.28 |
---|---|
[STM32F]FSMC로 LCD(SSD1963) 제어하기 (2) | 2021.02.07 |
[STM32F][HAL] USART Interrupt (0) | 2020.12.23 |
[STM32F][HAL] DAC (Digital to Analog Converter) (0) | 2020.12.22 |
[STM32F][HAL] OUTPUT COMPARE 사용하기 (0) | 2020.06.01 |
[STM32F][HAL] USB CDC (Virtual Port Com) 사용하기 (1) | 2020.05.28 |
[STM32F][HAL] ADC - ADC Calibration (4) | 2020.05.17 |
[STM32F][HAL]GPIO (0) | 2020.05.10 |