STM32 UART - FabLabSeoul/WingProject GitHub Wiki
STM32 UART
์ฌ๊ธฐ์๋ Stm32 ์๋ฆฌ์ผํต์ ์ ๊ดํด์ ์ค๋ช ํ๋ค. ์๋ฆฌ์ผ ํต์ ์ ๊ดํด์๋ http://www.ni.com/white-paper/2895/ko/ ๊ธ์ ์ฐธ์กฐํ์.
์๋ฆฌ์ผํต์ ์ ๋ ์ ๋ง ์ฐ๊ฒฐํ๋ฉด ์๋ก ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค. ๋ ์ ์ ๊ฐ๊ฐ Rx, Tx ๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ ๋ณด๋ฅผ ์์ ํ๋ ์ ์ Rx, ์ก์ ํ๋ ์ ์ Tx๋ผ๊ณ ํ๋ค. (๊ทธ๋ผ์ด๋ ์ ๊น์ง ํฉ์น๋ฉด, ์ด Rx,Tx,GND ์ ์ด ํ์ํ๋ค.) ๊ทธ๋์ ์๋ฆฌ์ผํต์ ์ ์๋ฐฉํฅ ํต์ ์ด๋ค. ํ๋์จ์ด๊ฐ์ ํต์ ์ผ๋ก ๋ง์ด ์ฐ์ด๊ณ , ๋๋ฒ๊น ์๋ ๋ง์ด ์ฐ์ด๊ธฐ ๋๋ฌธ์ ์ ์์ ๋์ด์ผ ํ๋ค.
Stm32 Value line discovery๋ณด๋๋ USART ๋ชจ๋์ด 2๊ฐ ์๋ค. USART1, USART2๊ฐ ๊ทธ๊ฒ์ด๋ค.
UART์ ๊ดํ ์์ธํ ๋ด์ฉ์ Stm32F103์์ฉ.pdf ํ์ผ์ ์ฐธ๊ณ ํ์.
์ด ์์ ๋ Stm32 Value line discovery ๋ณด๋๋ฅผ ๋๋ฒ๊น ํ๊ธฐ ์ํ ์๋ฆฌ์ผํฌํธ ํต์ ์์ค๋ค. ํนํ ์์ด๋ก์ผ์, ๊ฐ์์ผ์ ์ ๋ณด๋ฅผ ํฌํธ์์ ์ ๋ ฅ๋ฐ์ ์๊ฐํํ๋ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ์ํด ์ฐ๊ตฌํ๋ค. ์ผ์๋ก๋ถํฐ ๋ฐ์ ์๋ ๋ก๊ทธ ์ ๋ ฅ ๊ฐ์ ๊ทธ๋ํํ ์ํค๊ธฐ์ํด ์๋ฆฌ์ผ ํต์ ์ผ๋ก ์๋์ด๋ ธ ๋ณด๋์ ์ ๋ ฅํ๊ณ , ์๋์ด๋ ธ ๋ณด๋๋ ๋ค์ ์ปดํจํฐ์ ์๋ฆฌ์ผ ํต์ ์ํด์ ์ต์ข ์ ์ผ๋ก Processing์ผ๋ก ๊ตฌํ๋ Graphic System์ผ๋ก ๊ฒฐ๊ณผ๋ฌผ์ ์ถ๋ ฅํ๊ฒ ํ๋ค. ๊ฐ๋จํ ๋ฐฉ๋ฒ์ Stm32 ๋ณด๋์์ ๋ฐ๋ก ์ปดํจํฐ์ ์๋ฆฌ์ผ ํต์ ์ ํ๋ ๊ฒ์ธ๋ฐ, ์์ง ๊ทธ ๋ถ๋ถ์ ์ดํดํ์ง ๋ชปํ๋ค.
Stm32 ๋ณด๋๋ฅผ USBํฌํธ๋ก ์๋ฆฌ์ผ ํต์ ํ๋ ๋ฐฉ๋ฒ์ Stm32 Serial debugging ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์.
USART, UART, Serial ์ ๊ดํ ๋ฌธ์๋ http://en.wikipedia.org/wiki/Universal_asynchronous_receiver/transmitter ์์ ํ์ธํ์. ๊ฐ๋จํ ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค. USART > UART > Serial
์ด ์์ ๋ STM32\stm32vldiscovery_package\Project\Examples\Serial ํด๋์ ์๋ค. STM32 Value line discovery ์ฉ์ผ๋ก ๋ง๋ค์ด์ง ์์ ๋ค.
์๋ฆฌ์ผ ํต์ Rx,Tx ์ค์
PA10-Rx, PA9-Tx ๋ก ํฌํธ๋ฅผ ์ค์ ํ๋ค. ํฌํธ๋ฅผ Alternate Function ๋ชจ๋๋ก ์ค์ ํ ๊ฒ์ ์ฃผ๋ชฉํ์. I2C์ค์ ๋ ์ด์ ๋น์ทํ๋ค.
GPIO_InitTypeDef GPIO_InitStructure;
// RCC Configuration
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// Port ์ค์
// PA9 - Tx
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// PA10 - Rx
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART ์ค์
ADC, DAC ๋ฌธ์๋ฅผ ์์งํ๋ค๋ฉด, USART ๋ํ ํฌ๊ฒ ๋ค๋ฅผ๊ฒ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ํด๋ญ์ ์ค์ ํ๊ณ , USART์ ๊ดํ ์ต์ ์ ์ ํํ๊ณ , Enable์ ์ค์ ํ๋ฉด ๋๋ค. ์ ์ก์ ํฌ๊ธฐ๋ 1 ๋ฐ์ดํธ ๋จ์์ด๊ณ , 1 ์ด์ 9600 ๋นํธ๋ฅผ ์ ์กํ ์ ์๋ค. ์ด ์ ์ก๋์ ๋์ด๊ฐ๋ฉด ๋นํธ๊ฐ ๋ฐ๋ ค์ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ ์ฒด ์ ๋ณด๊ฐ ๊นจ์ง๊ฒ ๋๋ค. ๋ณด๋ ๋ ์ดํธ๋ฅผ ์ฃผ์ํด์ ์ค์ ํ์. ํ ์คํธ ๊ฒฐ๊ณผ 19200๊น์ง ์ ์๋ํ๋ค. USART์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋งค๋ด์ผ์ ์ฐธ์กฐํ์.
USART_InitTypeDef USART_InitStructure;
// RCC Configuration
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );
// UART Port ์ค์
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
์๋ฆฌ์ผ ํต์
ํ ๋ฐ์ดํธ์ฉ ์ ๋ณด๋ฅผ ์ก์ ํ๋ค. USART_SendData2() ํจ์๋ ๊ธฐ์กด stm32f10x_usart.h ํ์ผ์ ์ ์ธ๋ USART_SendData() ํจ์์ ๊ธฐ๋ฅ์ ์ผ๋ก ๊ฑฐ์ ๊ฐ์ง๋ง, ํจ์ ์ธ์๊ฐ unsigned short ์์ short ๋ฐ๊ผ๋ค๋ ์ ์์ ๋ค๋ฅด๋ค. unsigned short๊ฐ ํจ์์ธ์๊ฐ ๋๋ฉด, ์์๋ก ๋ ์ ๋ณด๋ฅผ ์ก์ ํ ๋, ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.
void print_byte(short c)
{
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);
USART_SendData2(USART1, c);
}
void loop(void)
{
print_byte( '1' );
osa_mdelay(100);
print_byte( '0' );
osa_mdelay(100);
}
์ต์ข ์์ ์ฝ๋
์ด ์์ ๋ STM32 ์์ '1' ๊ณผ '0' ์ ๋ณด๋ฅผ ์๋ฆฌ์ผ ํต์ ์ ํตํด ๋ณด๋ธ๋ค. RxTx ํฌํธ๋ ๊ฐ๊ฐ PA10, PA9 ๋ฒ ํฌํธ๋ค. ์ด ํฌํธ๋ฅผ ์๋์ด๋ ธ ๋ณด๋์ RxTx ํฌํธ์ ์ฐ๊ฒฐํ๋ค. ์ ํํ ๋งํ๋ฉด, STM32 Rx -> Arduino Tx, STM32 Tx -> Arduino Rx ์ ์ฐ๊ฒฐํ๋ค. ์๋์ด๋ ธ ๋ณด๋๋ ์๋ฆฌ์ผํฌํธ๋ฅผ ์ฝ์ด '1' ์ผ ๋์ '0'์ผ ๋ ๊ฐ๊ฐ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์๋ฆฌ์ผ ํต์ ์ ํ๊ฒ ํ๋ค. ์๋์ด๋ ธ์ PC๊ฐ ์ฐ๊ฒฐ๋ ์ํ๋ผ๋ฉด, Processing์ผ๋ก ๋ง๋ค์ด์ง ํ๋ก๊ทธ๋จ์ด ์๋ฆฌ์ผ ํต์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๊ทธ๋ํฝ์ผ๋ก ํํํ๋ค.
๋ ๊ฐ ํ๋ก์ ํธ์์๋ ์์ด๋ก์ผ์ ์ ๋ณด, x,y,z ๊ฐ์์ผ์ ์ ๋ณด x,y,z ๋ฅผ ์๋ฆฌ์ผ ํต์ ์ผ๋ก ์๋์ด๋ ธ์ ์ ๋ฌํ๊ณ , ์๋์ด๋ ธ๋ ๋ค์ PC๋ก ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ฒ ํ๋ค. ์ต์ข ์ ์ผ๋ก Processing ์์๋ ๊ทธ ์ ๋ณด๋ฅผ ํ๋ฉด์ ๊ทธ๋ํฝ์ผ๋ก ํํํ๊ฒ ํ๋ค.
STM32 ๋ณด๋์์ Processing๊ณผ ์๋ฆฌ์ผ ํต์ ์ด ๊ฐ๋ฅํ๋ค๋ฉด, ์๋์ด๋ ธ๋ฅผ ํตํ ํ์๊ฐ ์๋ค. ์์ง ๊ทธ ๋ฐฉ๋ฒ์ ์ฐพ์ง ๋ชปํ๋ค.
์ด ์์ค๋ ์ค์ ์์ ์์ค์ ์กฐ๊ธ ์ฐจ์ด๊ฐ ๋ ์ ์๋ค.
#include "stm32f10x.h"
void __attribute__((weak)) osa_mdelay(unsigned int msec);
void print_byte(unsigned short c);
void setup(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
// RCC Configuration
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// Port ์ค์
// PA9 - Tx
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// PA10 - Rx
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// UART Port ์ค์
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}
void loop(void)
{
print_byte( '1' );
osa_mdelay(1000);
print_byte( '0' );
osa_mdelay(1000);
}
int main(void)
{
setup();
while(1)
{
loop();
}
}
void __attribute__((weak)) osa_mdelay(unsigned int msec)
{
uint32_t temp;
SysTick->LOAD=(uint32_t)msec*(HSE_VALUE/1000);
SysTick->VAL =0x00; // clear Count flag
SysTick->CTRL=0x01;
do
{
temp=SysTick->CTRL;
}
while((temp&0x01)&&!(temp&(1<<16))); // wait Count flag set
SysTick->CTRL=0x00;
SysTick->VAL =0X00;
}
void __attribute__((weak)) delay_us(unsigned int usec)
{
uint32_t temp;
SysTick->LOAD=(uint32_t)usec*(HSE_VALUE/1000000);
SysTick->VAL =0x00; // clear Count flag
SysTick->CTRL=0x01;
do
{
temp=SysTick->CTRL;
}
while((temp&0x01)&&!(temp&(1<<16))); // wait Count flag set
SysTick->CTRL=0x00;
SysTick->VAL =0X00;
}
void print_byte(unsigned short c)
{
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);
USART_SendData(USART1, c);
}
================================