본문 바로가기
임베디드.일렉트로닉스/STM32

STM32. UART 특성 시험.

by i.got.it 2016. 6. 28.
 

개요

 
STM32 UART 특성 시험. 

시험환경.
MCU : STM32L476 .
system clock : 80MHz.
USART2 설정.
- baud rate : 10Mbps.
- stop bit 1bit, data bit 8bit, parity no.
STM32Cube 펌웨어라이브러리 버전 : FW_L4 V1.5.1 <- 2016년 6월 28일 시점 최신버전.

핀 결선.

MCU1 USART2  

 MCU2 USART2 

 스코프 연결

 TX 

 RX

 D1

 RX

 TX

 D3

 CTS

 RTS

 D2

 RTS

 CTS

 D4


 


 

 

Test-1

   
설정.
MCU1 : while문 내에서 1회 1바이트 전송. Blocking  함수 HAL_UART_Transmit 사용.

MCU1측 코드. 

MCU2 측 코드.  

uint8_t tx_data[100];

int main(void)

{

  for(uint8_t i=0;i<100;i++){tx_data = 0x55;}

  while(1)

  {

     HAL_UART_Transmit(&huart2,tx_data,1,1000);

  }

}


없음.



스코프 MCU1의 TX


HAL_UART_Transmit 호출 사이의 latency : 3.36us.

이 시간한계 때문에 1바이트 단위의 전송의 실효 출력 속도는 UART에서 설정한 1Mbps 불가능하며, 0.3Mbps 정도.


 


 

 

Test-2

   
설정.
MCU1 : while문 내에서 1회 100바이트 전송. Blocking  함수 HAL_UART_Transmit 사용.

MCU1측 코드. 

MCU2 측 코드.  

uint8_t tx_data[100] ;

int main(void)

{

  for(uint8_t i=0;i<100;i++){tx_data = 0x55;}

  while(1)

  {

     HAL_UART_Transmit(&huart2,tx_data,100,1000);

  }

}


없음.



스코프 MCU1의 TX


1회의 HAL_UART_Transmit 호출시 인자로 전달된 100바이트 전송중에는 끊김없는 완전한 1Mbps 전송되며

다음 HAL_UART_transmit 호출시 중간에 2usec 정도의 시간 지연있음. 함수 1회 호출당 100바이트 단위 전송시 1초간의 실효출력속도는 9.8Mbps 이며 UART에서 설정한 10Mbps baud rate 를 사용한 효과 볼 수 있다. 


 


 

 

Test-3

   
설정.
MCU1 : DMA  함수 HAL_UART_Transmit_DMA 사용. 1회 1바이트 전송.

MCU1측 코드. 

MCU2 측 코드.  

uint8_t tx_data[100];

int main(void)

{

  for(uint8_t i=0;i<100;i++){tx_data = 0x55;}

  HAL_UART_Transmit_DMA(&huart2,tx_data,1);

  while(1)

  {

  }

}


// interrupt handler.

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){

     HAL_UART_Transmit_DMA(&huart2,tx_data,1);

}

없음.



스코프 MCU1의 TX


HAL_UART_Transmit_DMA 호출 사이의 latency : 7.36us. <- HAL_UART_Transmit 의 3.36us보다 더 길다.


 


 

 

Test-4

 

설정.
MCU1 : DMA  함수 HAL_UART_TransmitDMA 사용. 1회 100바이트 전송.

MCU1측 코드. 

MCU2 측 코드.  

uint8_t tx_data[100];

int main(void)

{

  for(uint8_t i=0;i<100;i++){tx_data = 0x55;}

  HAL_UART_Transmit_DMA(&huart2,tx_data,100);

  while(1)

  {

  }

}


// interrupt handler.

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){

     HAL_UART_Transmit_DMA(&huart2,tx_data,100);

}

없음.



스코프 MCU1의 TX


100바이트 단위 전송시 1초간 실효통신 속도 : 9.6Mbps.

 


 

 

Test-5

 

설정.
MCU1,2의 UART H/W Flow Control enable.

MCU1 : while문 내에서 1회 1바이트 전송. - Blocking  함수 HAL_UART_Transmit 사용. 

MCU2 : while문 내에서 1회 1바이트 수신. - Blocking  함수 HAL_UART_Receive 사용. 


MCU1측 코드. 

MCU2 측 코드.  

uint8_t tx_data[100];

int main(void)

{

  for(uint8_t i=0;i<100;i++){tx_data = 0x55;}

  while(1)

  {

     HAL_UART_Transmit(&huart2,tx_data,1,1000);

  }

}


uint8_t rx_data[100] ;

int main(void)

{

  while(1)

  {

     HAL_UART_Receive(&huart2,rx_data,1,1000);

  }

}



스코프. MCU1의 TX, MCU2 의 RTS

- MCU1 에서 TX 직후 MCU2에서는 RTS High 되었다가 Low 이후 한참있다가 MCU1의 다음 TX전송됨.

- 즉, MCU1 의 TX 전송간의 시간격이 길기 때문에 1바이트 단위로 전송함수 호출하는 방식에서는 H/W Flow Control 하나 마나 임.


 


 

 

Test-6

 

설정.
MCU1,2의 UART H/W Flow Control enable.

MCU1 : 함수 HAL_UART_Transmit_DMA 1회 호출당 100바이트 송신. 

MCU2 : 함수 HAL_UART_Receive_DMA 1회 호출당 100바이트 수신.


MCU1측 코드. 

MCU2 측 코드.  

uint8_t tx_data[100];

int main(void)

{

  for(uint8_t i=0;i<100;i++){tx_data = 0x01;}

  HAL_UART_Transmit_DMA(&huart2,tx_data,100);

  while(1)

  {

  }

}


// UART TX interrupt handler.

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){

     HAL_UART_Transmit_DMA(&huart2,tx_data,100);

}


uint8_t rx_data[100];

int main(void)

{

  HAL_UART_Receive_IT(&huart2,rx_data,100);//DMA아님.

  while(1)

  {

  }

}


// UART RX interrupt handler.

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){

     HAL_UART_Receive_DMA(&huart2,rx_data,100);

}


스코프. MCU1의 TX, MCU2 의 RTS



 


 

 

Test-7

 

설정.
MCU1,2의 UART H/W Flow Control enable.

MCU1 : 함수 HAL_UART_Transmit_DMA 1회 호출당 100바이트 송신. 

MCU2 : 함수 HAL_UART_Receive 1회 호출당 100바이트 수신.


MCU1측 코드. 

MCU2 측 코드.  

uint8_t tx_data[100];

int main(void)

{

  for(uint8_t i=0;i<100;i++){tx_data = 0x01;}

  HAL_UART_Transmit_DMA(&huart2,tx_data,100);

  while(1)

  {

  }

}


// UART TX interrupt handler.

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){

     HAL_UART_Transmit_DMA(&huart2,tx_data,100);

}


uint8_t rx_data[100];

int main(void)

{

  while(1)

  {

     HAL_UART_Receive(&huart2,rx_data,100,1000);

  }

}



스코프. MCU1의 TX, MCU2 의 RTS



 


 



 

 본 글이 포함된 상위 정리장소 : http://igotit.tistory.com/244

 

 


///784.

댓글



 

비트코인




암호화폐       외환/나스닥/골드       암호화폐/외환/나스닥/골드 암호화폐/외환/나스닥/골드   암호화폐/외환/나스닥/골드
     
현물 |선물 인버스 |선물 USDT       전략매니저(카피트레이딩)     롤오버 이자 없는 스왑프리계좌
( 스왑프리 암호화폐도 거래 가능 )    
MT4, MT5 , cTrader 모두 지원     FTMO 계좌 매매운용. MT4,MT5