이번 강좌에서는 UART 컨트롤을 해볼까 합니다. Boot-Up Sequence가 정상적으로 이루어 지면, Debugging 혹은 Host와의 기본적인 통신을 위해 일반적으로 UART를 살리게 됩니다.
이번 강좌의 목적은 UART를 통한 Character 입/출력을 Host PC의 Terminal을 통해 확인하는 과정입니다.
역시 Base Code는 http://lifeseed.tistory.com/75 게시물의 첨부파일이며, UART통신을 위한 Library가 포함되어야 하므로 컴파일전 추가 수정사항이 필요합니다.
SmartRobot Board의 J7-11, 12번 및 J8-20에 USBtoSerial 보드의 Rx, Tx 그리고 Ground에 각각 연결합니다. 물론 SmartRobot Board의 UART1을 위한 전용 핀에 연결하여도 됩니다. 그리고 STM32F10x의 UART Pin을 이용하게 되므로, UART1 과 핀을 공유하는 GPIO PA9,10은 앞의 강의에서 실습한 GPIO 입출력으로 사용할 수 없습니다.
srbd_bsp_ex.zip :: Base Code
srbd_bsp_printf_ex.zip :: UART 수정 코드
void setup(void) USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );
/* J7-11 PA9 */
/* J7-12 PA10 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
// UART Port 설정 USART_InitStructure.USART_BaudRate = 115200 ; USART_Init(USART1, &USART_InitStructure);
void loop(void) char data = 0; if ( USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET)
while ((USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET); USART_SendData(USART1, (uint16_t)data);
} |
arch/main.c 의 setup 및 loop함수에 위와 같이 코딩하고 cs-make를 통하여 Build합니다.
컴파일 에러가 날 경우 gpio, usart library를 include해야 합니다.
1) arch/include/stm32f10x_conf.h 의 38, 47라인의 주석을 풀어줍니다.
/* #include "stm32f10x_gpio.h" */ => #include "stm32f10x_gpio.h" /* #include "stm32f10x_usart.h" */ => #include "stm32f10x_usart.h"
2) arch/STM32F10x_StdPeriph_Driver/src/Makefile.inc 의 18, 27번째 라인의 주석을 풀어 줍니다.
#STM32F10X_DRV_SRC += stm32f10x_gpio.c => STM32F10X_DRV_SRC += stm32f10x_gpio.c #STM32F10X_DRV_SRC += stm32f10x_usart.c => STM32F10X_DRV_SRC += stm32f10x_usart.c
그리고 다시 빌드를 하면
arm-none-eabi-objcopy -O binary stm32f103cb.elf stm32f103cb.bin arm-none-eabi-objdump -h -S -C stm32f103cb.elf > stm32f103cb.lss arm-none-eabi-nm -n stm32f103cb.elf > stm32f103cb.sym arm-none-eabi-size -A stm32f103cb.elf stm32f103cb.elf : section size addr .text 4780 134234112 .data 40 536870912 .heap 3072 536870952 .stack_dummy 1024 536870952 .ARM.attributes 41 0 .comment 48 0 .debug_info 11242 0 .debug_abbrev 2693 0 .debug_aranges 232 0 .debug_line 3764 0 .debug_str 4310 0 .debug_frame 1860 0 .debug_loc 7123 0 .debug_ranges 192 0 Total 40421 |
================== Main Menu ============================ Download Image To Flash ------- 1 Upload Image From Flash ------- 2 Execute ------------------------------ 3 ========================================================== Waiting for the file to be sent ... (press 'a' to abort) Programming Completed Successfully! |
- STM32F10x의 USART1 port에 Clock을 인가해 실제 USART1이 동작하도록 합니다. 모든 Peri. 들은 사용전에 반드시 Clock을 인가해 주어야 합니다.
2) GPIOA Pin9번을 Alternate Function USART Tx모드로 설정 .
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; |
3) GPIOB Pin10를 Alternate Function USART Rx모드로 설정
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; |
USART_InitStructure.USART_BaudRate = 115200 ; USART_Init(USART1, &USART_InitStructure); |
5) USART1 Port의 Rx를 통하여 들어온 데이터가 있는지 확인
if ( USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) |
data = (u8)USART_ReceiveData(USART1); |
while ((USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET); USART_SendData(USART1, (uint16_t)data); |
void setup(void) }
void loop(void) int length; char data; Serial.readBytes(&data, length); if(length>0) { Serial.write(data); } } |
USART1 Base Address : 0x40013800 USART2 Base Address : 0x40004400 USART3 Base Address : 0x40004800 |
Lb_printf("Start Application : %s\r\n", "smart robot"); |
Serial.print("Start Application : %s\r\n", "smart robot"); |
int GetKey(char *pkey) { int ret = 0; if ( USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) *key = (u8)USART_ReceiveData(USART1); ret = 1; return ret; } |
char c;
if(GetKey(&c)==1) { switch(c) { case '0': Lb_printf("pressed 0\r\n"); break; case '1': Lb_printf("pressed 1\r\n"); break; default: Lb_printf("%c", c); break; } } |