뽕구의 개발일지

[STM32] GPIO - Toggle 출력 예제 본문

개발 일지/STM32

[STM32] GPIO - Toggle 출력 예제

뽕구 2023. 9. 3. 20:07
728x90
반응형

 

Toggle

토글이란 하나의 설정값으로부터 다른 설정값으로 바꾸는 행위를 말합니다. UI를 하셨던 분이라면 Toggle Button을 바로 떠올리실텐데요. 스마트폰으로 예를 들면 Wifi On/Off, 블루투스 On/Off 등이 있겠습니다. 아래는 UI에서 기본적으로 쓰이는 Toggle Button의 예 입니다. 

Toggle Button (출처 :https://wsss.tistory.com/280)

 

그렇다면 GPIO에서 Toggle이란, High 신호를 Low로 혹은 Low를 High로 상태를 바꾸는 행위라 설명할 수 있겠습니다. GPIO State를 Set, Reset 한다고 볼 수 있겠네요. 그렇다면 예제를 통해서 직접 눈으로 확인해보도록 하겠습니다.

 

GPIO IO Toggle 예제

CubeIDE에서 프로젝트 생성 시 보드를 선택하고 Example Selector 탭을 선택하면 아래 그림과 같이 예제를 선택할 수 있습니다. 예제에서는 Nucleo-F446RE 보드를 사용해 예제 프로젝트를 생성하였습니다.

 

CubeIDE Toggle 예제

 

생성된 GPIO IO Toggle 예제의 main 함수입니다. 예제코드라 간단히 알아보겠습니다.

int main(void)
{
  /* STM32F4xx HAL library initialization:
       - Configure the Flash prefetch, instruction and Data caches
       - Configure the Systick to generate an interrupt each 1 msec
       - Set NVIC Group Priority to 4
       - Global MSP (MCU Support Package) initialization
     */
  HAL_Init();
  
  /* Configure the system clock to 180 MHz */
  SystemClock_Config();
    
  /*##-1- Enable GPIOA Clock (to be able to program the configuration registers) */
  __HAL_RCC_GPIOA_CLK_ENABLE();
  
  /*##-2- Configure PA05 IO in output push-pull mode to drive external LED ###*/  
  GPIO_InitStruct.Pin = GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 
   
  /*##-3- Toggle PA05 IO in an infinite loop #################################*/  
  while (1)
  {
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    
    /* Insert a 100ms delay */
    HAL_Delay(100);
  }
}
  • HAL_GPIO_TogglePin() 함수는 핀 그룹과 핀을 매개변수로 받습니다. 입력된 핀 그룹의 Output Data Resigter에 접근하여 핀의 상태가 High이면 Low로 Low이면 High로 천이합니다.
  • HAL_Delay()를 통해 100ms를 delay 시킵니다.

GPIO IO Toggle 스코프 파형

위 코드를 보드에 다운로드하고 실행시켜 파형을 스코프로 찍어보았습니다. 핀의  상태 변화 후 100ms Delay까지 잘 동작하고 있습니다. 주기는 5Hz 정도 나오는데 파형의 상태 변화가 1주기니까 High 100ms, Low 100ms 하여 주기는 1초당 200ms = 1/200 = 0.005 = 5Hz 입니다!

GPIO IO Toggle 스코프 파형

 

여기서, HAL_GPIO_TogglePin() 제어속도는 얼마나 나올까 궁금해졌습니다. 코드에서 HAL_Delay() 빼보고 다시 올려보았습니다. 아래와같이 HAL 드라이브로 토글했을때 88ns 속도가 나오네요. 생각보다 빠르게 제어가 가능했습니다. 

delay 없이 수행한 GPIO Toggle 스코프 파형

이번 글에서는 HAL 드라이브를 이용해 GPIO를 Toggle해 보았습니다. HAL 드라이브 사용 시 생각했던것 보다 빠른 속도를 보여줍니다. 아두이노로 DigitalWirte해서 토글시킬때랑 차원이 다르네요. 아두이노 메가는 레지스터 접근했을때 62.5ns가 나오던데......아마 F446RE 보드로 레지스터 접근해서 비트 값으로 핀 제어하면 수 ns[나노초]가 나올 수 있을것 같습니다.

 

다음에는 인터럽트를 공부하고 정리해서 올려보도록 하겠습니다!

읽어주셔서 감사합니다 :)

728x90
반응형

'개발 일지 > STM32' 카테고리의 다른 글

[STM32] Interrupt - EXTI(외부 인터럽트)  (0) 2024.06.27
[STM32] Interrupt - 개요  (1) 2023.12.24
[STM32] GPIO - 입출력 제어  (0) 2023.08.20
[STM32] GPIO - OUTPUT 구조  (2) 2023.08.03
[STM32] GPIO - INPUT 구조  (0) 2023.08.03