목차
[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 에서 구매하실 수 있습니다.