회로도를 분석해 코딩을 하는법을 배우고, 실행해보자.
nucleo 보드의 User 버튼을 누를때마다 LD2 led를 토글시키는 예제
자세한 설정은 UART printf 에서 이미지 참고
GPIO에서 B1 User 버튼은 회로도를 보았을 때
PC13에 연결이 되어있고, R30 저항이 풀업 저항이므로 이 버튼은 Falling edge(버튼을 눌렀을때 신호가 0)인것을 알수있다. 그러므로 GPIO모드를 FallingEdge모드로 바꿔준다.
그리고 Code generate를 해준다.
HAL Driver에서 stm32f1xx_hal_gpio.c 를 들어가보면
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(GPIO_Pin);
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
}
식으로 weak 처리가 되어있다.
__weak 심볼은 따로 선언이 되어있지 않으면 심볼내 함수를 처리하겠다는 의미이므로, 심볼을 제외한 함수만 긁어다 새로 선언해준다.
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
switch (GPIO_Pin)
{
case B1_Pin:
HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
break;
default:
;
}
}
만약 GPIO_Pin이 B1 User Pin이라면 LD2 led를 토글하라고 설정해주었다.
유저 버튼을 누를때마다 토글되는것을 확인하였다. 다만 여러번 토글되는것으로 보아 플로팅현상은 방지하였으나, 채터링 현상(신호가 수차례반복됨)이 해결되지 않은것 같다. 해결하는 방식이나 코드를 추가해야 될 것이다.
gif가 안올라간다.. 이게 맞나..