오늘 포스팅할 내용은 세미호스팅(Semihosting)에 대한 내용입니다. 세미호스팅은 ARM 타겟 보드에서 실행되는 코드가 디버거를 통해서 호스트 컴퓨터에 Input / output 기능을 통신하고 사용할 수 있도록 해주는 기능입니다. 즉, 시리얼을 안 뚫은 상태에서 디버거만을 이용해 C 라이브러리인 scanf와 printf를 사용할 수 있습니다.
개발 보드의 시리얼을 뚫기 전에 printf를 사용할 수 있는 것은 큰 장점인듯합니다. 그럼 설정 방법에 대해서 알아보도록 하겠습니다.
Semihosting 설정 |
ST Link가 설정이 되어있어야 합니다.
프로젝트의 Option 메뉴를 클릭합니다.
General Options에서 Library Configuration 탭에서 Semihosted와 Via semihosting을 체크해 줍니다.
이제 모든 설정은 끝이 났습니다.
테스트 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | int main(void) { /* USER CODE BEGIN 1 */ char ch; /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_CRC_Init(); MX_DMA2D_Init(); MX_FMC_Init(); MX_I2C3_Init(); MX_LTDC_Init(); MX_SPI5_Init(); MX_TIM1_Init(); MX_USART1_UART_Init(); MX_USB_HOST_Init(); MX_UART5_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ MX_USB_HOST_Process(); /* USER CODE BEGIN 3 */ ch = getchar(); if(ch == '1') printf("Hellow\r\n"); } /* USER CODE END 3 */ } |
테스트를 하기 위해 위에 와 같이 표시한 부분의 코드를 추가했습니다. scanf로 테스트를 하려고 했으나 이상하게 코드 사이즈 초과 에러가 발생하여 getchar를 썼습니다.
빌드 후에 디버그를 클릭 후 View 탭에서 Terminal I/O를 클릭해 줍니다.
디버그 상태가 아니면 View 탭에 Terminal I/O가 활성화되지 않습니다.
터미널 Output에 정상적으로 출력이 되는 것을 확인할 수 있습니다. Input이 필요한 경우 상단에 Input needed!라는 문구가 생깁니다.
Input은 하단에 있습니다.
Keil Semihosting
Keil에서도 이와 동일한 기능을 제공합니다. 아래 URL은 Keil Semihosting 설정 방법입니다.
http://www.keil.com/support/man/docs/uv4/uv4_db_dbg_printf_viewer.htm
2020/04/30 - [MCU/STM32F429] - STM32 타이머 제어하기(STM32F429I Discovery)
2020/04/05 - [MCU/STM32F429] - GPIO 입출력 제어하기(STM32F429I Discovery)
2020/03/28 - [MCU/STM32F429] - CubeMX Setting 하기
2020/02/26 - [프로그래밍/C++] - 프로그래머스 - 완주하지 못한 선수, sort algorithm 정리
2020/01/20 - [프로그래밍] - tortoise svn lock 해제 update 매크로
2020/01/11 - [프로그래밍] - 비트맵의 구조, 24비트 비트맵의 구조는 어떻게 될까?
2020/01/05 - [프로그래밍/C] - 이중 연결 리스트(Double linked list), 이중 원형 연결 리스트 예제
'MCU > STM32F429' 카테고리의 다른 글
적외선 수신기 기능 구현 (1) | 2020.12.03 |
---|---|
STM32 타이머 제어하기(STM32F429I Discovery) (2) | 2020.04.30 |
GPIO 입출력 제어하기(STM32F429I Discovery) (2) | 2020.04.05 |
CubeMX Setting 하기 (1) | 2020.03.28 |