- 하드웨어 준비
- STM8S103F의 GPIO 핀아웃 이해
- STM8S103F GPIO 선택을위한 핀아웃 설명 및 팁
- SPL을 사용하여 GPIO 입력 및 출력을위한 STM8S 프로그래밍
- 프로그램 업로드 및 테스트
마이크로 컨트롤러의 경우 LED 깜박임 프로그램은 "hello world"프로그램과 동일합니다. 이전 튜토리얼에서 STM8S103F3 개발 보드를 시작하는 방법과 STM8S 컨트롤러를 프로그래밍하기 위해 IDE 및 컴파일러를 설정하는 방법을 배웠습니다. 또한 표준 주변 장치 라이브러리를 사용하는 방법과 코드를 컴파일하여 마이크로 컨트롤러에 업로드하는 방법도 배웠습니다. 모든 기본 사항을 다루고 실제로 코드 작성을 시작하겠습니다. 이 튜토리얼에서는 STM8S 컨트롤러에서 일반 GPIO 기능을 수행하는 방법을 배웁니다. 보드에는 이미 포트 B의 핀 5에 연결된 온보드 LED가 있습니다.이 LED를 깜박이는 방법과 외부 LED를 추가하고 푸시 버튼으로 제어하는 방법을 배우게됩니다. 완전히 새로운 경우 계속 진행하기 전에 이전 자습서를 읽는 것이 좋습니다.
하드웨어 준비
프로그램을 시작하기 전에 하드웨어 연결을 준비하십시오. 앞서 언급했듯이 여기서는 두 개의 LED를 사용할 것입니다. 하나는 지속적으로 깜박이는 온보드 LED이고 다른 하나는 푸시 버튼으로 전환되는 외부 LED입니다. 아이디어는 간단한 설정으로 모든 GPIO 기능을 배우는 것입니다. 온보드 Led는 이미 PB5 (PORTB의 pin5)에 연결되어 있으므로 아래 다이어그램에서 볼 수 있듯이 LED를 PA3에 연결하고 푸시 버튼을 PA2에 연결했습니다.
그러나 제어되는 모든 출력 핀 중에서 출력용으로 PA3를 선택하고 입력 용으로 PA2를 선택한 이유는 무엇입니까? 질문은 유효하며이 기사의 뒷부분에서 설명하겠습니다. 이 튜토리얼을위한 하드웨어 설정은 아래와 같습니다. 보시다시피 ST-link 프로그래머를 프로그래밍 핀에 연결하여 보드를 프로그래밍 할뿐만 아니라 전원 역할도합니다.
STM8S103F의 GPIO 핀아웃 이해
이제 질문으로 돌아가서, 왜 입력을 위해 PA2를 사용하고 출력을 위해 왜 PA3을 사용합니까? 이를 이해하기 위해 아래에 표시된 마이크로 컨트롤러의 핀아웃을 자세히 살펴 보겠습니다.
핀아웃 다이어그램에 따라 마이크로 컨트롤러에는 각각 PA, PB, PC 및 PD로 표시되는 PORT A, B, C 및 D의 4 개의 포트가 있습니다. 각 GPIO 핀은 다른 특수 기능과 함께 클럽으로 묶여 있습니다. 예를 들어 PB5 (PORT B의 핀 5)는 GPIO 핀으로 작동 할뿐만 아니라 I2C 통신을위한 SDA 핀과 타이머 1 출력 핀으로도 작동 할 수 있습니다. 따라서이 핀을 LED 연결과 같은 간단한 GPIO 용도로 사용하면 I2C와 LED를 동시에 사용할 수 없습니다. 안타깝게도 온보드 LED가이 핀에 연결되어 있으므로 여기서는 선택의 여지가 많지 않으며이 프로그램에서는 I2C를 사용하지 않을 것이므로 큰 문제는 아닙니다.
STM8S103F GPIO 선택을위한 핀아웃 설명 및 팁
진정으로 말하면 PA1을 입력 핀으로 사용하는 것은 아프지 않고 단지 작동 핀일 것입니다. 하지만 새로운 마이크로 컨트롤러에서 GPIO 핀을 선택할 때 빠질 수있는 몇 가지 일반적인 트랩을 보여주기 위해 의도적으로이 문제를 제기했습니다. 트랩을 피하는 가장 좋은 방법은 STM8S103F3P6 데이터 시트에 제공된 핀 세부 정보와 핀 설명을 읽는 것입니다. 데이터 시트에 언급 된 STM8S103F3P6 마이크로 컨트롤러 핀 설명 세부 정보는 이미지 아래에 나와 있습니다.
마이크로 컨트롤러의 입력 핀은 플로팅 또는 약한 풀업 일 수 있으며 출력 핀은 오픈 드레인 또는 푸시 풀일 수 있습니다. Open Drain과 Push-Pull Output 핀의 차이점은 이미 논의되었으므로 자세한 내용은 다루지 않겠습니다. 간단히 말해서, 오픈 드레인 출력 핀은 출력을 높지 않고 낮게 만 만들 수있는 반면, 푸시 풀 출력 핀은 출력을 높거나 높게 만들 수 있습니다.
위의 표와 별도로 출력 핀이 고속 출력 (10Mhz) 또는 저속 출력 (2MHz) 일 수 있음을 알 수 있습니다. 이것은 GPIO 속도를 결정합니다. GPIO 핀을 높음과 낮음 사이에서 매우 빠르게 전환하려면 빠른 출력을 선택할 수 있습니다.
컨트롤러의 일부 GPIO 핀 은 위 이미지에서 언급 한대로 True Open Drain (T) 및 High Sink Current (HS) 를 지원합니다. 오픈 드레인과 트루 오픈 드레인의 상당한 차이점은 오픈 드레인에 연결된 출력은 마이크로 컨트롤러 (Vdd)의 작동 전압보다 높게 풀 수 없지만 트루 오픈 드레인 출력 핀은 Vdd보다 높게 풀 수 있다는 것입니다. 높은 싱크 기능을 가진 핀은 더 많은 전류를 싱크 할 수 있음을 의미합니다. GPIO HS 핀의 소스 및 싱크 전류는 20mA이며 전력선은 최대 100mA를 소비 할 수 있습니다.
위 이미지를 자세히 살펴보면 True Open Drain Type (T) 인 PB4 및 PB5를 제외하고 거의 모든 GPIO 핀이 HS (High Sink Current) 유형임을 알 수 있습니다. 즉,이 핀은 하이로 만들 수 없으며 핀이 하이로 만들어도 3.3V를 제공 할 수 없습니다. 이것이 온보드 LED가 3.3V에 연결되고 GPIO 핀에서 직접 전원을 공급하는 대신 PB5를 통해 접지되는 이유입니다.
자세한 핀 설명은 데이터 시트의 28 페이지를 참조하십시오. 위 이미지에서 언급했듯이 PA1은 자동으로 약한 풀업으로 구성되며 출력 핀으로 사용하지 않는 것이 좋습니다. 어쨌든 누름 버튼과 함께 입력 핀으로 사용할 수 있지만 프로그램에서 풀업을 활성화하기 위해 PA2를 사용하기로 결정했습니다. 이것들은 우리가 훨씬 더 복잡한 프로그램을 작성할 때 유용 할 몇 가지 기본적인 것입니다. 지금은 많은 것들이 머리에서 튀어 나와도 괜찮습니다. 다른 튜토리얼에서 그 레이어로 들어갈 것입니다.
SPL을 사용하여 GPIO 입력 및 출력을위한 STM8S 프로그래밍
첫 번째 자습서에서 설명한대로 작업 영역과 새 프로젝트를 만듭니다. 모든 헤더 및 소스 파일을 추가하거나 gpio, config 및 stm8s 파일 만 추가 할 수 있습니다. main.c 파일을 열고 프로그램 작성을 시작하십시오.
위의 이미지에 표시된대로 헤더 파일을 포함했는지 확인하십시오. main.c 파일을 열고 코드를 시작합니다. 전체 main.c 코드는이 페이지 하단에서 찾을 수 있으며 여기에서 프로젝트 파일을 다운로드 할 수도 있습니다. 코드에 대한 설명은 다음과 같으며, 코딩 부분이 헷갈 리시면이 페이지 하단에 링크 된 SPL 사용자 매뉴얼 또는 동영상을 참조하시기 바랍니다.
필수 포트 초기화 해제
필요한 포트의 초기화를 해제하여 프로그램을 시작합니다. 앞에서 논의했듯이 각 GPIO 핀은 일반적인 입력 및 출력처럼 작동하는 것 외에 다른 많은 기능과 관련되어 있습니다. 이러한 핀이 이전에 다른 애플리케이션에 사용 된 적이 있다면 사용하기 전에 초기화를 해제해야합니다. 필수는 아니지만 좋은 방법입니다. 다음 두 줄의 코드는 포트 A와 포트 B의 초기화를 해제하는 데 사용됩니다. GPIO_DeInit (GPIOx) 구문을 사용하면됩니다 . x 대신 포트 이름을 언급하십시오.
GPIO_DeInit (GPIOA); // 작동 할 포트 A를 준비합니다. GPIO_DeInit (GPIOB); // 작동을 위해 포트 B 준비
입력 및 출력 GPIO 선언
다음으로, 어떤 핀을 입력으로 사용할 것인지, 어떤 핀을 출력으로 사용할 것인지 선언해야합니다. 이 경우에는 PA2 핀이 입력으로 사용되며, 외부에서 사용할 필요가 없도록 내부 풀업으로이 핀을 선언합니다. 구문은 GPIO_Init (GPIOx, GPIO_PIN_y, GPIO_PIN_MODE_z); . 여기서 x는 포트 이름, y는 핀 번호, z는 GPIO 핀 모드입니다.
// PA2를 입력 풀업 핀으로 선언 GPIO_Init (GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
다음으로 핀 PA3 및 PB5를 출력으로 선언해야합니다. 다시 많은 유형의 출력 선언이 가능하지만 "GPIO_MODE_OUT_PP_LOW_SLOW"를 사용할 것입니다. 즉, 느린 속도의 push-pull 유형의 출력 핀으로 선언합니다. 기본적으로 값은 낮습니다. 구문은 동일합니다.
GPIO_Init (GPIOA, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_SLOW); // PB5를 푸시 풀 출력 핀으로 선언 GPIO_Init (GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_SLOW);
SPL 사용자 매뉴얼의 아래 스냅 샷에는 가능한 모든 GPIO 모드 (z)가 나와 있습니다.
무한 while 루프
핀 선언 후에는 LED를 계속 깜박이고 푸시 버튼의 상태를 모니터링하여 LED를 토글하는 무한 루프를 생성해야합니다. 무한 루프는 while (1) 또는 for (;;)로 만들 수 있습니다. 여기서는 (1) 동안 사용 했습니다.
동안 (1) {}
입력 핀 상태 확인
입력 핀의 상태를 확인해야합니다.이를 수행하는 구문은 GPIO_ReadInputPin (GPIOx, GPIO_PIN_y); 여기서 x는 포트 이름이고 y는 핀 번호입니다. 핀이 높으면 '1'이되고 핀이 낮 으면 '0'이됩니다. 핀이 높거나 낮은 지 확인하기 위해 if 루프 내부에 사용했습니다.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // 버튼을 누른 경우
GPIO 핀을 높거나 낮게 만들기
GPIO 핀을 High 또는 Low로 만들기 위해 GPIO_WriteHigh (GPIOx, GPIO_PIN_y); 및 GPIO_WriteLow (GPIOx, GPIO_PIN_y); 각기. 여기에서는 버튼을 누르면 LED가 켜지고 버튼을 누르지 않으면 꺼 지도록했습니다.
if (GPIO_ReadInputPin (GPIOA, GPIO_PIN_2)) // 버튼을 누른 경우 GPIO_WriteLow (GPIOA, GPIO_PIN_3); // LED ON else GPIO_WriteHigh (GPIOA, GPIO_PIN_3); // LED 꺼짐
GPIO 핀 토글
GPIO 핀을 토글하기 위해 GPIO_WriteReverse (GPIOx, GPIO_PIN_y); 이 함수를 호출하면 출력 핀의 상태가 변경됩니다. 핀이 높으면 낮음으로 변경되고 낮 으면 높음으로 변경됩니다. 이 기능을 사용하여 PB5의 온보드 LED를 깜박입니다.
GPIO_WriteReverse (GPIOB, GPIO_PIN_5);
지연 기능
Arduino와 달리 우주 컴파일러에는 미리 정의 된 지연 기능이 없습니다. 그래서 우리는 우리 스스로 만들어야합니다. 내 지연 기능은 다음과 같습니다. 지연 값은 ms 변수에 수신되며 두 개의 for 루프를 사용하여 실행을 유지하거나 프로그램합니다. _asm ("nop") 과 마찬가지로 작업 없음을 나타내는 어셈블리 명령입니다. 즉, 컨트롤러가 작업을 수행하지 않고 for 루프로 루프를 실행하여 지연이 발생합니다.
void delay (int ms) // 함수 정의 {int i = 0; int j = 0; for (i = 0; i <= ms; i ++) {for (j = 0; j <120; j ++) // Nop = Fosc / 4 _asm ("nop"); // 아무 작업도 수행하지 않음 // 어셈블리 코드}}
프로그램 업로드 및 테스트
이제 프로그램이 준비되었으므로 업로드하고 테스트 할 수 있습니다. 업로드되면 내 하드웨어가 예상대로 작동했습니다. 온보드 빨간색 LED가 500 밀리 초마다 깜박이고 스위치를 누를 때마다 외부 녹색 LED가 켜졌습니다.
전체 작업은 아래 링크 된 비디오에서 찾을 수 있습니다. 이 지점에 도달하면 스위치와 LED를 다른 핀에 연결하고 코드를 다시 작성하여 개념을 이해할 수 있습니다. 개념을 명확하게 이해했는지 확인하기 위해 지연 시간을 재생할 수도 있습니다.
질문이 있으시면 아래 댓글란에 남겨 주시고 기타 기술적 인 질문은 포럼을 이용하세요. 팔로우 해 주셔서 감사합니다. 다음 튜토리얼에서 뵙겠습니다.