목차
[WAT-STM32-2.8] 18번 예제 flag 사용으로 시리얼 통신 문자열보내기
WAT-STM32-2.8 예제 중 18번째로 flag를 사용하여 시리얼 통신으로 문자열을 보내는 예제입니다.
J4의 USB 커넥터에 USB Mini 5핀 케이블을 연결하고 다른 한쪽은 컴퓨터의 USB포트에 연결합니다.
이 실험에서 보드의 PL2303 를 사용하는데 컴퓨터에 드라이버가 설치되어 있지 않다면

주요 코드
main.c 파일입니다.
// WAT_STM3228_18 flag 사용으로 문자열 전송 실험 (시리얼 통신)
// 일정 간격으로 "WhiteAT.com & KIT128.com" 를 보내는 예제
// 전송이 완료되었는지를 flag로 처리를 하여 좀더 빠른 처리가 가능
// TX 인터럽트를 사용하면 좀더 효율적입니다.(추후 설명 예정)
// 보레이트 : 115200 bps
//
// 출처: https://docs.whiteat.com/?p=3885
//
#include "main.h"
#include "rcc.h"
#define LEDON (GPIOB->BRR = GPIO_Pin_2)
#define LEDOFF (GPIOB->BSRR = GPIO_Pin_2)
LED_init()
{
/* GPIOB Port Enable*/
RCC->APB2ENR |= RCC_APB2Periph_GPIOB;
/*-- GPIO Mode Configuration speed, input/output -----------------------*/
/*-- GPIOB max speed: 50MHz , General purpose output push-pull ---*/
GPIOB->CRL &= 0xFFFFF0FF;
GPIOB->CRL |= 0x00000300;
}
void Delay(vu32 nCount) //delay
{
for(; nCount != 0; nCount--);
}
#define USART_FLAG_CTS ((uint16_t)0x0200)
#define USART_FLAG_LBD ((uint16_t)0x0100)
#define USART_FLAG_TXE ((uint16_t)0x0080)
#define USART_FLAG_TC ((uint16_t)0x0040)
#define USART_FLAG_RXNE ((uint16_t)0x0020)
#define USART_FLAG_IDLE ((uint16_t)0x0010)
#define USART_FLAG_ORE ((uint16_t)0x0008)
#define USART_FLAG_NE ((uint16_t)0x0004)
#define USART_FLAG_FE ((uint16_t)0x0002)
#define USART_FLAG_PE ((uint16_t)0x0001)
/* USART Structure */
typedef struct
{
vu16 SR;
u16 RESERVED0;
vu16 DR;
u16 RESERVED1;
vu16 BRR;
u16 RESERVED2;
vu16 CR1;
u16 RESERVED3;
vu16 CR2;
u16 RESERVED4;
vu16 CR3;
u16 RESERVED5;
vu16 GTPR;
u16 RESERVED6;
} USART_TypeDef;
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
//USART 상태 읽기
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)
{
FlagStatus bitstatus = RESET;
/* Check the parameters */
/* The CTS flag is not available for UART4 and UART5 */
if ((USARTx->SR & USART_FLAG) != (uint16_t)RESET)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
// USART 플래그 초기화
void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG)
{
USARTx->SR = (uint16_t)~USART_FLAG;
}
/********* USART Adress 지정 *******/
#define PERIPH_BASE ((uint32_t)0x40000000)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define USART1_BASE (APB2PERIPH_BASE + 0x3800)
#define USART1 ((USART_TypeDef *) USART1_BASE)
// USART 초기화
void UART_init()
{
float USARTDIV;
u16 USARTDIV_zhengshu; //보레이트 계산용 임시 변수
u16 USARTDIV_xiaoshu; //보레이트 계산용 임시 변수
RCC->APB2ENR|=1<<2; //GPIOA Enable RCC_APB2Periph_GPIOA
RCC->APB2ENR|=1<<14; //USART1 Enable RCC_APB2Periph_USART1
/*-- GPIO Mode Configuration speed, input/output -----------------------*/
/*-- PA9 UART1_TX GPIO_Mode_AF_PP GPIO_Speed_50MHz ---*/
/*-- PA10 UART1_RX GPIO_Mode_IN_FLOATING ---*/
GPIOA->CRH&=0XFFFFF00F;
GPIOA->CRH|=0X000008B0;
/* BaudRate 115200*/
USARTDIV = (float)(72*1000000)/(115200*16);
USARTDIV_zhengshu = USARTDIV;
/* calculate baudrate */
USARTDIV_xiaoshu = (USARTDIV - USARTDIV_zhengshu)* 16;
USARTDIV_zhengshu <<=4;
USARTDIV_zhengshu += USARTDIV_xiaoshu;
/* USART1 reset */
RCC->APB2RSTR|=1<<14; // enable
RCC->APB2RSTR&=~(1<<14);// disable
USART1->BRR = USARTDIV_zhengshu;
/* #define CR1_UE_Set ((u16)0x2000) USART Enable Mask */
/* #define CR3_HDSEL_Set ((u16)0x0008) USART Half-Duplex Enable Mask */
USART1->CR1|=0X200C; // TX, RX enable
}
// 1개의 문자를 보냄
void USART_SendData(USART_TypeDef* USARTx, char *Data)
{
/* Data 포인터의 문자 전송 */
USARTx->DR = (*Data & (uint16_t)0x01FF);
/* 데이터 전송이 완료될때까지 기다림 */
/* 전송이 완료되기 전에 다른 데이터를 보내면 엉뚱한 데이터가 전송됩니다. */
while((USARTx->SR&0x40) == 0);
}
// 문자열을 보냄
void USART1_Printf(char *pch)
{
/* 마지막 문자 '\0' 이 나올때까지 모든 문자열 전송*/
while(*pch != '\0')
{
USART_SendData(USART1,pch); /* pch 포인터의 한 문자 전송 */
/* 데이터 전송이 완료될때까지 기다림 */
/* 전송이 완료되기 전에 다른 데이터를 보내면 엉뚱한 데이터가 전송됩니다. */
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
/* 전송이 완료되면 USART_FLAG_TXE 는 SET(즉, 1) 이 된다
SET이 된 후에는 RESET 을 해 줘야 한다. */
USART_ClearFlag(USART1, USART_FLAG_TXE);
pch++; /* 포인터 증가*/
}
}
int main(void)
{
RCC_init(); // RCC 초기화
LED_init(); // LED 초기화
UART_init(); // UART 초기화
while (1)
{
/* 문자열 "WhiteAT.com & KIT128.com"를 전송
* 마지막에 캐리지리턴(\n)로 함께 보냄 */
USART1_Printf("WhiteAT.com & KIT128.com\n");
LEDON; // LED ON
Delay(0xFFFFFF); // delay
LEDOFF; // LED OFF
Delay(0xFFFFFF); // delay
}
}
결과화면
시리얼 통신 프로그램으로 시리얼 데이터를 확인해 보면 ‘WhiteAT.com & KIT128.com ‘ 데이터가 주기적으로 수신됩니다.

WAT-STM32-2.8보드 전체 예제
제품 구매
WAT-STM32-2.8 [STM32F103RB Board + 2.8인치 TFT LCD 터치 세트] 는 https://kit128.com/goods/view?no=221 에서 구매하실 수 있습니다.

