[WAT-STM32-2.8]17번 예제 시리얼 통신 문자열 보내기

[WAT-STM32-2.8] 17번 예제  시리얼 통신 문자열보내기

WAT-STM32-2.8 예제 중 17번째로 시리얼 통신으로 문자열을 보내는 예제입니다.

J4의 USB 커넥터에 USB Mini 5핀 케이블을 연결하고 다른 한쪽은 컴퓨터의 USB포트에 연결합니다.

이 실험에서 보드의 PL2303 를 사용하는데 컴퓨터에 드라이버가 설치되어 있지 않다면

먼저 드라이버를 설치를 해줘야 합니다.(https://docs.whiteat.com/?p=959)

 

 

 

주요 코드

main.c 파일입니다.

// WAT_STM3228_17 문자열 전송 실험 (시리얼 통신)
// 1초 간격으로 "WhiteAT.com & KIT128.com" 를 보내는 예제
// 보레이트 : 115200 bps
//
// 출처: https://docs.whiteat.com/?p=3880
// 

#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--);
}

/*  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;

/********* 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)
{   
  USARTx->DR = *Data;

  /* 데이터 전송이 완료될때까지 잠시 기다림 */
  /* 지금은 delay 를 사용했지만 나중에는 완료되었는지 flag를 체크할 것이다.*/
  Delay(0xFFF);		   
}

// 1개의 문자열을 보냄
void USART1_Printf(char *pch) 
{
	/* 마지막 문자 '\0' 이 나올때까지 모든 문자열 전송*/
    while(*pch != '\0')	
	{
        USART_SendData(USART1,pch); /* pch 포인터의 한 문자 전송 */
        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 터치 세트

제품 구매

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

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다