STM32F103 ๊ณ„์—ด๋กœ UARTํ†ต์‹  ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ ๋‚ด์šฉ์ด๋‹ค. ์š”์ฆ˜ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ST์—์„œ๋Š” HAL๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ HAL๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‚˜์˜ค๊ธฐ ์ „์— ๊ฐœ๋ฐœ๋œ ํ”„๋กœ๊ทธ๋žจ๋“ค์„ ์œ ์ง€๋ณด์ˆ˜ ํ•ด์•ผ ํ•  ์ผ์ด ์žˆ๋‹ค.

 

1. UART ์ดˆ๊ธฐํ™”

๋ณด๋“œ ๊ตฌ์„ฑ์ด UART4๋ฅผ ํ†ตํ•ด ์‹œ๋ฆฌ์–ผ์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜์˜€๋‹ค.

RCC->APB1ENR |= RCC_APB1ENR_UART4EN;
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;

GPIOC->CRH |= (0x0BUL << 8);         // PC10 = OUTPUT
GPIOC->CRH |= (0x08UL << 12);         // PC11 = INPUT

UART4->BRR = 36000000L / 9600L; // SET BR 9600

UART4->CR1 |= (1 << 3 ) | (1 << 2 ); // 3:TX, 2:RX
UART4->CR1 |= (1 << 13); // UART EN

 

 

1.1. ํด๋Ÿญ ์„ธํŒ…

(1) UART ํด๋Ÿญ ํ™œ์„ฑํ™”

๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” ํด๋Ÿญ์ด ํ•„์š”ํ•˜๋‹ค. ์ด๋•Œ UART์šฉ์œผ๋กœ ์‚ฌ์šฉํ•  ํด๋Ÿญ์„ ํ™œ์„ฑํ™” ์‹œ์ผœ์ฃผ๋Š” ๋‹จ๊ณ„์ด๋‹ค.

RCC->APB1ENR |= RCC_APB1ENR_UART4EN;

์ฐธ๊ณ ๋ฌธ์„œ : RM0008 (Reference manual)

 

๋ ˆ์ง€์Šคํ„ฐ๋Š” RCC_APB1ENR๋กœ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์˜จ๋‹ค. UART4๋Š” 19๋ฒˆ ๋น„ํŠธ์ด๋‹ค.

 

ํ˜„์žฌ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ณด๋“œ(STM32F103VET6์‚ฌ์šฉ)์— ์—ฐ๊ฒฐ๋œ UARTํ•€(PC11/RX4, PC10/TX4)์€ UART4์— ํ•ด๋‹นํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์œ„์™€ ๊ฐ™์ด UART4์˜ ํด๋Ÿญ์„ ํ™œ์„ฑํ™”ํ•˜์˜€๋‹ค.

 

RCC_APB1ENR_UART4EN์€ stm32f103xe.h ํ—ค๋” ํŒŒ์ผ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

#define RCC_APB1ENR_UART4EN_Pos              (19U)                             
#define RCC_APB1ENR_UART4EN_Msk              (0x1U << RCC_APB1ENR_UART4EN_Pos) /*!< 0x00080000 */
#define RCC_APB1ENR_UART4EN                  RCC_APB1ENR_UART4EN_Msk           /*!< UART 4 clock enable */

 

(2) PORT ํด๋Ÿญ ํ™œ์„ฑํ™”

UART4๋Š” PORTC์— ํ•ด๋‹นํ•œ๋‹ค. ๊ทธ๋ž˜์„œ PORTC์˜ ํด๋Ÿญ์„ ํ™œ์„ฑํ™”ํ•˜๊ฒ ๋‹ค.

RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;

 

๋ ˆ์ง€์Šคํ„ฐ๋Š” RCC_APB2ENR๋กœ PORTC๋Š” 4๋ฒˆ ๋น„ํŠธ์ด๋‹ค.

 

 

 

RCC_APB2ENR_IOPCEN์€ stm32f103xe.h ํ—ค๋” ํŒŒ์ผ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

#define RCC_APB2ENR_IOPCEN_Pos               (4U)                              
#define RCC_APB2ENR_IOPCEN_Msk               (0x1U << RCC_APB2ENR_IOPCEN_Pos)  /*!< 0x00000010 */
#define RCC_APB2ENR_IOPCEN                   RCC_APB2ENR_IOPCEN_Msk            /*!< I/O port C clock enable */

 

(3) BAUD RATE ์„ธํŒ…

UART4->BRR = 36000000L / 9600L; // SET BR 9600

ํ†ต์‹  ์†๋„๋ฅผ ์„ธํŒ…ํ•ด์•ผ ํ•œ๋‹ค. UART4๋Š” 36MHz๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ๋ณด๋“œ๋ ˆ์ดํŠธ๋ฅผ 9600์œผ๋กœ ์„ค์ •ํ•˜์˜€๋‹ค.

 

 

1.2 ํ•€ ์„ค์ •

PORTC์˜ I/O์— ๋Œ€ํ•œ ์„ค์ •์ด๋‹ค. ์ž…๋ ฅ์ด๋ƒ ์ถœ๋ ฅ์ด๋ƒ๋ฅผ ์ •ํ•ด์ฃผ๋Š” ๋‹จ๊ณ„์ด๋‹ค. ์ž…๋ ฅ์€ RX ์ˆ˜์‹ ์ด๋  ๊ฒƒ์ด๊ณ , ์ถœ๋ ฅ์€ TX ์†ก์‹ ์ด ๋  ๊ฒƒ์ด๋‹ค.

 

(1) TX(์†ก์‹ )

์†ก์‹  ์‹ ํ˜ธ TX๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋‹จ๊ณ„์ด๋‹ค. PC10ํ•€์— ํ•ด๋‹นํ•œ๋‹ค.

GPIOC->CRH |= (0x0BUL << 8);         // PC10 = OUTPUT

 

๋ ˆ์ง€์Šคํ„ฐ๋Š” GPIOx_CRH๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋‚˜์˜จ๋‹ค. PC10์— ํ•ด๋‹นํ•˜๋Š” ๋น„ํŠธ๋Š” 8~11๋ฒˆ์ด๋‹ค.

 

 

0x0B๋Š” 0000 1011์ธ๋ฐ ์ด๊ฑธ ์™ผ์ชฝ์œผ๋กœ 8-bit ์‹œํ”„ํŠธ์‹œํ‚ฌ ๊ฒƒ์ด๋‹ค.

 

 

CNF์™€ MODE๋Š” ํ•ด๋‹นํ•€์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ ๋ฐ ์ž…์ถœ๋ ฅ ๋ชจ๋“œ์— ์„ค์ •์ด๋‹ค. UART๋กœ ์‚ฌ์šฉ์‹œ Alternate function์œผ๋กœ ์„ค์ •ํ•ด ์ฃผ๋ฉด ๋œ๋‹ค. ์ž…์ถœ๋ ฅ ๋ชจ๋“œ๋Š” TX๋Š” ์†ก์‹ ์ด๋‹ˆ output์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Push-pull๊ณผ Open-drian์€ ์šฉ๋„์— ๋งž๊ฒŒ ๊ณ ๋ฅด๋ฉด ๋˜์ง€๋งŒ, ์™ธ๋ถ€์— ํ’€์—…/ํ’€๋‹ค์šด ์ €ํ•ญ์ด ์—†์œผ๋ฉด Push-pull๋กœ ์„ ํƒํ•˜์ž. ์†๋„๋Š” ์ตœ๋Œ€ 50MHz๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์˜€๋‹ค.

 

 

 

(2) RX(์ˆ˜์‹ )

์ˆ˜์‹  ์‹ ํ˜ธ RX๋ฅผ ํ™œ์„ฑํ™”์‹œํ‚ค๋Š” ๋‹จ๊ณ„์ด๋‹ค. PC11ํ•€์— ํ•ด๋‹นํ•œ๋‹ค.

GPIOC->CRH |= (0x08UL << 12);         // PC11 = INPUT

 

๋ ˆ์ง€์Šคํ„ฐ๋Š” GPIOx_CRH๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋‚˜์˜จ๋‹ค. PC11์— ํ•ด๋‹นํ•˜๋Š” ๋น„ํŠธ๋Š” 12~15๋ฒˆ์ด๋‹ค.

 

 

MODE๋Š” 00์œผ๋กœ ์ž…๋ ฅ ๋ชจ๋“œ๋กœ ์„ค์ •ํ•˜์˜€๋‹ค. CNF๋Š” 01๋กœ ์„ค์ •ํ•˜์—ฌ ํ”Œ๋ฃจํŒ… ์ž…๋ ฅ์ด๋‹ค. ๋ฐ›๋Š” ์ •๋ณด๊ฐ€ ์—†์„๋•Œ ๊ธฐ๋ณธ ์ƒํƒœ ๊ฐ’์ด ์—†๋‹ค. ํ’€์—…ํ•˜๋ฉด '1'์‹ ํ˜ธ, ํ’€๋‹ค์šดํ•˜๋ฉด '0' ์‹ ํ˜ธ๊ฐ€ ๊ธฐ๋ณธ ์ƒํƒœ ๊ฐ’์ผ ๊ฒƒ์ด๋‹ค.

 

 

1.3. ์ œ์–ด ๋ชจ๋“œ ์„ค์ •

๋งˆ์ง€๋ง‰์œผ๋กœ UART์™€ TX, RX๋ฅผ ํ™œ์„ฑํ™”์‹œ์ผœ์ฃผ๋Š” ๋‹จ๊ณ„์ด๋‹ค.

 

๋ ˆ์ง€์Šคํ„ฐ๋Š” USART_CR1๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋‚˜์˜จ๋‹ค.

 

 

 

 

 

 

(1) TE & RE

์†ก์‹  ํ™œ์„ฑํ™”๋Š” 3๋ฒˆ ๋น„ํŠธ์ด๊ณ , ์ˆ˜์‹  ํ™œ์„ฑํ™”๋Š” 2๋ฒˆ ๋น„ํŠธ์ด๋‹ค.

UART4->CR1 |= (1 << 3 ) | (1 << 2 ); // 3:TX, 2:RX

 

(2) UE

๊ฐ€์žฅ ์ค‘์š”ํ•œ UART๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋น„ํŠธ์ด๋‹ค. ๋น„ํŠธ ๋ฒˆํ˜ธ๋Š” 13๋ฒˆ์ด๋‹ค.

UART4->CR1 |= (1 << 13); // UART EN

 

 

2. ์ฃผ๊ณ  ๋ฐ›๊ณ  ๊ธฐ๋Šฅ

์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๊ฐ€ ๋๋‚ฌ์œผ๋ฉด ์ด์ œ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

int uart_getch()
{
	while( ! (UART4->SR & (1<<5) ) );        // RXNE : Read data register not empty, 1 : Received data is ready to be read.
	return ((int) (UART4->DR 	& 0xFF));		 // 0xFF
}

void uart_putch(int val)
{
	while(!(UART4->SR & (1<<7)));        		 // TXE : Transmit data register empty, 1 :  Data is transferred to the shift register
	UART4->DR = (val & 0xFF);
}

 

uart_getch()ํ•จ์ˆ˜๋Š” ์ˆ˜์‹ ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๊ณ , ์ฝ์„ ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์œผ๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌํ„ด์‹œํ‚จ๋‹ค.

uart_putch(int val)ํ•จ์ˆ˜๋Š” ์ „์†ก ๋ฒ„ํผ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๋น„์–ด์žˆ์œผ๋ฉด ์œ„์—์„œ ๋ฆฌํ„ด์‹œํ‚จ ๋ฐ์ดํ„ฐ(TDR์˜ ๋ฐ์ดํ„ฐ)๋ฅผ ๋ฐ›์•„์„œ ์‹œํ”„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋กœ ์ด๋™์‹œ์ผœ์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถœ๋ ฅ๋˜๊ฒŒ ํ•œ๋‹ค.

buff = uart_getch();
uart_putch(buff);

 

์ด์ œ ์ค€๋น„๊ฐ€ ๋‹ค ๋˜์—ˆ๋‹ค. ์ฝ˜์†” ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ํ…Œ๋ผํ…€์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ดํ•‘ํ•œ ๊ฐ’์ด ์ž˜ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์˜€๋‹ค.

๋ฐ˜์‘ํ˜•
  • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
  • ๋„ค์ด๋ฒ„ ๋ฐด๋“œ์— ๊ณต์œ ํ•˜๊ธฐ
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
  • ์นด์นด์˜ค์Šคํ† ๋ฆฌ ๊ณต์œ ํ•˜๊ธฐ

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."