상세 컨텐츠

본문 제목

[한화비전 VEDA 4기] 6주차 리뷰

VEDA

by 전산거북이 2026. 5. 4. 00:08

본문

이번주는 전체적으로 라즈베리파이와 ST32를 세팅하고 실습해 보았습니다.

통신 이론

우선, 통신 이론에 대해 간단히 알아보겠습니다.
컴퓨터가 신호를 주고 받는 것이 통신이라고 합니다. 이 통신 중 일렬로, 그러니까 직렬로 통신을 하는 것을 시리얼 통신이라고 부르며, UART, SPI, I2C 등이 있습니다.
UART는 비동기 통신 방식이며, 여기에 타이머를 추가한 것이 USART입니다.
UART는 1대1 통신을 하기에, 1대N 통신을 하기 위해 만들어진 것이 SPI 방식입니다. 한 대의 마스터와 N 대의 slave로 이루어져 있으며, 마스터는 N개의 연결 슬롯이 필요합니다.
즉, N이 커질수록 마스터의 슬롯은 늘어나야 한다는 단점 때문에 이를 보완하기 위해 나온 것이 I2C 입니다.
I2C는 버스를 이용하여 값을 송수신 하기 때문에, N개의 슬롯이 필요하지 않습니다. 주소값을 이용하여 보낼 곳을 잡아주기만 하면 되기 때문입니다.

해당 내용들은 모두 임베디드 환경에서 통신을 하기 위해서 필요한 부분이 될 것입니다.

라즈베리파이 세팅

sudo raspi-config

위 명령어를 통해 설정창에 들어갈 수 있습니다.

그렇게 되면 이런 화면이 나오게 되는데요, 여기서 Interface Options -> SSH -> Server Enable 을 통해 ssh 를 켜줄 수 있습니다.
저는 따로 zsh를 라즈베리파이에 설정해 주었지만, 지금은 다루지 않겠습니다. 교육 때 다룬 것은 아니거든요..ㅎㅎ

STM 세팅

STM은 IDE와 MX로 나뉘어져 있습니다. MX에서 세팅을 해 준 상태에서 IDE에 코드를 생성해 주어야만 정상적으로 세팅할 수 있기 때문에, 이를 잘 확인해야 합니다.
이 부분에 대해서는 나중에 따로 다루도록 하겠습니다.

STM 코드

STM의 코드는 HAL 이 붙은 함수가 자주 등장합니다. 이 접두어는 하드웨어의 추상화에 관련된 함수입니다. GPIO 등을 세팅하는 등의 행위는 모두 HAL이 붙은 함수에 의해 실행됩니다.

HAL_Init();

HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);

등이 있습니다.

참고로 STM IDE에서는 comment가 자동으로 생성되는데, 이 사이에 코드를 적어주어야 MX에서 코드 생성 시 사라지지 않습니다.

while (1)
{
	/* USER CODE END WHILE */
	 
	/* USER CODE BEGIN 3 */
	buttonState = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13);
	if(buttonState == GPIO_PIN_SET)
	{
		HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
	}
	else
	{
		HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
	}
}

/* USER CODE END 3 */

위와 같이 USER CODE BEGIN과 END 사이에 코드를 적어 주어야만 합니다.

풀 업 저항과 풀 다운 저항

풀 업 저항은 기본적으로 저항을 스위치 위에 달아 주는 방식입니다. 이들을 사용하는 이유는 과전류로부터 회로를 보호하며 안정성을 확보할 수 있기 때문입니다.
풀 업 저항을 사용하면 Active Low가, 풀 다운 저항을 사용하면 Active High가 됩니다.

다시 라즈베리파이로 돌아와서, 라즈베리파이에는 여러 GPIO 핀과 5V, GND 핀이 존재합니다. 이를 적절히 활용하면 회로를 라즈베리파이로 컨트롤 할 수 있습니다.
예를 들어, 버튼을 눌렀을 때 LED에서 빛이 나오게 하는 등의 작업을 할 수 있습니다.

리눅스 시스템

수~목요일에는 리눅스 시스템에 대해 공부하였습니다.
아마 관련 내용이 블로그에 올라갔던 것 같은데요, 사실 이 부분은 간단한 내용들이 더 많았기 때문에 기억 나는 부분만 잠깐 소개해볼까 합니다.

링크

파일 시스템에서 링크를 하는 방법에는 소프트 링크와 하드 링크가 있습니다. 리눅스의 파일 시스템은 덴트리와 아이노드, 데이터 블록 등으로 구성됩니다.
아이노드는 파일에 대한 정보가 담긴 자료구조 입니다. 아이노드 번호를 통해 아이노드를 식별합니다. 덴트리는 파일의 경로 정보가 담긴 자료구조로, Tree 형식을 취합니다. 마지막으로 데이터 블록은 파일의 실제 내용을 저장하고 있는 파일입니다.
기본적으로 파일을 읽어오기 위해서는 덴트리를 통해 해당 파일의 위치를 알아낸 뒤, 그 파일의 아이노드에 접근하여 데이터 블록의 위치를 알아냅니다. 그리고 데이터 블록을 읽어 오면 해당 파일을 읽어올 수 있는 것입니다.
만일 링크 파일을 생성한다면, 해당 부분에서 아이노드나 데이터 블록을 적절히 활용하여 해당 파일이 다른 파일을 가리키도록 만들어주면 됩니다.

소프트 링크

소프트링크의 경우, 우선 덴트리를 통해 아이노드를 얻어와서 이를 통해 데이터 블록을 보는 것까지는 동일합니다. 그러나, 이 데이터 블록은 원본의 덴트리 경로를 가지고 있어서, 자연스럽게 원본 덴트리의 아이노드를 통해 원본의 데이터블록까지 이동하게 됩니다.
이런 방식 때문에 파티션 등에 구애받지 않고 파일을 링크할 수 있다는 장점이 있지만, 반대로 원본 파일이 삭제/이동 등에 의해 원본의 덴트리 경로가 수정되면 링크 파일은 깨질 수 있다는 단점도 존재합니다.

하드 링크

하드 링크에서는 원본의 아이노드와 링크 파일의 아이노드를 동일하게 맞추어 줍니다. 즉, 같은 아이노드를 공유하는 두 파일이 생긴다고 볼 수 있습니다. 이 덕분에 원본이 수정되거나 삭제되어도 이와 상관없이 링크를 할 수 있다는 장점이 존재합니다만, 아이노드를 공유해야 하다보니 다른 파일 시스템이나 다른 파티션의 파일을 연결할 수는 없다는 단점 또한 존재합니다.

관련글 더보기

댓글 영역