- UART 통신의 기초
- 하드웨어 요구 사항 및 설정
- Nuvoton N76E003 UART 통신을위한 회로도
- Nuvoton N76E003 마이크로 컨트롤러의 UART 핀
- Nuvoton N76E003 마이크로 컨트롤러의 UART 레지스터
- N76E003의 UART 작동 모드
- UART 통신을위한 Nuvoton N76E003 프로그래밍
UART는 Universal Asynchronous Receiver / Transmitter의 약자로 모든 마이크로 컨트롤러 장치에서 유용한 하드웨어 기능입니다. 마이크로 컨트롤러는 데이터를 수신하고 처리 한 다음 다른 장치로 보내야합니다. 마이크로 컨트롤러에서 사용할 수있는 다양한 유형의 통신 프로토콜이 있지만 UART는 SPI 및 I2C와 같은 다른 통신 프로토콜 중에서 가장 많이 사용됩니다. 누군가가 데이터를 직렬로 수신하거나 전송해야하는 경우 UART는 항상 가장 간단하고 일반적인 옵션입니다. UART의 장점은 장치간에 데이터를 전송하는 데 두 개의 와이어 만 필요하다는 것입니다. Nuvoton 마이크로 컨트롤러 자습서를 계속 진행하면서이 기사에서는 N76E003 마이크로 컨트롤러를 사용하여 직렬 통신을 수행하는 방법을 배웁니다.
UART 통신의 기초
이제 UART가 무엇인지 알기 때문에 UART의 관련 매개 변수를 아는 것이 중요합니다.
두 개의 UART 장치가 동일한 주파수로 데이터를 송수신합니다. 수신 UART 장치가 시작 비트를 감지하면 전송 속도라고하는 특정 주파수에서 수신 비트를 읽기 시작합니다. Baud rate 는 UART 통신에서 중요한 요소이며 데이터 전송 속도 (bps)를 측정하는 데 사용됩니다. 전송 및 수신을위한이 전송 속도는 동일한 전송 속도 여야합니다. 전송 및 수신 UART 간의 전송 속도 차이는 비트 타이밍이 너무 멀어지기 전까지 약 10 %에 불과할 수 있습니다. 가장 널리 사용되는 전송 속도는 4800, 9600, 115200bps 등입니다. 이전에는 아래에 나열된 다른 많은 마이크로 컨트롤러에서도 UART 통신을 사용했습니다.
- ATmega8과 Arduino Uno 간의 UART 통신
- 두 개의 ATmega8 마이크로 컨트롤러 간의 UART 통신
- PIC 마이크로 컨트롤러를 사용한 UART 통신
- STM8S 마이크로 컨트롤러의 UART 통신
N76E003에는 UART0 및 UART1의 두 개의 UART가 있습니다. 이 자습서에서는 N76E003 마이크로 컨트롤러 장치 에서 UART 주변 장치를 사용합니다. 많은 시간을 낭비하지 않고이 응용 프로그램에 필요한 하드웨어 설정의 종류를 평가 해 봅시다.
하드웨어 요구 사항 및 설정
이 프로젝트에 필요한 주요 구성 요소 는 마이크로 컨트롤러 모듈이있는 PC 또는 랩톱간에 필요한 인터페이스를 만드는 USB to UART 또는 TTL 변환기 모듈 입니다. 이 프로젝트에서는 아래에 표시된 UART 모듈에 대한 CP2102 기반 USB를 사용 합니다.
말할 것도없이, 위의 구성 요소 외에 N76E003 마이크로 컨트롤러 기반 개발 보드와 Nu-Link 프로그래머가 필요 합니다. 프로그래머가 전원으로 사용되지 않는 경우 추가 5V 전원 공급 장치가 필요할 수 있습니다.
Nuvoton N76E003 UART 통신을위한 회로도
아래 개발 보드 회로도에서 볼 수 있듯이 마이크로 컨트롤러 장치의 두 번째 및 세 번째 핀은 각각 UART0 Tx 및 Rx로 사용됩니다. 맨 왼쪽에는 프로그래밍 인터페이스 연결이 표시됩니다.
Nuvoton N76E003 마이크로 컨트롤러의 UART 핀
N76E003에는 20 개의 핀이 있으며이 중 4 개의 핀은 UART 통신에 사용할 수 있습니다. 아래 이미지는 빨간색 사각형 상자 (Rx) 및 파란색 사각형 상자 (Tx)로 강조 표시된 UART 핀을 보여줍니다.
UART0의 경우 핀 2와 3은 UART 통신에 사용되고 UART1의 경우 핀 8과 핀 18은 통신에 사용됩니다.
Nuvoton N76E003 마이크로 컨트롤러의 UART 레지스터
N76E003에는 자동 주소 인식 및 프레이밍 오류 감지 (UART0 및 UART1) 가있는 두 개의 향상된 전이중 UART 가 있습니다. 이 두 UART는 두 개의 서로 다른 UART로 분류 된 레지스터를 사용하여 제어됩니다. N76E003에서 UART 작업을 위해 사용할 수있는 두 쌍의 RX 및 TX 핀이 있습니다. 따라서 첫 번째 단계는 작업을 위해 원하는 UART 포트를 선택하는 것입니다.
이 자습서에서는 UART0 을 사용 하므로 구성은 UART0에 대해서만 표시됩니다. UART1은 동일한 구성을 갖지만 레지스터는 다릅니다.
하나의 UART (이 경우 UART0)를 선택한 후 RX 및 TX 통신에 사용되는 I / O 핀을 입력 및 출력으로 구성해야합니다. UART0의 RX 핀은 포트 0.7 인 마이크로 컨트롤러의 핀 3입니다. 직렬 포트 수신 핀이므로 포트 0.7을 입력으로 설정해야합니다. 반면 마이크로 컨트롤러의 두 번째 핀인 포트 0.6은 전송 핀 또는 출력 핀입니다. Quasi 양방향 모드로 설정해야합니다. 이들은 PxM1 및 PxM2 레지스터를 사용하여 선택할 수 있습니다. 이 두 레지스터는 x가 포트 번호를 나타내는 I / O 모드를 설정합니다 (예: 포트 P1.0 레지스터는 P1M1 및 P1M2, P3.0의 경우 P3M1 및 P3M2 등). 구성은 다음과 같습니다. 아래 이미지에서 볼 수 있습니다.
N76E003의 UART 작동 모드
그런 다음 다음 단계는 UART 작업 모드 를 결정하는 것 입니다. 두 UART는 4 가지 모드로 작동 할 수 있습니다. 모드는 다음과 같습니다.
보시다시피 SM0 및 SM1 (SCON 레지스터의 7 번째 및 6 번째 비트)은 UART 작동 모드를 선택합니다. 모드 0은 동기 작업 이고 다른 세 가지 모드는 비동기 작업 입니다. 그러나 Baud Rate 생성기 와 프레임 비트 는 각 직렬 포트 모드마다 다릅니다. 응용 프로그램 요구 사항에 따라 모드 중 하나를 선택할 수 있으며 이는 UART1에서도 동일합니다. 이 자습서에서는 타이머 3 오버플로 속도를 32 또는 16으로 나눈 10 비트 작업이 사용됩니다.
이제 정보를 얻고 UART0에 대한 SCON 레지스터 (UART1의 경우 SCON_1)를 구성 할 차례 입니다.
6 번째 및 7 번째 비트는 앞에서 설명한대로 UART 모드를 설정합니다. 비트 5는 옵션을 활성화하기 위해 멀티 프로세서 통신 모드를 설정하는 데 사용됩니다. 그러나 프로세스는 선택한 UART 모드에 따라 다릅니다. 이 외에 REN 비트는 수신을 활성화하기 위해 1로 설정되고 TI 플래그는 사용자 정의 UART0 전송 기능 대신 사용되는 printf 기능에 대해 1로 설정됩니다.
다음으로 중요한 레지스터는 전력 제어 레지스터 (PCON) (UART1의 경우 타이머 3 비트 7 및 6) 레지스터입니다. 타이머를 처음 사용하는 경우 N76E003 마이크로 컨트롤러에서 타이머를 사용하는 방법을 이해하려면 Nuvoton N76E003 타이머 자습서를 확인하십시오.
SMOD 비트는 UART0 모드 1에서 이중 전송 속도를 선택하는 데 중요합니다. 이제 타이머 3을 사용하고 있으므로 타이머 3 제어 레지스터 T3CON을 구성해야합니다. 그러나 비트 7과 6은 UART1의 이중 데이터 속도 설정을 위해 예약되어 있습니다.
그리고 Timer 3 프리스케일러 값-
5 번째 비트 BRCK는 타이머 3을 UART1의 전송 속도 클럭 소스로 설정합니다. 이제 N76E003의 데이터 시트에는 원하는 Baud rate를 계산하는 공식과 타이머 3 (16 비트) High 및 Low 레지스터에 대한 샘플 설정 값이 제공됩니다.
16Mhz 클럭 소스의 샘플 값
따라서 전송 속도는 위의 공식을 사용하여 타이머 3 레지스터에서 구성되어야합니다. 우리의 경우는 Formula 4가 될 것입니다. 그 후 TR3 레지스터를 1로 설정하여 Timer 3을 시작하면 UART0 Initialization Timer 3이 완료됩니다. UART0 데이터를 수신하고 전송하려면 아래 레지스터를 사용합니다.
SBUF 레지스터는 자동으로 수신 및 전송 용으로 구성됩니다. UART에서 데이터를 수신하려면 RI 플래그 가 1로 설정되고 SBUF 레지스터를 읽고 데이터를 UART0으로 보내고 데이터를 SBUF로 보내고 TI 플래그가 1이 될 때까지 기다렸다가 성공적인 데이터 전송을 확인합니다.
UART 통신을위한 Nuvoton N76E003 프로그래밍
코딩 부분은 간단하며이 튜토리얼에 사용 된 전체 코드는이 페이지 하단에서 찾을 수 있습니다. 코드에 대한 설명은 다음과 같습니다. UART0은 주 함수의 명령문을 사용하여 9600 전송 속도로 초기화됩니다.
InitialUART0_Timer3 (9600);
위의 기능은 common.c 파일에 정의되어 있으며 Timer 3을 전송 속도 소스로, 모드 1에서 전송 속도가 9600 인 UART0을 구성하고 있습니다. 기능 정의는 다음과 같습니다.
void InitialUART0_Timer3 (UINT32 u32Baudrate) // timer3을 Baudrate 생성기로 사용 { P06_Quasi_Mode; // UART 핀을 송신을위한 준 모드로 설정 P07_Input_Mode; // 수신을위한 입력 모드로 UART 핀 설정 SCON = 0x50; // UART0 Mode1, REN = 1, TI = 1 set_SMOD; // UART0 이중 속도 활성화 T3CON & = 0xF8; // T3PS2 = 0, T3PS1 = 0, T3PS0 = 0 (프리 스케일 = 1) set_BRCK; // UART0 전송 속도 클럭 소스 = Timer3 #ifdef FOSC_160000 RH3 = HIBYTE (65536-(1000000 / u32Baudrate) -1); / * 16MHz * / RL3 = LOBYTE (65536-(1000000 / u32Baudrate) -1); / * 16MHz * / #endif #ifdef FOSC_166000 RH3 = HIBYTE (65536-(1037500 / u32Baudrate)); /*16.6MHz * / RL3 = LOBYTE (65536-(1037500 / u32Baudrate)); /*16.6MHz * / #endif set_TR3; // Trigger Timer3 set_TI; // printf 함수의 경우 TI = 1로 설정해야 함 }
선언은 앞에서 설명한대로 단계별로 수행되며 그에 따라 레지스터가 구성됩니다. 그러나 N76E003 의 BSP 라이브러리에는 P07_Input_Mode 대신 버그가 있습니다 . 이 P07_Quasi_Mode은 . 이로 인해 UART 수신 기능이 작동하지 않습니다.
전송 속도는 또한 전송 속도 입력에 따라 데이터 시트에 제공된 공식을 사용하여 구성됩니다. 이제 main 함수 또는 while 루프 에서 printf 함수가 사용됩니다. printf 기능 을 사용하려면 TI를 1로 설정해야합니다.이 외에 while 루프 에서는 스위치 케이스가 사용되고 수신 된 UART 데이터에 따라 값이 인쇄됩니다.
while (1) { printf ("\ r \ n1을 누르거나 2를 누르거나 3을 누르거나 4를 누르십시오"); oper = Receive_Data_From_UART0 (); switch (oper) { case '1': printf ("\ r \ n1 is 눌려 짐"); 단절; case '2': printf ("\ r \ n2 누름"); 단절; case '3': printf ("\ r \ n3 누름"); 단절; case '4': printf ("\ r \ n4 누름"); 단절; 기본값: printf ("\ r \ n 잘못된 키 누름"); } Timer0_Delay1ms (300); } }
음, UART0의 경우 Receive_Data_From_UART0 (); 기능이 사용됩니다. common.c 라이브러리 에도 정의되어 있습니다.
UINT8 Receive_Data_From_UART0 (무효) { UINT8 c; while (! RI); c = SBUF; RI = 0; 반환 (c); }
RI 플래그가 1을 얻고 변수 c를 사용하여 수신 데이터를 반환 할 때까지 기다립니다.
코드 및 출력 플래시
코드는 0 개의 경고와 0 개의 오류를 반환하고 Keil의 기본 플래싱 방법을 사용하여 플래싱했습니다. 코드를 컴파일하고 업로드하는 방법을 잘 모르겠다면 nuvoton 시작하기 문서를 확인하세요. 아래 줄은 코드가 성공적으로 업로드되었음을 확인합니다.
재 구축 시작: 프로젝트: printf_UART0 PUTCHAR.C를 컴파일하는 대상 'GPIO'재 구축 … Print_UART0.C를 컴파일하는 중… Delay.c를 컴파일하는 중… Common.c를 컴파일하는 중… STARTUP.A51을 조립 하는 중 … 연결 중… 프로그램 크기: data = 54.2 xdata = 0 code = 2341 ". \ Output \ Printf_UART1"… ". \ Output \ Printf_UART1"-0 오류, 0 경고. 빌드 시간 경과: 00:00:02 로드 "G: \\ n76E003 \\ software \\ N76E003_BSP_Keil_C51_V1.0.6 \\ Sample_Code \\ UART0_Printf \\ Output \\ Printf_UART1" 플래시 지우기가 완료되었습니다. 플래시 쓰기 완료: 2341 바이트가 프로그래밍되었습니다. 플래시 확인 완료: 2341 바이트가 확인되었습니다. 플래시로드가 15:48:08에 완료되었습니다.
개발 보드는 USB to UART 모듈을 사용하여 프로그래머와 랩톱을 통해 전원에 연결됩니다. UART 데이터를 표시하거나 전송하려면 직렬 모니터 소프트웨어가 필요합니다. 내가 사용하고 테라 기간 이 프로세스를.
아래 이미지에서 볼 수 있듯이 Nuvoton 컨트롤러에서 보낸 문자열을 표시하고 직렬 모니터 소프트웨어에 표시 할 수 있습니다. 또한 직렬 모니터에서 값을 읽을 수있었습니다.
이 튜토리얼의 전체 데모를 보려면 아래 링크 된 비디오를 확인하십시오. 기사를 즐겁게 읽고 유용한 것을 배웠기를 바랍니다. 질문이있는 경우 아래 댓글 섹션에 남겨 두거나 포럼을 사용하여 다른 기술 질문을 게시 할 수 있습니다.