• __attribute__((weak))

• 해당 심볼을 weak symbol로 만든다.

• 링커가 링크를 수행 시 다른곳에 같은 이름으로 만든 strong symbol이 존재하면 weak symbol 대신 strong symbol을 사용한다.


출처: http://jake.dothome.co.kr/attr1/

참고: GCC Weak Function Attributes

# STM32F429I-DISCOVERY

# STM32F429ZIT6 (144Pin / 180Mhz)

# FreeRTOS (RTOS)

# KEY (PA0)

# 2017.09.08 Callback 함구 구현


KEY_EXTI_TEST.zip


• 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


출처: http://openmicrolab.com/tag/cmsis/

+ Recent posts