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

STM32. UART 특성 시험.

by 리치굿맨 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.

'임베디드.일렉트로닉스 > STM32' 카테고리의 다른 글

STM32. SPI 인터럽트 방식.  (0) 2016.07.15
STM32. GPIO 속도 향상.  (0) 2016.07.15
STM32. UART 특성 시험.  (0) 2016.06.28
STM32. CubeMX 다른프로젝트 복사해서 만들기.  (0) 2016.06.28
STM32. USB HID 구현.  (0) 2016.04.14
STM32. DfuSe Demo 사용법.  (0) 2016.04.12

태그

,

댓글0


   
현물 |선물 인버스 |선물 USDT     현물 | 선물 USDT |봇제작툴/카피트레이딩     현물 |선물 인버스 |선물 USDT     선물 인버스 |선물 USDT