4장 - 예제2

조재훈·2023년 6월 9일
0

프린트문 사용하기

  • PinMap

  • 제어판 장치관리자에서 COM Port 확인
    : 여기서는 COM12

  • Tera Term 포트 설정
    : Baudrate 115200
    : Data 8 bit
    : Stop bits : 1 bit




  • USART3
    : F429Zi로 프로젝트 생성시 기본 할당

  • Generate Code

  • main.h에서 변수 정의

#define LED_STATE0 0 // 초기 상태에서 100ms동안 High가 유지되면 LED On으로 하는 상태
#define LED_STATE1 1 // Switch High에서 Low로 떨어지는지 점검하는 상태
#define LED_STATE2 2 // LED On상태에서 Switch 100ms 이상 High 유지되면 LED Off하는 상태
#define LED_STATE3 3 // Switch High에서 Low로 떨어지는지 점검하는 상태

  • main.c에 stdio.h 불러오기
#include "stdio.h"

  • Write 함수 구현
unsigned char ReadSW, SW_High_Counter, LED_State;

int _write(int file, unsigned char* p, int len)
{
	HAL_StatusTypeDef status = HAL_UART_Transmit(&huart3, p, len, 100);
    return (status == HAL_OK ? len : 0);
}

  • main 함수에 코딩
printf("Hello World\r\n");

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    ReadSW = HAL_GPIO_ReadPin(USER_Btn_GPIO_Port, USER_Btn_Pin);
    switch(LED_State)
    {
      case LED_STATE0:
        if(ReadSW)
        {
        // 버튼을 길게 누르면 카운터 올라감
        // 10ms 미만으로 누를 경우 LED 안켜짐
          ++SW_High_Counter;
          if(SW_High_Counter > 10)
          {
          // 10ms 이상 누를 경우 LED 켜짐
          // 동시에 카운터는 다시 0으로 초기화
          // 그 동시에 State는 LED_STATE1으로 넘어감
            SW_High_Counter = 0x00;
            LED_State = LED_STATE1;
            HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
            printf("LED_STATE0->LED_STATE1 LED On\r\n");
            break;
          }
        }
        else
        {
        // 버튼을 아예 안누를 경우 카운터는 계속 0
          SW_High_Counter = 0;
        }
        break;
      case LED_STATE1:
      // LED_STATE0에서 버튼을 10ms이상 누르는 동시에 이미 여기의 if문으로 들어옴
      // 아무 동작 수행 안함
        if(ReadSW) break;
        else // 버튼을 떼는 순간
        {
        // 버튼을 떼는 순간 다음 상태로 넘어감
        // 카운터는 다시 0으로 초기화
          LED_State = LED_STATE2;
          SW_High_Counter = 0x00;
          printf("LED_STATE2->LED_STATE3 Switch Level High to Low \r\n");
          break;
        }
        break;
      case LED_STATE2:
      // 위 과정과 동일
        if(ReadSW)
        {
          ++SW_High_Counter;
          if(SW_High_Counter > 10)
          {
            SW_High_Counter = 0x00;
            LED_State = LED_STATE3;
            HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
            printf("LED_STATE2->LED_STATE3 LED Off\r\n");
            break;
          }
        }
        else
        {
          SW_High_Counter = 0;
        }
        break;
      case LED_STATE3:
        if(ReadSW) break;
        else
        {
          LED_State = LED_STATE0;
          SW_High_Counter = 0x00;
          printf("LED_STATE3->LED_STATE0 Switch Level High to Low\r\n");
          break;
        }
        break;
      default:
        break;
    }
    HAL_Delay(10);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  • HAL_Delay 함수 정의
void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  while((HAL_GetTick() - tickstart) < Delay)
  {
  }
}

profile
맨땅에 헤딩. 인생은 실전.

0개의 댓글