개요 |
|
STM32 코딩시 간단하게 일정 시간격으로 인터럽트 발생시키는 방법
전체 절차.
1. STM32CubeMX 에서 System tick timer 에서 IRQ Handler 코드 생성 하도록 선택.
2. IDE (SW4STM32 , KEIL MDK-ARM 등) 에서 IRQ Handler 함수 사용자 구현.
즉, 별도의 타이머 페리페랄 활성화 하지 않아도 간단하게 구현가능함.
|
|
STM32CubeMX 에서 System tick timer 설정. |
|
아래 동영상 처럼 STM32CubeMX 에서 NVIC 설정부에 있는 Time base : System tick timer 체크된 상태에서 코드 생성하면 자동으로 관련 코드 만들어져 있다.
|
|
인터럽트 핸들러 코드 구현
상기 STM32CubeMX 에서 설정한 후 코드 생성한후 IDE 에서 아래처럼 인터럽트 핸들러 함수 구현한다.
- 요점 : 함수 void HAL_SYSTICK_Callback() 사용자 구현하면됨.
2019년 12월 15일 추가.
STM32CubeMX version 5.4.0( 2019년 12월 최신버전) 에서는 SysTick 관련 자동생성코드에 이전버전과는 달리 변경된 부분이 있다. 변경된 지점 파일 : stm32l4xx_it.c 의 함수 void SysTick_Handler 내부.
과거 버전에서는 아래 굵은 문자열처럼 HAL_SYSTICK_IRQHandler 가 호출되고 있었다. 신규버전에서는 이 함수가 없음. 이 함수가 없는 경우 HAL_SYSTICK_Callback() 사용자 구현해도 실행되지 않음.
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
HAL_SYSTICK_IRQHandler(); // 과거버전에는 이 함수 있었다. 현재 버전엔 자동생성안됨.
/* USER CODE BEGIN SysTick_IRQn 1 */
/* USER CODE END SysTick_IRQn 1 */
}
조치방법. - 아래 처럼 사용자 영역에 직접 추가한다.
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
HAL_SYSTICK_IRQHandler(); // 직접 추가할것.
/* USER CODE END SysTick_IRQn 1 */
}
인터럽트 시간격 설정 방법.
- 자동 생성된 코드에서는 main.c 의 하단에 아래 코드처럼 인터럽 발생하는 시간격 설정부가 있다. 함수 인자로 전달되는 값의 의미는 인터럽간의 틱 수량을 의미한다. 즉, 인자값을 큰 값으로 설정하면 인터럽트 발생 시간격은 더 늦어지고 작은 값으로 설정하면 더 빨라 진다.
/**Configure the Systick interrupt time
*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
위 코드에서의 인자의 분자에 있는 것이 클럭 주파수 값을 인가하고 있기에 나누기 1000을 하지 않으면 1초단위로 인터럽트 발생되며, 나누기 1000으로 하면 1msec 간격으로 인터럽트 발생한다.
만일 100msec 시간격으로 인터럽트 발생하기를 원하면 나누기 10으로 나누기 하면된다.
2019년 12월 15일. 추가.
STM32CubeMX 버전 5.4.0 ( 2019년 12월 최신버전 ) 에서는 자동생성된 코드에 위와 같은 설정부 없다.
사용자가 직접 HAL_SetTickFreq(uint32_t Freq) 호출 하여 시간설정하면될것으로 추정되어, 코드 삽입 위치. main.c 의 HAL_init()SystemClock_Config(); 실행이후 SysTick 주기 아래 처럼 재설정해봐도 기본 설정값인 1msec 주기로만 작동함.
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1)
2023년 7월 22일 추가.
HAL_RCC_GetHCLKFreq()/1 ( 시간격 1초에 해당 ) 로 하면 함수실행 반환값이 fail 을 보여줌. 이런 경우 기본값 /1000 이 적용된것이 실행됨.
HAL_RCC_GetHCLKFreq()/10 (시간격 0.1초에 해당) 로 하면 0.1 초 간격으로 인터럽트 발생함.
HAL_RCC_GetHCLKFreq()/10000 (시간격 0.1 밀리초에 해당)도 정상 작동.
결론 : 0.1초 보다 빠른 시간격만 설정가능.
인터럽트 핸들러 동작확인 - 간단확인. |
|
앞의 인터럽트 핸들러내에 변수 TEST_VAR1++ ; 추가하고 디버그 모드에서 변수 값을 보면서 작동여부 확인.
- 시간격이 짧은 경우 해당변수의 값을 사람이 모두 확인할 수 는 없고 단지 인터럽트가 걸리고 있구나 정도만 확인가능.
|
|
인터럽트 핸들러 동작확인. - KEIL 로직애널라이저 이용. |
|
KEIL MDK-ARM 의 디버그 모드에서는 변수값들을 오실로스코프처럼 파형으로 확인가능하다. 아래 동영상은 로직애널라이저 기능 이용하여 시험용 변수 TEST_VAR1 의 값을 파형으로 확인하는 예.
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
상위 정리 글
1. https://igotit.tistory.com/244 의 STM32
첫 등록 : 2018.12.17
최종 수정 : 2023.07.22
단축 주소 : https://igotit.tistory.com/1976
'임베디드.일렉트로닉스 > STM32' 카테고리의 다른 글
STM32. 힙 , 스택 사이즈 설정 . KEIL. SW4STM32. CubeMX (0) | 2019.12.29 |
---|---|
STM32. EXTI (Extented Interrupts and events controller) (0) | 2019.12.22 |
SW4STM32(이클립스). add my own library folder to project (0) | 2019.12.11 |
STM32L4R5VI. 플래시 메모리. (0) | 2019.12.07 |
STM32L4R/S (STM32L4+ 계열) . 부트로더 (0) | 2019.12.07 |
댓글