• __attribute__((weak))
• 해당 심볼을 weak symbol로 만든다.
• 링커가 링크를 수행 시 다른곳에 같은 이름으로 만든 strong symbol이 존재하면 weak symbol 대신 strong symbol을 사용한다.
• __attribute__((weak))
• 해당 심볼을 weak symbol로 만든다.
• 링커가 링크를 수행 시 다른곳에 같은 이름으로 만든 strong symbol이 존재하면 weak symbol 대신 strong symbol을 사용한다.
# STM32F429I-DISCOVERY
# STM32F429ZIT6 (144Pin / 180Mhz)
# FreeRTOS (RTOS)
# KEY (PA0)
# 2017.09.08 Callback 함구 구현
• CubeMX에서 외부 인터럽트를 설정하고 Key 입력에 따라 LED를 켜고 끄도록 한다.
• 회로도
• 아래 데이터시트를 보는 것과 같이 PA0은 EXTI0 인터럽트와 매칭된다.
• 아래 사진과 같이 핀 설정을 한다.
• LED GPIO_Output, SWCLK, SWDIO 설정
• Peripherals 설정
• 클럭 설정
• Configuration → NVIC 버튼을 클릭하고, 외부 인터럽트 함수를 체크해준다.
# Premption Priority, Sub Priority는 추후 기술하겠음
• GPIO 버튼을 클릭하고, GPIO mode, Pull-up/Pull-down을 설정한다.
필자의 경우 Rising edge에 동작하도록 하였다.
• 인터럽트 핸들러
Cube에서 코드를 생성하면 "stm32f4xx_it.c" 파일에 인터럽트 핸들러가 추가 된다.
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); 이 함수를 따라가 보면 실제 인터럽트 처리가 구현되어 있고,
마지막에 Callback 함수를 호출 하고 있다.
HAL_GPIO_EXTI_Callback(GPIO_Pin); 함수를 따라가 보자.
이 함수를 직접 수정하지 말고, HAL_GPIO_EXTI_Callback 함수를 사용자 파일에 구현 하라고 되어있다.
필자는 "stm32f4xx_it.c" 파일에 Callback 함수를 복사하였다.
• 코드 입력
Callback 함수를 복사 후 아래 코드를 입력한다.
__weak attribute는 삭제한다.
HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13 | GPIO_PIN_14);
• 외부 인터럽트와 핀설정은 gpio.c 파일에서 확인할 수 있다.
#인터럽트 우선 순위에 대한 내용은 추후 기술 하겠음.
끝.
CMSIS
Cortex Microcontroller Software Interface Standard의 약자. 즉 다양한 칩 벤더가 Cortex 시리즈의 IP를 라이센스해가면서 하드웨어 독립적인 표준화된 소프트웨어 인터페이스가 필요하게 됨. 이것은 다음을 포함한다. 스펙은 ARM에 사용자 등록을 하면 받을 수 있다. https://silver.arm.com/browse/CMSIS