일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Avr
- 유심 재발급
- Mega2560
- STM32 IDE
- 아두이노
- SPXL
- 유심 재발급 제한
- Microchip Studio
- atmega
- 코테
- 백준
- flag 변수
- C++
- 알고리즘
- STM32 라인업
- 객체지향
- GPIO
- 코딩테스트
- NUCLEO-F103RB
- 아두이노 통신
- STM32CubeIDE
- S&P500
- STM32
- CubeIDE
- STM32 개발환경
- STL
- 정렬
- 정렬알고리즘
- sort
- c#
- Today
- Total
뽕구의 개발일지
[STM32] GPIO - Toggle 출력 예제 본문
Toggle
토글이란 하나의 설정값으로부터 다른 설정값으로 바꾸는 행위를 말합니다. UI를 하셨던 분이라면 Toggle Button을 바로 떠올리실텐데요. 스마트폰으로 예를 들면 Wifi On/Off, 블루투스 On/Off 등이 있겠습니다. 아래는 UI에서 기본적으로 쓰이는 Toggle Button의 예 입니다.
그렇다면 GPIO에서 Toggle이란, High 신호를 Low로 혹은 Low를 High로 상태를 바꾸는 행위라 설명할 수 있겠습니다. GPIO State를 Set, Reset 한다고 볼 수 있겠네요. 그렇다면 예제를 통해서 직접 눈으로 확인해보도록 하겠습니다.
GPIO IO Toggle 예제
CubeIDE에서 프로젝트 생성 시 보드를 선택하고 Example Selector 탭을 선택하면 아래 그림과 같이 예제를 선택할 수 있습니다. 예제에서는 Nucleo-F446RE 보드를 사용해 예제 프로젝트를 생성하였습니다.
생성된 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 입니다!
여기서, HAL_GPIO_TogglePin() 제어속도는 얼마나 나올까 궁금해졌습니다. 코드에서 HAL_Delay() 빼보고 다시 올려보았습니다. 아래와같이 HAL 드라이브로 토글했을때 88ns 속도가 나오네요. 생각보다 빠르게 제어가 가능했습니다.
이번 글에서는 HAL 드라이브를 이용해 GPIO를 Toggle해 보았습니다. HAL 드라이브 사용 시 생각했던것 보다 빠른 속도를 보여줍니다. 아두이노로 DigitalWirte해서 토글시킬때랑 차원이 다르네요. 아두이노 메가는 레지스터 접근했을때 62.5ns가 나오던데......아마 F446RE 보드로 레지스터 접근해서 비트 값으로 핀 제어하면 수 ns[나노초]가 나올 수 있을것 같습니다.
다음에는 인터럽트를 공부하고 정리해서 올려보도록 하겠습니다!
읽어주셔서 감사합니다 :)
'개발 일지 > 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 |