본문 바로가기
DSP, MCU/STM32 (ARM Cortex-M)

STM32 ] 무료 다이어그램 툴 draw.io 로 SW 설계해보기

by eteo 2022. 12. 22.

 

UML 다이어그램의 종류

동작 다이어그램 구조 다이어그램 인터랙션 다이어그램
유스케이스 클래스 다이어그램 시퀀스 다이어그램
액티비티 다이어그램 객체 다이어그램 커뮤니케이션 다이어그램
상태 다이어그램 컴포넌트 다이어그램 인터랙션 오버뷰션 다이어그램
  배치 다이어그램 타이밍 다이어그램
  패키지 다이어그램  
  컴포넌트구조 다이어그램  

 

참고 : STM32Fx Cortex ARM 프로그래밍

 

 

그중에서도 다음은 Activity 다이어그램의 심볼이다. 일반적으로 우리가 알고 있는 플로우차트와 유사하다.

 

 

 

 

 

예시.

버튼을 2초 이상 누른 상태로 손을 떼지 않으면 LED가 500ms 간격으로 토글되고 손울 떼는 순간 IDLE로 돌아간다.

 

  while (1)
  {
    LEDBTN();

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
/* USER CODE BEGIN 0 */
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);
}

void LEDBTN()
{
  static uint8_t state = 0;
  static uint32_t timeBefore = 0;
  static uint32_t btnPressedTime = 0;

  uint8_t btn = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13);

  switch(state)
  {
    case 0: // 처음 안눌린 상태
      if(btn)
      {
        btnPressedTime = HAL_GetTick();
        state = 1;
        printf("STATE 0->1\r\n");
      }
      break;
    case 1: // 버튼이 눌린 상태
      if(btn)
      {
        if(HAL_GetTick() - btnPressedTime >= 2000)
        {
          timeBefore = HAL_GetTick();
          state = 2;
          printf("STATE 1->2\r\n");
        }
      }
      else
      {
        state = 0;
        printf("STATE 1->0\r\n");
      }
      break;
    case 2: // 버튼이 2초 이상 눌린상태
      if(btn)
      {
      // 눌린지 2.5초 이후 토글시작
        if(HAL_GetTick() - timeBefore >= 500)
        {
          timeBefore = HAL_GetTick();
          HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
        }
      }
      else
      {
        state = 0;
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, 0);
        printf("STATE 2->0\r\n");
      }
      break;
  }

}
/* USER CODE END 0 */