- [STM32]SW Timer 사용하기 목차
CMSIS_V2를 기준으로 작성되었다
주기적으로 일을 처리해야 하는 작업을 일반적으로 타이머를 사용하여 수행하는데
FreeRTOS를 사용하면 하드웨어 타이머를 사용하지 않고 FreeRTOS가 제공하는 소프트웨어 타이머를 사용할 수 있다
정확한 타이밍이 생명인 경우에는 하드웨어 타이머 인터럽트를 사용하는 것이 맞는 경우로 판단된다
그러나 대부분의 주기적 작업들은 어느 정도의 정확성을 가지면 된다
CubeMX에서 FREERTOS -> Timers and Semaphores를 선택한다
하단에 Add 버튼을 누르면
이러한 창이 뜬다
주의할 점은 Code Generation Option에서 한번만 수행하는 타이머(osTimerOnce) 인지 주기적으로 수행되는 타이머인지 선택하는 것이다
CubeMX에서 코드 생성(Code Generation)을 하면 적용된 코드가 생성된다.
main.c 화일에 아래처럼 코드가 생성되어 있다
/* creation of app10msecTimer */
app10msecTimerHandle = osTimerNew(app10msecCallback, osTimerPeriodic, NULL, &app10msecTimer_attributes);
또한 Callback 함수고 선언되어 있다
/* app10msecCallback function */
void app10msecCallback(void *argument)
{
/* USER CODE BEGIN app10msecCallback */
/* USER CODE END app10msecCallback */
}
이 상태에서 프로그램을 수행시켜도 Callback 함수를 수행하지 않는다
타이머를 시작시키지 않았기 때문이다.
아래처럼 추가하면 정상적으로 Callback이 수행된다.
/* USER CODE BEGIN RTOS_TIMERS */
/* start timers, add new ones, ... */
osTimerStart(app10msecTimerHandle, 10); <- 10msec 후에 Callback을 호출하라
/* USER CODE END RTOS_TIMERS */
확인은 Callback 함수에 print문이나 led 제어로 확인할 수 있다
참고) https://mcuoneclipse.com/2018/05/27/tutorial-understanding-and-using-freertos-software-timers/
'STM32' 카테고리의 다른 글
[STM32CubeIDE]다운로드하는 경우 "Program file does not exist" 메시지 출력 (0) | 2021.11.22 |
---|---|
[STM32]I2C에러 HAL_I2C_ERROR_AF(0x04), HAL_BUSY(0x02) (0) | 2021.11.19 |
[STM32CubeIde]배열(array)의 "multiple definition of " 에러 (0) | 2021.11.17 |
[STM32]st-link 등 다운로드를 사용하는 경우 Boot Mode (0) | 2021.11.11 |
[CubeIDE]st-link 연결 (0) | 2021.11.09 |