Embedded 100

STM32 시리즈 UART 이론 학습 - Nucleo-G071RB (STM32F 차이점)

안녕하세요.   이번에는 UART 이론 내용을 다뤄 보겠습니다. 그런데 기존의 레지스터와 조금 변경된 내용이 있어 같이 내용을 추가해 보았습니다. STM32 시리즈마다 다를 수 있으므로, 평가보드나 사용하고 있는 MCU의 DataSheet는 꼭 확인해 보시기 바랍니다.   1. UART (Universal Asynchronous Receiver/Transmitter)란? 1) 설 명  UART는 직렬 통신(Serial Communication) 방식 중 하나로, 데이터를 비동기 방식(Asynchronous)으로 송수신하는 하드웨어 모듈입니다. 즉, 데이터를 1비트씩 순차적으로 보내는 방식이며, 클럭 신호 없이 송신기와 수신기가 같은 전송 속도를 유지해야 합니다.  2) UART의 특징  - 비동기 방식 ..

Embedded/STM32 2025.02.18

STM32 시리즈 타이머(Timer) 실습하기 - Nucleo-G071RB

안녕하세요.  이전 글에서 타이머 이론을 학습했다면, 이제 Nucleo 보드에서 확인해 보겠습니다. 가지고 있는 STM32 cortex-M 시리즈에서도 타이머 포트 혹은 핀 등을 변경해서도 가능할 것이라 생각됩니다.   1. RTC 회로 확인   내부에 32KHz RTC 크리스털이 있지만, 1초를 측정 오차를 조금이라도 줄이기 위해서 외부 32.768KHz 크리스털이 장착된 것을 알 수 있습니다. (LSE)    2. 프로젝트 생성  STM32 IDE를 실행시키고 "File->New->STM32 Project"를 선택해서 프로젝트를 실행합니다. 테스트 보드라면 상단 "Board Selector"를 선택하고 "Commercial Part Number"에 가지고 있는 제품의 이름을 입력해서 제품을 선택하고 ..

Embedded/STM32 2025.02.15

STM32 시리즈 타이머(Timer) 이론 학습

안녕하세요.   먼저 아래 내용은 STM32 모든 시리즈가 아니라 일부 Cortex-M 시리즈에 관한 내용임을 참고해주셨으면 합니다. 그리고 고사양 MCU일 경우 다를 수 있으며, 학습용에 사용되는 F103, F429, G071 등과 유사한 제품 내용이라고 보시면 됩니다.  1. MCU Timer(타이머)  - MCU, CPU 내부에는 시간을 측정을 하기 위한 타이머가 있습니다. 일종의 시계 개념 - 전자시계의 초 단위 시간, 아람 시간 설정 등은 타이머 기능을 사용합니다. 1) 크리스털 (Crystal Oscillator)  : 압전소자로 만들어져 일정한 주기의 펄스 신호를 생성하며 MCU에서 정확한 시간을 측정하는 주요 소자입니다.   부품 형태(Dip, SMD)는 차이는 있지만, 보통 회로도에 표기..

Embedded/STM32 2025.02.13

STM32 시리즈 GPIO(General Purpose Input/Output) 포트 학습 정리

안녕하세요.  STM32 MCU의 GPIO 내용을 간단하게 정리해보려고 합니다. STM32 MCU 시리즈를 보면 32핀, 64핀 144핀을 가지고 있는 제품을 보았을 것이고 세부적으로 상품번호에 따라 메모리 용량 기능 등에 차이가 있습니다.   여기서, 물리적인 핀에 관한 것을 우선 보면 핀이 많으면 많을수록 여러 가지 입출력 제어가 가능한 장점이 있습니다. 그러나 불필요하게 핀이 많은 제품을 선정해서 원가 높일 필요가 없습니다.    다시 돌아와서, 모든 핀을 입출력으로 사용할 수 있는 것은 아니고, 기본적으로 전원 연결하는 핀, GND핀 등 고정적으로 사용되는 핀 말고, MCU 핀냅에서 PA ~ PE 등 P로 시작하는 핀을 보았을 것입니다.     핀맵에서 P로 시작한다면 보통 GPIO 기능을 가진 ..

Embedded/STM32 2025.02.11

자원을 공유하는 다중 쓰레드 실습 소스코드 (뮤텍스-mutex 적용)

안녕하세요.  "[도서]임베디드 소프트웨어 베이직, 13.1 자원을 공유하는 다중 쓰레드 실습" 중 마지막 내용에 전체 소스코드 내용이 없어서  공유합니다.  거의 마지막 실습이고 소스코드 내용을 요약하자면 이전 내용에서 다루었던 pthread를 이용을 하는데 있어 공유하는 변수 2~4개의 다른 쓰레드에서 접근했을 때 어떻게 처리해야 하는지 간략하게 알려줍니다.  세마포어, 뮤텍스 등 방법이 있지만 여기서는 뮤텍스(Mutex)를 활용해서 1씩 증가하고 감소하는 쓰레드와 값이 정상적으로 동작하는지 확인하는 코드입니다.   1. 뮤텍스 활성화 및 쓰레드 4개 테스트 소스코드  100,000번 1씩 증가, 감소하는 쓰레드 함수와 300,000번 1씩 증가, 감소하는 쓰레드를 실행하고, 공유자원으로 사용할 변수..

라즈베리파이(Raspberry Pi)에서 스레드(pthread) 테스트

안녕하세요.  읽고 있는 책(하단 참고 도서 참고)에 내용 중 pthread 내용  조금 수정이 필요한 코드 부분이 있어 수정과 확인을 위해서 공유합니다.  1. POSIX Threads (pthread)란?POSIX Threads(pthreads)는 POSIX (Portable Operating System Interface) 표준을 따르는 멀티스레딩 API입니다.멀티스레딩(multi-threading)을 지원하여 하나의 프로세스 내에서 여러 스레드가 동시에 실행될 수 있도록 설계되었습니다.Unix 계열 시스템(Linux, macOS 등)에서 널리 사용되며, C 및 C++에서 멀티스레드를 구현하는 표준 방법입니다.2. 주요 특징경량 프로세스: 스레드는 동일한 프로세스 내에서 실행되므로 메모리 공간과 리..

라즈베리파이(Raspberry Pi) 리눅스 커널 구성 확인 및 빌드(build) 해보기

안녕하세요.   Rasbperry Pi를 사용하지만, 실질적으로 커널을 빌드해 볼 일을 많이 없을 것이라 생각됩니다. Device Driver 개발을 위해 커널 소스 혹은 해더를 다운로드하는 정도일 것입니다. 간단하게 커널 구성 내용과 빌드하는 방법 정도는 알아 두면 좋을 듯합니다.  언제 시점에서 테스트하느냐에 따라서 디렉터리 경로가 변경될 수 있으니 참고해서 따라 하시면 도움일 될 것입니다.  1. 커널 빌드를 위한 패키지 설치 git : 버전 관리 시스템으로, 소스 코드를 효율적으로 관리하고 공동 작업을 지원합니다. Git은 로컬과 원격 저장소 간의 코드 동기화를 가능하게 합니다. bc : 고급 계산기 언어로, 명령줄에서 수학적 계산을 수행할 수 있습니다. 특히, 스크립트에서 복잡한 계산을 처리할 ..

리눅스(Raspberry Pi)에서 램 디스크(RAMdisk) 장단점 확인 및 램 디스크 테스트 하기

안녕하세요. 기존 HDD에서 처리하다 보면 시간이 오래 걸리기 때문에 RAM에 필요한 코드 부분을 올려놓고 사용하는데요. 원하는 임의의 디스크를 만들어서 HDD에서 하는 것처럼 작동시켜 얼마나 빨리 처리되는지 확인해 보겠습니다.  1. Ramdisk란  시스템의 RAM(주기억장치)을 디스크 드라이브처럼 사용하는 가상 저장 장치를 의미합니다. 쉽게 말해, 메모리(RAM)를 파일 시스템처럼 활용하는 기술입니다. 이 디스크는 실제 물리적 디스크(HDD, SSD)가 아닌 메모리의 일부를 할당해 동작합니다.  운영 체제에서는 이를 임시 파일 시스템으로 다루며, Linux에서는 tmpfs나 ramfs 명령어로  파일 시스템이 RAMDisk로 구현하는 데 사용합니다.  2. 작동 방식   할당 : 시스템 메모리(RA..

임베디드 프로그래밍에서 알아야 할 volatile 키워드

임베디드 소스코드를 보다 보면 가끔 변수 타입 앞에 단어 volatile 하나가 더 붙어 있는 경우를 볼 수 있습니다. 뭐 특별한 기능을 하고 있는 것 같지도 않은데 말이죠.  1. volatile의 정의  영어 단어로서 volatile 의미는 휘발성의, 불안정한, 휘발하는 뜻을 가지고 있습니다. 이런 의미로 프로그래밍에서 volatile은 컴파일러에게 특정 변수의 값이 프로그램 흐름에 의해 예측할 수 없으므로, 항상 메모리에서 직접 읽고 쓰도록 지시하는 키워드입니다.  최적화 과정에서 해당 변수의 값이 캐시 되지 않도록 보장하고 주로 하드웨어 레지스터, 멀티스레드 환경의 공유 변수, 인터럽트 핸들러에서 사용되는 변수에 적용됩니다.  2. 하드웨어 코드 예시  변수의 값을 최적화하지 말고 메모리에서 직접..

Embedded 2025.01.06

[참고 강의] 재미있게 배우는 전기회로 강의 목차 및 간단한 정리 12회 차 – 정현파 교류

안녕하세요.   이번 내용은 정형파에 대한 내용이며 오일러 공식과 복소수의 내용이 나옵니다. 실제 강의 내에서는 복소수의 기초적 강의 부분이 없기 때문에 참고 사이트를 먼저 보고 강의를 보시면 도움이 되지 않을까 합니다.  1. 교류의 기초  1) 직류, 교류    - 직류(Direct Current) : 시간의 변화에 대해 크기와 방향이 일정한 전류 또는 전압   - 교류(Alternating Current) : 시간의 변화에 따라 방향과 크기가 변하는 전류 또는 전압    교류형태 : 정현파, 구형파, 삼각파, 램프파(사다리꼴파)     교류전압은 전자유도현상에 의해 발생 : 코일에서 시간에 따른 쇄교자속이 변화하면서 자속의 변화를 방해하는 방향으로 기전력이 유도되는 현상 2)  정형파 교류  - 정..

[참고 강의] 재미있게 배우는 전기회로 강의 목차 및 간단한 정리 11회 차 – 2차 회로의 과도해석

안녕하세요.  2차 회로 해석은 1차 회로 해석보다 하나 더 소자가 붙기 때문에 계산식이 좀 더 복잡해집니다.아래 내용으로는 계산을 풀어 볼 수는 없고 간단하게 이런 내용이 나왔구나 확인 정도만 할 수 있습니다. 그래서 실제 강의를 보셔야 할 듯합니다. 그리고 본 강의로 부족하기 때문에 마지막 하단에 있는 참고사이트를 추가로 보시면 이해하는데 조금 더 도움이 될 것 같습니다.  1. 2차 회로와 해석  1) 2차 회로   - 인덕터와 커패시터와 같은 저장소자가 동시에 2개가 존재하는 회로  - 2차 미분 방정식으로 표현되고, 특성이 결정된다.  2) 2차 과도회로의 해석 방법   - 미분방정식 적용 : 회로에 대한 미분방정식을 세우고 미분 방정식을 풀어해 구함  - 단계적 해석 : 미리 알려진 경우에 따..

Raspberry Pi CM4에 ModbusTCP Server 실행해 보기 - 4편(ModbusTCP server와 유량센서와 연동)

안녕하세요.  실제로 연동하는 프로그램을 만들어 보려고 합니다.  이전 ModbusTCP내용과 PulseCount를 잘 조합하면 될 것으로 생각했습니다.그런데 가상환경에서 RPi.GPIO의 add_event_detect() 함수를 사용하면 이벤트를 받아서 처리할 수가 없었습니다.    이전 내용을 참고하시면 pigpio 라이브러리 사용하는 방법을 다시 찾아서 확인하였습니다.최종적로 ModbusTCP와 pigpio를 이용해서 작업을 마무리할 수 있었습니다.  1. 코드 구성 확인 소스코드를 보기 전게 간단하게 맥락을 설명하면 아래와 같습니다.  1) 필요한 라이브러리 및 모듈 pyModbusTCP: ModbusTCP 서버를 구현하기 위한 라이브러리pigpio: GPIO 핀에서 센서 데이터를 안정적으로 읽어..

[참고 강의] 재미있게 배우는 전기회로 강의 목차 및 간단한 정리 10회 차 – 1차 회로의 과도 해석

안녕하세요.  이전 내용과 다르게 수학적인 부분이 많이 있어서 많이 어렵게 느껴집니다.그래서 현재 강의로만 이해하기 힘들 것이라 생각되어 하단에 참고 사이트 추가해 둔 교수님의 강의 등을 추가로 들어야 조금이나마 이해가 되지 않을까 합니다.   다음 내용 또한 2차 회로 또한 동일할 것이라고 생각됩니다. 아래 내용은 내용 이해용이라고 보기보다는 간단한 어떤 무료강의에 어떤 내용이 포함되어 있는지 확인용이라고 보시면 됩니다. 1. 1차 회로와 미분방정식   1차 회로는 저항과 커패시터 (R, C) 혹은 저항과 인덕터(R, L)로만 구성된 회로이며, 참고로 2차 회로는 저항과 커패시터, 인덕터(R, L, C)로 구성된 회로 1) 1차 회로와 해석  (1) 1차 회로의 해석 방법    - 미분방정식 직접 적용..

pyinstaller로 실행파일을 만들고 강제종료(ctrl + c) 시 PYI-3170:ERROR 에러 발생 메시지 해결 방법(?)

안녕하세요.  pyinstaller로 실행파일을 만들고 ctrl + c 눌러 종료할 때 보통 아래와 같은 메시지가 나타납니다. 종료할 때 깔끔하게 끝나지 않고 조금 애매하게 종료되는 것 같아서 조금 찾아보았습니다.  1. 테스트 환경   - HW : Raspberry Pi CM4   - OS : bookworm 64bit  - SW :     pip install pyinstaller로 인스톨러를 설치  2. 에러(?) 현상  Python 파일로 실행할 경우 문제없이 종료됩니다. 메모리 혹은 특정 리소스를 점유하고 해제가 필요한 코드에서 에러가 발생하는 것으로 생각됩니다. 현재 시점에서 [PYI-3170:ERROR]로 구글링해도 많이 나오지 않았습니다.  pyinstaller python 프로그램으로 만..

[강의 링크] 재미있게 배우는 전기회로 강의 목차 및 간단한 정리 9회 차 - 커패시터와 인덕터

안녕하세요.   강의를 다 보고 몰아서 정리하려니 양이 많아서 회차별 내용을 간단하게 정리해서 올려보았습니다.  1. 커패시터(Capacitor) 1) 커패시터 : 전하를 축적하여 에너지를 저장하는 수동소자  - 고정 커패시터 : 정전용량이 결정됨 - 가변 커패시터 : 정전용량을 조정 가능 - 전해 커패시터 : 극성을 가짐 2) 커패시터의 충전   - 중성 상태 -> 전원 연결 -> 양쪽 도체판에 음전하, 양전하를 띠게 됨 -> 전압원 전압과 같아지면 전자 이동 멈춤   3) 커패시터의 방전   - 양전하, 음전하 쌓인 도체판 -> 전구연결 -> 음전하 이동 -> 중성상태 -> 전류이동 멈춤  4) 정전용량 : 단위전압당 커패시터가 저장할 수 있는 전하의 양 (기호 : C, 정전용량 단위 : F)   5..

[강의 링크] 재미있게 배우는 전기회로 강의 목차 및 간단한 정리 1~8회 차

안녕하세요.   최근에 전기 기초에 대한 부분이 다시 기억해 보고자 무료 강의를 찾아보았습니다. 강사분이 직접 설명해 주는 것이 아니라서 조금 설명이 부족할 수 있는데(보충 설명할 때는 동영상으로 추가 설명이 있습니다), PPT로 간단간단 강의 자료가 요약 설명이 잘 되어 있습니다. 그래서 빠르게 볼 수 있습니다. 그리고 간단한 예제들로 알려주고 있어 다시 기억해 본다는 차원에서 볼 만했습니다. 1. 강의 목차   1회 차 전기의 기초  2회 차 전기회로와 옴의 법칙  3회 차 키르히호프의 법칙  4회 차 전기회로의 노드 해석법  5회 차 전기회로의 폐로해석법  6회 차 다양한 회로 해석 기법  7회 차 연산 증폭기의 원리와 응용  8회 차 전기와 자기의 상호작용  9회 차 커패시터와 인덕터  10회 차..

Raspberry Pi 가상환경(-m venv)에서 add_event_detect 에러 발생 시 차선책(?)

안녕하세요.   ModbusTCP는 가상환경에서 동작하는 것을 이전 글에서 확인했습니다. 그러나 가상환경에서 GPIO 엣지 검출(Pulse)을 하려고 하는데 생각과 달리 잘 되지 않아서 차선책으로 찾은 방법을 남겨두려고 합니다.   그냥 폴링(Polling)으로 하기에는 정확도와 비효율적이라는 생각이 들어서 해결방법은 없을지 찾아보았습니다.  1. 기본 가상환경 생성 및 설정  Python 표준 라이브러리의 venv 모듈을 사용하여 가상 환경(virtual environment)을 생성합니다. 가상 환경은 Python 프로젝트마다 독립적인 패키지와 Python 인터프리터를 사용할 수 있게 해 줍니다.  아래와 같이 가상환경을 생성 후 RPi 라이브러리 설치 (이전 ModbusTCP 확인 때문에, 설치했다..

Raspberry Pi CM4에 ModbusTCP Server 실행해 보기 - 3편(ModbusTCP server 수정된 함수사용)

안녕하세요.  이전 글에서 deprecated 된 get_words() 함수 관한 부분을 완료하지 못하고 마무리했습니다.이 부분을 다시 확인하고 정리해보려고 합니다. 기본 자료형과 구조는 동일합니다.  1. DataBank Class 최신 함수  최신 버전에서는 DataBank를 직접 호출하는 대신, ModbusServer 객체의 data_bank 속성을 통해 접근합니다 1) DataBank의 메모리 구조 DataBank는 Modbus 표준 메모리 구조를 관리하며, 아래 4가지 메모리 타입을 제공합니다: Coils (1-bit): 읽기/쓰기 가능한 디지털 값Discrete Inputs (1-bit): 읽기 전용 디지털 값Holding Registers (16-bit): 읽기/쓰기 가능한 16비트 값Inp..

PCB Editor 혹은 Or CAD에서 LoadLibrary fails to load with error 126 or error 87 발생할 경우

안녕하세요.   오늘은 OrCAD로 회로 설계하다가 경험할 수 있는 에러에 대해서 공유드립니다.  평상시와 같이 회로설계를 하면서 footprint show를 눌렀는데, OrCAD가 에러 하나를 내고 죽는 현상이 나타났습니다.     저장하고 있지 않은 상황이라 살짝 당황했습니다. 그래서 급하게 검색했습니다.  1. 원인 검색   정확하진 않지만, AMD 계열 그래픽 원인으로 파악되었습니다. ATI 그래픽 카드로 교체했거나, NVIDIA와 같이 사용하는 경우 호환이 되지 않아 나타나는 듯합니다.   OrCAD, PCB Editor에서만 나타나는 것이 아니라, 그래픽 프로그램 (Photoshop, AutoCad) 등에서도 발생하는 듯합니다.  2. 해결책 1) 알려진 해결책   - ATI 그래픽 최신 드라..

Raspberry Pi CM4에 ModbusTCP Server 실행해 보기 - 2편(pyModbusTCP 설치)

안녕하세요.   1편에 이어 ModbusTCP에 대해서 확인해 보겠습니다.테스트 환경은 라즈베리파이 CM4에서 진행했습니다. 이번 글의 목표는 간단하게  pyModbusTCP를 설치해 보고 작동하는 되는 것을 확인하는 것입니다.   1. pymodbusTCP 설치      # install the last available release (stable)$ pip install pyModbusTCP    설치하려고 하면 아래와 같이 에러가 발생할 수 있습니다. 그래서 가상의 환경을 만들어 진행합니다.    가상 환경을 만들더라도 네트워크 환경은 동일하게 유지되며, 가상 환경은 Python 패키지와 종속성만을 격리할 뿐, 네트워크 설정이나 시스템 자원에는 영향을 주지 않습니다. 1) 가상 환경 생성 $ py..