본문 바로가기
임베디드

[임베디드] RS232 TX Interrupt란?

by 코딩히어로 2021. 3. 12.
728x90

임베디드 시스템을 개발하다 보면 통신 부분에서 RS232는 빠질 수 없는 부분이죠

 

그러나 대부분 RS232 RX Interrup에 대해서는 많이 들어보기도 했고 많이 사용하지만

 

TX Interrupt라는 것에 대해서는 내용자체도 많이 없어서 많이들 혼동하는 것 같습니다

 

오늘은 이 Tx Interrup라는 기능에 대해서 정리하고자 합니다

 

 

 

1) TX Interrup란 무엇인가?


TX Interrupt는 데이터를 송신할 때 사용되며 어떠한 상황에서 인터럽트가 걸리는 것일까??

 

바로 송신 버퍼가 비어있을때 즉 Tx 버퍼와 Rx 버퍼 두 개가 존재하고 이 중에서 Tx버퍼에

 

아무런 데이터도 들어있지 않은 상황을 말합니다

 

이부분을 조금 더 상세하게 풀어보면 마이컴단에서 플래그 레지스터를 가지고 설명해 볼게요

 

RS232 송신기는 UDRE(USART Data Register Empty)TXC(Transmit Complete)로 상태를

 

나타내는 두개의 플래그 레지스터가 존재합니다

 

UDRE 플래그는 송신 버퍼에서 새로운 데이터를 받아들일 준비가 됐다고 알리는 역할을 하고

 

송신 버퍼가 Empty(비어있을 때) 활성화되어 1로 세팅됩니다

 

하지만 아직 시프트 레지스터로 옮겨지지 않은 데이터가 있는 경우에는 0으로 세팅됩니다

 

또한 UDRE 플래그는 UDR에 새로운 값을 Write 하게 되면 0으로 클리어 됩니다

 

인터럽트를 통해 데이터가 전송이 되면 UDR 인터럽트 서비스 루틴은 UDRE 플래그를 클리어하기 위해

 

UDR에 새로운 데이터를 Write 하던지 UDR을 Disable 해 주어야 합니다

 

그렇지 않을 경우에는 인터럽트가 종료된 후에도 새로운 인터럽트가 발생하게 됩니다

 

TXC 플래그는 송신 시프트 레지스터에 있는 전체 프레임이 시프트로 출력되고

 

현재 송신 버퍼에 새로운 데이터가 있지 않으면 1로 세팅되며

 

이는 송신 버퍼에 데이터가 남아있지 않다고 알리는 역할을 합니다

 

TXC플래그는 송신 완료 인터럽트가 실행되거나 TXC에 1로 덮어쓰면 0으로 클리어 됩니다

 

UDRE 플래그와는 다르게 인터럽트가 수행되고 나면 TXC비트는 자동으로 클리어 되므로

 

TXC플래그를 따로 클리어해주는 작업은 필요하지 않습니다

 

 

 

2) 어떤 로직으로 사용해야 할까?


TX인터럽트는 그렇다면 코드상에서 어떻게 구현해야 할까요?

 

먼저 사용하기 전에 Tx Interrupt가 disable 되어 있고

 

데이터를 전송하기 전에 Tx Interrupt를 enable 시켜 Tx 버퍼가 비어있는지 확인하고

 

데이터를 전송하는 구조를 사용하는 것이 가장 깔끔한 것 같습니다

 

먼저 Tx Interrupt 서비스 루틴의 내용으로 인터럽트 발생 시(Tx Buffer가 비어있음)

 

데이터 1Byte를 시프트 레지스터로 밀고 다시 disable 시켜줍니다

 

이렇게 해주면 위에서 설명된 UDR이 disable 되어서 새로운 인터럽트가 걸리는 상황을 방지할 수 있습니다

 

자 그럼 사용하는 메인 문에서는 어떻게 해야 할까요?

 

내가 쏘고 싶은 타이밍에 Tx Interrupt를 enable 시켜주게 되면

 

시스템은 Tx 버퍼에 데이터가 있는지 확인하고 비어있으면 인터럽트를 발생시킵니다

 

자 이러한 구조로 사용을 한다면 Tx 인터럽트를 문제없이 사용할 수 있습니다

 

 

 

3) 어디에 사용될까?


단일 임베디드 시스템 상에서는 굳이 Tx Interrupt를 사용할 이유는 없어 보입니다

 

그러면 어떠한 경우에 사용될까요..?

 

아마도 여러 가지 멀티 프로세서가 돌아가는 시스템 상이라면 이야기가 달라질 것으로 보입니다

 

왜냐하면 동시다발적으로 RS232를 송신하는 시스템 상의 경우에는

 

데이터가 혼동될 가능성이 존재하기 때문에 Tx Interrupt를 사용하여

 

비어있는 경우에 송신 점유를 하는 방식으로 구성이 가능할 것으로 보입니다

728x90
반응형

댓글