PFP 안에는 함수의 원형을 선언해둔다.
/* USER CODE BEGIN PFP */
GPIO_PinState and(GPIO_PinState input1, GPIO_PinState input2);
GPIO_PinState not(GPIO_PinState input);
GPIO_PinState or(GPIO_PinState input1, GPIO_PinState input2);
GPIO_PinState nand(GPIO_PinState input1, GPIO_PinState input2);
GPIO_PinState nor(GPIO_PinState input1, GPIO_PinState input2);
GPIO_PinState xor(GPIO_PinState input1, GPIO_PinState input2);
GPIO_PinState xnor(GPIO_PinState input1, GPIO_PinState input2);
/* USER CODE END PFP */
main 함수 내에 핀 상태를 읽어서 저장해둘 변수를 선언한다.
int main(void)
{
/* USER CODE BEGIN 1 */
GPIO_PinState input1;
GPIO_PinState input2;
/* USER CODE END 1 */
while문 내에는 readPin함수로 상태를 확인하고 gate 함수를 호출한다.
while (1)
{
input1 = HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_11);
input2 = HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_14);
if(xnor(input1, input2))
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, 1);
else
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, 0);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
아래 각종 게이트 함수를 정의해 두었다.
불을 켜고 끄는 건 계속 반복되는 동작이니 main에서 하고 gate 함수의 반환형은 GPIO_PinState이다.
/* USER CODE BEGIN 4 */
GPIO_PinState and(GPIO_PinState input1, GPIO_PinState input2){
return input1 & input2;
}
GPIO_PinState not(GPIO_PinState input){
return !input;
}
GPIO_PinState or(GPIO_PinState input1, GPIO_PinState input2){
return input1 | input2;
}
GPIO_PinState nand(GPIO_PinState input1, GPIO_PinState input2){
return !and(input1, input2);
}
GPIO_PinState nor(GPIO_PinState input1, GPIO_PinState input2){
return !or(input1,input2);
}
GPIO_PinState xor(GPIO_PinState input1, GPIO_PinState input2){
return input1 ^ input2;
}
GPIO_PinState xnor(GPIO_PinState input1, GPIO_PinState input2){
return !xor(input1, input2);
}
/* USER CODE END 4 */
GPIO_PinState 는 사용자 정의 자료형 타입으로 gpio 헤더파일 내 선언되어 있다.
typedef enum
{
GPIO_PIN_RESET = 0,
GPIO_PIN_SET
}GPIO_PinState;