시리얼 통신 - 수신값으로 GPIO 제어

시리얼 통신은 GPIO와 밀접한 관계가 있습니다.

외부에서 값을 입력하거나, 보드의 상태를 볼 때 시리얼 통신을 주로 사용하기 때문입니다.

이번 시간에는 시리얼 통신으로 LED 제어와 버튼의 입력 상태를 받아보도록 하겠습니다.

STM32Cube

이전 시간의 파일에서 File - Save Project As 혹은 Ctrl + A (다른이름으로 저장)를 눌러줍니다.

PC13에 GPIO_Input을, PA5에 GPIO_Output을 설정해 줍니다.

Configuration의 GPIO에서 PA5의 라벨에는 internal_led를

PC13의 라벨에는 b1을 적어줍니다.

이제 코드를 생성(톱니바퀴)해 줍니다.

uVision5

HAL_UART_Transmit 함수와 HAL_UART_Receive 함수

그리고 이전 시간에 사용했던 HAL_GPIO_ReadPin과 HAL_GPIO_WritePin을 사용합니다.

USER CODE BIGIN 2 밑에 아래 변수들과 함수를 추가해 줍니다.

b_in과 pin_state만 추가해 주면 됩니다.

  /* USER CODE BEGIN 2 */

    HAL_StatusTypeDef RcvStat ;
    uint8_t bufftx[10] = "Hello!\n" ;
    uint8_t b_in[10] = "b_in\n" ;
    uint8_t UsartData[10] ;
    uint8_t pin_state ;

    HAL_UART_Transmit(&huart2, bufftx, 10, 100) ;

USER CODE BIGIN 3 에는 아래와 같이 추가해 줍니다.

  /* USER CODE BEGIN 3 */

    RcvStat = HAL_UART_Receive(&huart2, UsartData, 1, 100) ;

    if (RcvStat == HAL_OK) {
        if (UsartData[0] == 'a') {  // if serial input is 'a', led on
            HAL_GPIO_WritePin(internal_led_GPIO_Port, internal_led_Pin, GPIO_PIN_SET) ;
        } else if (UsartData[0] == 'b') {  // if serial input is 'a', led off
            HAL_GPIO_WritePin(internal_led_GPIO_Port, internal_led_Pin, GPIO_PIN_RESET) ;
        }

        HAL_UART_Transmit(&huart2, UsartData, 1, 100) ;
    }

    pin_state = HAL_GPIO_ReadPin(b1_GPIO_Port, b1_Pin) ;

    if (!pin_state) {  // if b1 is low, send b_in
        HAL_UART_Transmit(&huart2, b_in, 10, 100) ;
    }

저번 시간과 같이 Serial 통신 프로그램을 설정해 줍니다.

RESET 버튼을 눌러 보드를 재시작하면 Hello! 문자가 나옵니다.

B1 버튼을 누르면 b_in이 나옵니다.

문자열 'a'를 보내면 led가 켜지고 'b'를 보내면 꺼지게 됩니다.

results matching ""

    No results matching ""