- STM8S103F3P6의 직렬 통신
- STM8S103F3P6의 직렬 통신 핀
- STM8S 직렬 통신을위한 회로도
- 직렬 통신을위한 STVD 설정
- 직렬 통신을위한 STM8S 프로그래밍
- 직렬 모니터에서 LED 제어
- STM8S 직렬 라이브러리 자세히보기
새로운 마이크로 컨트롤러를 프로그래밍하는 것은 새로운 레지스터 처리 방법으로 인해 시간이 더 오래 걸리고 어떤 비트가 정확히 무엇을하는지 알지 못합니다. 말할 것도없이 디버깅도 마찬가지입니다. 이것이 프로그래머가 코드에 중단 점을 자주 사용하고 디버거를 사용하여 단계별로 진행하는 이유입니다. 그러나 디버거를 사용하려면 추가 하드웨어 (대부분 고가)와 추가 시간이 필요할 수 있습니다. Arduino 팬이기 때문에 우리 모두가 동의 할 수있는 한 가지는 디버깅을 위해 직렬 인쇄 문을 사용하고 코드를 이해하면 삶을 훨씬 더 쉽게 만듭니다. 우주 C 컴파일러 및 SPL 라이브러리를 사용하여 STM8에서 동일한 것을 복제 할 수있는 것은 무엇입니까? 글쎄요, 그것은 매우 가능합니다. 그리고 이것이 우리 튜토리얼 시리즈의 세 번째 튜토리얼에서 우리가 할 일입니다.여기에서 완전히 새로운 경우 STM8S (튜토리얼 1) 및 STM8S GPIO 컨트롤 (튜토리얼 2) 시작하기도 확인하십시오. 또한 빠른 시작을 위해 Arduino를 사용한 STM8S 프로그래밍 가능성도 살펴 보았습니다. 지금까지 언급 한 모든 내용은 튜토리얼을 시작하겠습니다.
STM8S103F3P6의 직렬 통신
STM8S103F3P6의 데이터 시트에서 8 비트 컨트롤러가 다양한 모드에서 UART 통신을 지원함을 알 수 있습니다. 컨트롤러에는 동기식 UART 통신을위한 클록 출력 핀도 있으며 SmarCard, IrDA 및 LIN도 지원할 수 있습니다. 그러나 우리는 복잡성에서 벗어나기 위해이 튜토리얼에서 아무것도 탐구하지 않을 것입니다. 간단한 UART 읽기 및 쓰기를 수행하는 방법을 배웁니다.
이 튜토리얼은 또한 직렬 시작, 직렬 읽기, 직렬 인쇄 등과 같은 간단한 UART 명령을 수행 할 수있는 stm8s103 serial.h 라는 헤더 파일을 제공합니다. 기본적으로 직렬 모니터에 char, int 및 string을 인쇄 할 수 있습니다. 직렬 모니터에서 문자를 읽습니다. 이 튜토리얼을 마치면 직렬 모니터에서 LED를 제어하고 LED 상태에 대한 피드백을받을 수 있습니다. 위에서 언급 한 헤더 파일은 SPL 라이브러리에 따라 다르므로 시작하기 튜토리얼을 따라야합니다.
STM8S103F3P6의 직렬 통신 핀
하드웨어 측면에서 시작하겠습니다. 아래에 주어진 STM8S103F3P6 마이크로 컨트롤러 의 핀아웃을 간략히 살펴보면 핀 1, 2, 3이 UART 통신에 사용된다는 것을 알 수 있습니다.
3 번 핀 중 1 번 핀은 동기식 UART 통신시에만 사용되는 UART 클럭 핀이므로 여기서는 필요하지 않습니다. 핀 2는 UART 송신기 핀이고 핀 3은 UART 수신기 핀입니다. 이 핀은 아날로그 핀 또는 일반 GPIO 핀으로도 두 배가 될 수 있습니다.
STM8S 직렬 통신을위한 회로도
여기서 회로도는 매우 간단합니다. 프로그래밍을 위해 ST-LINK 2를 연결하고 직렬 데이터를 읽기 위해 USB-TTL 변환기를 연결해야합니다. STM8S 컨트롤러는 3.3V 로직 레벨에서 작동하므로 USB to TTL 변환기도 3.3V 로직을 지원하는지 확인하십시오. 전체 회로도가 아래에 나와 있습니다.
하나의 USB 포트에 ST- 링크를 연결하고 랩톱의 다른 USB 포트에 USB-TTL 변환기를 연결해야 동시에 데이터를 프로그래밍하고 모니터링 할 수 있습니다. UART 연결은 간단합니다. STM8S 마이크로 컨트롤러의 접지 및 Rx / Tx 핀을 USB-TTL 변환기의 Tx / Rx 핀에 연결하기 만하면됩니다. 여기에서는 ST-Link의 Vcc 핀으로 컨트롤러에 전원을 공급하고 TTL 변환기의 vss 핀을 열어 두었습니다. 다른 방법으로도 수행 할 수 있습니다. 시장에는 많은 유형의 USB-TTL 변환기가 있습니다. 3.3V 로직 신호에서 작동 할 수 있는지 확인하고 Tx, Rx 및 GND 핀을 간단히 찾고 위에 표시된 연결을 확인하십시오. 내 하드웨어 설정은 다음과 같습니다.
직렬 통신 방식을 만들기 위해 STM8S_Serial.h 헤더 파일을 제공했습니다. 이 헤더 파일을 사용하여 직렬 통신을위한 기능과 같은 간단한 Arduino를 수행 할 수 있습니다.
이 프로젝트에 필요한 모든 파일은 STM8S103F3_SPL Github 페이지에서 찾을 수 있습니다. 이 특정 헤더 파일 만 필요한 경우 아래 링크에서 다운로드 할 수 있습니다.
STM8S_Serial.h 다운로드
직렬 통신을위한 STVD 설정
직렬 통신으로 작업하기 위해 앞서 논의한 STM8S_Serial.h 헤더 파일 함수를 사용하여 많은 것을 사용할 것입니다. 그러나 라이브러리에는 다른 종속성, 많은 SPL UART 및 클럭 관련 헤더 및 C 파일이 있습니다. 따라서이 시점부터 컴파일 오류를 피하기 위해 모든 헤더와 C 파일을 프로젝트에 포함하는 것이 좋습니다. 내 STVD 작업 환경은 다음과 같습니다.
첫 번째 튜토리얼에서했던 것처럼 모든 SPL 소스 파일과 Include 파일을 포함했는지 확인하십시오. 또한 stm8s103_serial.h 헤더 파일을 추가했는지 확인 하십시오. 이 헤더에 대한 C 파일이 없습니다.
직렬 통신을위한 STM8S 프로그래밍
STVD 프로젝트 설정이 준비되면 main.c 파일에 코드 작성을 시작할 수 있습니다. 이 자습서의 전체 코드는이 페이지 하단에서 찾을 수 있습니다. 설명은 다음과 같습니다.
첫 번째 단계는 필요한 헤더 파일을 포함하는 것입니다. 여기서 방금 다운로드 한 기본 헤더 파일 (stm8s)과 stm8s_103_serial 헤더 파일을 추가했습니다.
// 필수 헤더 #include "STM8S.h"#include "stm8s103_serial.h"//https://github.com/CircuitDigest/STM8S103F3_SPL/blob/master/stm8s103%20Libraries/stm8s103_Serial.h
다음으로 디자인 매크로를 사용하여 입력 및 출력 핀을 지정합니다. 여기서는 포트 B의 pin5에 연결된 온보드 LED 만 제어하므로 test_LED 로 이름을 지정 합니다.
#define test_LED GPIOB, GPIO_PIN_5 // 테스트 LED가 PB5에 연결됨
메인 기능 내부로 이동하여 핀을 출력으로 정의합니다. 기본 GPIO 기능에 익숙하지 않은 경우 STM8S GPIO 자습서로 돌아가십시오.
// 핀 정의 // PB5를 푸시 풀로 선언 출력 핀 GPIO_Init (test_LED, GPIO_MODE_OUT_PP_LOW_SLOW);
그런 다음 직렬 통신 포트를 9600 전송 속도로 초기화합니다. 새로운 사용자의 경우 9600은 통신 중에 데이터 비트가 전송되는 속도입니다. 여기서 9600을 설정하면 모니터링 소프트웨어에서도 동일하게 설정해야합니다. 그런 다음 "Enter command"문자열을 인쇄하고 다음 줄로 이동합니다.
Serial_begin (9600); // 9600 전송 속도로 직렬 통신 시작 Serial_print_string ("Enter command"); // 문자열 출력 Serial_newline (); // 다음 줄로 이동
무한 while 루프로 이동하여 Serial_available 함수를 사용하여 들어오는 직렬 데이터가 있는지 확인합니다. 그렇다면, 우리는 그것을 읽고 ch라는 변수에 저장하고 Serial_print를 사용하여 동일한 것을 인쇄합니다. 수신 된 값이 0이면 LED를 끄고 1이면 LED를 켭니다.
if (Serial_available ()) {Serial_print_string ("눌렀습니다:"); ch = Serial_read_char (); Serial_print_char (ch); Serial_newline (); if (ch == '0') GPIO_WriteHigh (test_LED); // LED 꺼짐 if (ch == '1') GPIO_WriteLow (test_LED); // LED 켜짐}
이것으로이 튜토리얼의 프로그래밍이 완료되었습니다.이 페이지 하단에 제공된 코드를 업로드하기 만하면 직렬 모니터에서 LED를 제어 할 수 있습니다.
직렬 모니터에서 LED 제어
코드를 업로드하면 9600 전송 속도로 직렬 모니터를 열 수 있습니다. 나는 사용하기 쉽도록 Arduino 직렬 모니터 자체를 사용했습니다. 리셋 버튼을 누르면“Enter a command”라는 메시지가 나타납니다. 그런 다음 1을 입력하고 Enter 키를 누르면 온보드 LED가 켜지고 0의 경우와 마찬가지로 꺼집니다.
전체 작업은이 페이지 하단에 링크 된 비디오에서 찾을 수 있습니다. 질문이 있으시면 댓글란에 남겨주세요. 포럼을 사용하여 다른 기술 질문을 게시 할 수도 있습니다.
STM8S 직렬 라이브러리 자세히보기
STM8S103F3_Serial 헤더 파일 에서 실제로 무슨 일이 일어나는지 알고 싶은 호기심 많은 사람들을 위해 ….
이 헤더 파일은 초보자 수준의 프로그래밍에 적합하지만 다른 버전의 STM8S 컨트롤러를 사용하거나 일부 고급 옵션을 찾고있는 경우이 헤더를 약간 조정하거나 SPL 라이브러리와 직접 작업 할 수 있습니다. 이 헤더 파일은 UART1 헤더 파일에서 잘 익은 것처럼 작성했으며 헤더 파일에 대한 설명은 다음과 같습니다.
직렬 모니터에서 문자 읽기
이 기능은 직렬 모니터에서 마이크로 컨트롤러로 전송 된 단일 문자를 읽는 데 도움이됩니다.
char Serial_read_char (void) {while (UART1_GetFlagStatus (UART1_FLAG_RXE) == RESET); UART1_ClearFlag (UART1_FLAG_RXNE); 반환 (UART1_ReceiveData8 ()); }
수신을 완료하기 위해 RXE 플래그가 SET 될 때까지 기다린 다음 수신을 승인하기 위해 플래그를 지 웁니다. 마지막으로이 함수의 결과로 수신 된 8 비트 데이터를 보냅니다.
직렬 모니터에 문자 인쇄
이 기능은 마이크로 컨트롤러에서 직렬 모니터로 단일 문자를 전송합니다.
void Serial_print_char (char 값) {UART1_SendData8 (value); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // 전송 대기}
이 함수는 단순히 8 비트 값을 쓰고 UART1_FLAG_TXE 를 SET 로 확인하여 전송이 완료 될 때까지 기다립니다.
직렬 통신 초기화
이 기능은 필요한 전송 속도로 직렬 통신을 초기화합니다.
void Serial_begin (uint32_t baud_rate) {GPIO_Init (GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init (GPIOD, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT); UART1_DeInit (); // UART 주변 장치 초기화 UART1_Init (baud_rate, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE); // (BaudRate, Wordlegth, StopBits, Parity, SyncMode, Mode) UART1_Cmd (ENABLE); }
전송 속도 외에도 데이터 비트 수, 정지 비트 수, 패리티 등과 같이 직렬 통신을 위해 설정해야하는 다른 매개 변수가 있습니다. 가장 일반적인 매개 변수 (Arduino와 유사)는 8 비트 데이터입니다. 정지 비트가 하나이고 패리티가 없으므로 이것이 기본 설정이됩니다. 필요한 경우 변경할 수 있습니다.
정수를 직렬 모니터로 인쇄
대부분의 경우 디버깅 또는 모니터링을 위해 직렬 모니터를 사용하는 경우 int 유형의 변수를 직렬 모니터에 인쇄 할 수 있습니다. 이 함수는 정확히
void Serial_print_int (int number) // int 값을 직렬 모니터에 출력하는 기능 {char count = 0; 문자 숫자 = ""; while (number! = 0) // int를 char array로 분할 {digit = number % 10; count ++; 숫자 = 숫자 / 10; } while (count! = 0) // 문자 배열을 올바른 방향으로 인쇄 {UART1_SendData8 (digit + 0x30); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // 전송 카운트 대기-; }}
정수 값을 받아 첫 번째 while 루프에서 문자 배열로 변환 한 다음 두 번째 while 루프에서 print char 함수와 유사한 각 문자를 보냅니다.
새 줄 인쇄
이것은 새 줄을 인쇄하는 간단한 기능입니다. 이를 수행 할 16 진수 값은 "0x0a"이며, 8 비트 전송 명령을 사용하여 전송합니다.
무효 Serial_newline (무효) {UART1_SendData8 (0x0a); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); // 전송 대기}
직렬 모니터에 문자열 인쇄
또 다른 유용한 기능은 직렬 모니터에 문자열을 실제로 인쇄하는 것입니다.
void Serial_print_string (문자열) {. char i = 0; while (문자열! = 0x00) {UART1_SendData8 (문자열); while (UART1_GetFlagStatus (UART1_FLAG_TXE) == RESET); i ++; }}
다시 말하지만,이 함수는 문자열을 char 배열로 변환하고 각 문자를 보냅니다. 우리가 알고 있듯이 모든 문자열은 null입니다. 그래서 우리는 null 0x00에 도달 할 때까지 문자를 계속해서 이동하고 전송해야합니다.
직렬 데이터를 읽을 수 있는지 확인
이 함수는 읽을 준비가 된 버퍼에 직렬 데이터가 있는지 확인합니다.
bool Serial_available () {if (UART1_GetFlagStatus (UART1_FLAG_RXNE) == TRUE) return TRUE; 그렇지 않으면 FALSE를 반환합니다. }
UART1_FLAG_RXNE 플래그를 확인하고 true이면 true를 반환하고 그렇지 않으면 false를 반환합니다.