stm32에서 printf 사용하기

#
printf("hello world!\r\n");
- printf 함수를 호출하면 printf함수 안에서 _write함수를 호출한다.
- stm32에는 표준 출력 장치가 없기 때문에 _write함수 내에서 출력 대상을 정해줘야 한다.
- _write함수는 systemcalls.c에 있다.

int _write(int file, char *ptr, int len)
{
for(int i=0; i<len; i++) {
LL_USART_TransmitData8(USART1, ptr[i]);
HAL_Delay(1); @
}
return len;
}

@ : 딜레이를 줘야 출력이 잘 된다.

int _write(int file, char *ptr, int len)
{
for(int i=0; i<len; i++) {
LL_USART_TransmitData8(USART1, ptr[i]);
while(!LL_USART_IsActiveFlag_TXE(USART1)); @
}
return len;
}

@ : 하지만 위의 방법은 데이터 전송이 끝나도 무조건 1ms를 기다려야 하는 것이기 때문에 효율적이지 않다. 따라서 LL_USART_IsActiveFlag_TXE(USARTx)함수를 써서 데이터 전송 레지스터가 비어있는지 확인 후 비어있으면 바로 다음 데이터를 전송한다.

#
/**
  * @brief  Check if the USART Transmit Data Register Empty Flag is set or not
  * @rmtoll SR           TXE           LL_USART_IsActiveFlag_TXE
  * @param  USARTx USART Instance
  * @retval State of bit (1 or 0).
  */
__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_TXE(USART_TypeDef *USARTx)
{
  return (READ_BIT(USARTx->SR, USART_SR_TXE) == (USART_SR_TXE));
}

Comments