분류 전체보기 319

WAV 파일에대해 알아보기

안녕하세요. 오늘은 WAV파일에대해 알아보겠습니다.이 글의 목적은 MCU에서 WAV파일을 읽을때 알아야 할 내용을 알아보는게 목적입니다.WAVE파일은 RIFF(Resource Interchange File Format)구조를 사용합니다. RIFF 구조는 아래의 그림과 같습니다. 일반적으로 44바이트가 파일정보이고, 나머지가 음원데이터입니다.RIFF구조는 chunk단위를 사용합니다. chunk단위는 구조가 ID(4바이트),SIZE(4바이트),DATA(N바이트)로 이루어집니다.WAV파일은 세가지 영역으로 구분됩니다. 위에있는 WAV파일을 RIFF 구조에맞게 해석해보겠습니다.(리틀 엔디안 방식)1. RIFF1) ChunkID (4바이트)ChunkID입니다.2) ChunkSize (4바이트) 파일의 크기입니다..

지식/프로토콜 2025.09.07

파이썬으로 사인파,사각파,삼각파,톱니파 음원 만들기

안녕하세요. 파이썬으로 사인파, 사각파, 삼각파, 톱니파 음원을 만들어보겠습니다.WAVE_TYPE에 원하는 파형을 입력하면 됩니다. ("sine" or "square" or "triangle" or "sawtooth")WAV파일 파라미터에는 원하는 WAV파일 정보를 입력하면 됩니다.파이썬을 실행시키면 아래와같은 wav파일이 소스코드가있는 디렉토리에 만들어집니다.파일명은 _Hz_Hz_bit__sec.wav가 됩니다.import numpy as npimport waveimport os# === 파형 종류 선택 ===# "sine", "square", "triangle", "sawtooth"WAVE_TYPE = "square"# WAV 파일 파라미터sample_rate = 48000 # 48 kHzdura..

C언어로 링버퍼 구현하기

안녕하세요. 오늘은 C언어로 링버퍼를 구현해보겠습니다. 1) 링버퍼가 필요한 이유펌웨어에서 링버퍼는 주로 UART 통신에서 많이 사용됩니다. UART 수신은 일반적으로 인터럽트에서 데이터가 들어오는데, 인터럽트 안에서 곧바로 데이터를 처리하면 지연이나 오류가 발생할 수 있습니다. 그래서 인터럽트에서는 단순히 받은 데이터를 링버퍼에 저장해 두고, 메인 루프나 다른 Task에서 필요할 때 버퍼에서 꺼내 처리하는 구조를 사용합니다. 이 방식은 데이터 손실을 막고, 시스템을 안정적으로 동작하게 해줍니다.2) 링버퍼란링버퍼란 FIFO(First in, First out)방식의 처리방식입니다. 일반적으로 큐와 비슷하지만 배열의 처음과 끝이 연결된 것처럼 동작하는것이 특징입니다.예를들어서 배열의길이가 4인 ..

Speaker 만들기 1편 (ESP32, MAX98357A, I2S)

안녕하세요. 해당 시리즈에서는 ESP32, MAX98357A, SD카드를 이용해서 SD카드에있는 음원파일을 출력해보고 최종적으로는 ESP32대신 STM32를 이용해서 Speaker 보드를 만들어보겠습니다.① ESP32와 MAX98357A 소개, 그리고 PCM 개념ESP32는 ESP32 WROOM 32를 이용했고 앰프는 MAX98357A를 이용합니다.ESP32와 MAX98357A는 I2S 통신을 합니다.I2S 통신은 오디오 데이터를 PCM 형태로 주고받는 인터페이스입니다. PCM(Pulse Code Modulation)은 아날로그 소리를 일정 주기마다 디지털 숫자로 저장한 것을 의미합니다. PCM 변환 과정은 3단계입니다.1. 샘플링(Sampling)- 아날로그 파형을 일정한 시간 간격으로 잘라서 측정 (..

STM32/STM32_USBtoUART STM32로 USB to UART 모듈 만들기 8편(UART RX를 DMA방식으로 변경)

안녕하세요.기존에는 UART RX가 인터럽트방식이였는데 DMA 방식으로 변경해보겠습니다. (BASE 코드 : 6편)기존의 방식으로 문제가 되는 상황을 재현해보겠습니다.baudrate를 빠른속도로 설정하고 대량의 데이터를 한번에 보내면 Overrun error(ORE)가 걸립니다.ORE는 데이터 레지스터를 읽지 않은 상태에서 새 데이터가 도착한경우 발생합니다. 테라텀으로 아래의 대량의 텍스트를 보내보겠습니다.11만 수신하고 수신을 멈췄습니다. (ORE 발생)지금 코드에서는 ORE가 발생하고나서 RX를 하지않습니다. 그 이유는 수신인터럽트에서 HAL_UART_Receive_IT를 호출해줘야하는데 ORE가 걸려서 HAL_UART_Receive_IT를 호출하지않았기때문입니다. 이때 ORE발생할때 복구하려면 HA..

STM32 RTOS 알아보기 8편(버튼동작-one tap/double tap/triple tap)

안녕하세요. 오늘은 버튼동작 one tap/double tap/triple tap을 추가해보겠습니다.(구현 방식은 해당 유튜브를 참고했습니다.https://www.youtube.com/watch?v=QEGN9-44WVY&list=PLvFHFPM09alJrzYz45gcErBnc-YXEJ9ch&index=26)테스트하는 회로는 풀업상태이고 rising edge에서 외부인터럽트가 발생합니다. (버튼클릭시 LOW, 버튼릴리즈시 HIGH)테스트했을때 버튼클릭시는 채터링이 발생안했고 버튼릴리즈할때 발생했습니다.One tap시 감지 방법입니다.버튼을 클릭하고 릴리즈했을때 인터럽트가 발생하고 50ms동안 발생하는 신호는 무시합니다. 그리고 250ms후에 One tap을 확정합니다.Double tap시 감지 방법입니다..

STM32/STM32_RTOS 2025.08.16

STM32로 USB to UART 모듈 만들기 7편(커넥터 C타입으로 변경)

안녕하세요.이전에 만들었던 보드는 커넥터를 USB B 타입을 사용했었는데 USB C 타입으로 변경해보겠습니다.USB B타입은 연결포인트가 VBUS, D+, D-, GND만 있었는데 USB C타입은 VBUS, D+,D-,GND, CC1,CC2,TX1+,TX1-,TX2+,TX2-,SBU1,SBU2가 있습니다.근데 이 모듈은 USB 2.0이므로 VBUS, D+, D-, GND는 똑같이 사용하고 추가적으로 CC1, CC2만 사용하면 됩니다. CC1, CC2핀은 Configuration Channel의 약자이고 장치를 인식해줄수있게하는 핀입니다.그래서 이 라인에 풀다운저항으로 5.1 kΩ(±20%, 4.1 kΩ ~ 6.1 kΩ 범위 허용)을 연결해주면 됩니다.회로도는 아래와 같습니다.해당 커넥터는 열풍기 사용없이..

ESP32+MAX98357A Class D 1kHz 출력 측정

안녕하세요. 오늘은 MAX98357A CLASS D 오디오 앰프 칩의 출력을 측정해보겠습니다.* Class D 측정방식Class D 앰프는 전력을 효율적으로 사용하기 위해 오디오 신호를 고속 PWM/PDM 스위칭으로 변조해 증폭하는 방식입니다. BTL(Bridge-Tied Load) 구조에서는 출력이 스피커 +단과 −단 모두 스위칭 신호이므로, 단일 채널 측정으로는 실제 오디오 파형을 볼 수 없습니다. 따라서 다음 중 한 방법으로 측정해야 합니다. 방법 1: +단과 −단을 각각 채널로 측정 후, 차동(C1 − C2) 계산 방법 2: 차동 프로브 사용 이번 테스트에서는 방법 1을 사용했습니다.* 측정 구성ESP32와 MAX98357A를 이용해서 Class D 출력을 발생시켰고, Analog discover..

회로이론/장비 2025.08.13

ANALOG DISCOVERY-Wave generator 테스트 하기

안녕하세요. 오늘은 ANALOG DISCOVERY의 Wave generator기능을 테스트해보겠습니다.Wava generator는 discovery장비로하고 generator 파형측정은 saleae장비로 했습니다.UI에서 설정값에따라서 예상되는 파형이 우측에 나옵니다. Sin파 1kHz, 1V를 측정해보겠습니다.파형이 설정한대로 찍힙니다. 출력에 스피커를 연결하면 1kHz 톤이 들리게 됩니다.discovery장비에서는 다양한 파형을 출력할 수 있고 Custom해서 파형을 출력할수도 있습니다.스피커 톤 테스트나 LED PWM 테스트할 때 사용하면 유용할 것 같습니다.

회로이론/장비 2025.08.11

STM32 RTOS 알아보기 7편(Semaphore)

안녕하세요. 오늘은 세마포어에 대해 알아보겠습니다.세마포어는 여러 태스크나 인터럽트가 서로 순서를 지키거나, 정해진 개수만큼만 어떤 자원을 사용할 수 있게 해주는 장치입니다. RTOS에서는 이진 세마포어(Binary Semaphore), 카운팅 세마포어(Counting Semaphore) 두 가지 형태로 사용합니다.* 이진 세마포어 : 값이 0 또는 1만 가지며, 주로 태스크 동기화나 인터럽트에서 신호를 전달할 때 사용합니다.* 카운팅 세마포어 : 0 이상의 값을 가지며, 한정된 개수의 리소스(버퍼,큐 등)를 관리할 때 사용합니다.이전에 뮤텍스는 take, give를 한 태스크에서만 해야했는데 세마포어는 다른 태스크, 다른 인터럽트에서 take, give를 해도 됩니다.task에서 사용하는 이진세마포어,..

STM32/STM32_RTOS 2025.07.21