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);
์ด์ ์ค๋น๊ฐ ๋ค ๋์๋ค. ์ฝ์ ํ๋ก๊ทธ๋จ์ผ๋ก ํ ๋ผํ ์ ์ฌ์ฉํ์ฌ ํ์ดํํ ๊ฐ์ด ์ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ์๋ค.
'EMBEDED > STM (CM3,4,7...)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[STM] STM32F103C8T6์ผ๋ก ADXL345 ๊ฐ์๋(์์ด๋ก) ์ผ์ I2C๋ก ์ ์ดํ๊ธฐ (0) | 2023.04.26 |
---|---|
[STM] STM32F103C8T6์ผ๋ก SHT20 ์จ์ต๋ ์ ์ด I2C๋ก ์ ์ดํ๊ธฐ (0) | 2023.04.25 |
[STM] STM32F103, ADC 2์ฑ๋ ์ฝ๊ธฐ (0) | 2022.09.14 |
[STM] MCU SPI ์ธํ (0) | 2022.09.14 |
[STM] STM32F103์ผ๋ก I2C ์ธํฐํ์ด์ค EEPROM ์ ์ดํ๊ธฐ (0) | 2022.08.24 |
์ต๊ทผ๋๊ธ