본문 바로가기

전체 글879

STM32 ] UART DMA, IDLE Line Interrupt 를 통한 데이터 수신 (Ring Buffer) 코드 출처 : https://controllerstech.com/uart-dma-with-idle-line-detection/ 이전에 UART로 원하는 형식의 데이터를 수신할 때는 패킷의 종료를 뜻하는 특정 문자를 끝에 넣거나 개행 문자를 넣어서 인터럽트 안에서 버퍼에 복사해 처리해야했는데 이 때는 수신될 데이터의 길이 또는 범위를 미리 알고 있어야 했다. 다음은 UART가 IDLE Line을 감지하고 발생시키는 Interrupt를 활용하여 사전에 길이를 알 수 없는 데이터를 효과적으로 수신하는 방법이다. CubeMX 설정 파라미터 세팅은 그대로 두고 DMA 세팅으로 가서 RX Request를 추가한다. Mode는 Normal으로 한다. Direction은 Peripheral To Memory 이고 By.. 2022. 8. 18.
C, Linux ] ls 명령어 구현 리눅스의 ls 명령어 구현하기 #include #include // 디렉터리 관련 DIR, struct dirent, opendir(), readdir(), closedir() 등이 정의된 헤더 포함 #include // Unix 에 쓰이는 표준 심볼들과 상수, 함수들이 정의된 헤더 포함 #include int main(int argc, char* argv[]) { // cwd에 1024 byte 동적할당 char * cwd = (char *)malloc(sizeof(char) * 1024); // DIR 과 dirent 구조체 포인터를 만들고 일단 NULL 대입 DIR * dir = NULL; struct dirent * entry = NULL; // 추가 인자 없이 실행된 경우 if(argc==1){.. 2022. 8. 17.
C, Linux ] main 함수의 매개변수 사용해서 파일 입출력 하기 main 함수에 전달되는 파라미터를 활용해 코드를 짤 때는 아래와 같이 출력해 디버깅 해보면 편하다. for(int i=0; i< argc; i++){ printf("%s\n",argv[i]); } 1. main 함수의 argument 로 파일이름과 파일에 저장할 문자열을 입력받아 파일을 생성하는 프로그램 #include #include #include int main(int argc, char *argv[]){ /* for(int i=0; i< argc; i++){ printf("%s\n",argv[i]); } */ if (argc < 3) { printf("Usage: fileio.exe "); return 0; } FILE *fp; fp = fopen(argv[1], "w"); if(fp==NULL.. 2022. 8. 17.
OpenCV , C++ ] 키보드와 마우스의 이벤트 처리 1. 키보드 이벤트 처리 i 또는 I 키를 누르면 영상의 색상이 반전되는 예제 void keyboard() { Mat img = imread("lenna.bmp"); if (img.empty()) { cerr 2022. 8. 16.
OpenCV , C++ ] 도형 그리기 + 문자열 출력 1. 직선 그리기 void drawLines() { Mat im = imread("lenna.bmp", IMREAD_GRAYSCALE); Mat img; cvtColor(im, img, COLOR_GRAY2BGR); //흑백영상 위에 그리면 원래 도형도 흑백으로 그려짐. 위 코드는 흑백 영상위에 컬러 도형을 그리는 방법 중 하나 //Mat img(400, 400, CV_8UC3, Scalar(255, 255, 255)); //직선 그리기 //void line(InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness = 1, int lineType = 8, int shift = 0) //입출력 영상 InputOutputAr.. 2022. 8. 16.
OpenCV , C++ ] 카메라와 동영상 파일 다루기 예제 코드 출처 : OpenCV 4로 배우는 컴퓨터 비전과 머신러닝 1. 웹캠으로부터 정지 영상 프레임을 두 번 받아와 각기 다른 창에 띄우는 예제 void CaptureVideo() { VideoCapture cap(0); // OpenCV에서는 VideoCapture라는 클래스를 이용해 카메라 또는 동영상 파일로부터 정지 영상 프레임을 받아 올 수 있음 // 동영상 파일을 불러올 때는 "파일 이름" 을 인자로 넣고, 파일이 다른 폴더에 있으면 절대경로 또는 상대경로 추가함 // 카메라 장치를 열 때에는 카메라 장치 id 번호를 정수 값으로 전달. 0으로 해서 안되면 1, 2 시도 if (!cap.isOpened()) {// 예외처리 cerr 2022. 8. 16.
VMware ] Linux Ubuntu 에서 한영키 사용하기 root 권한으로 로그인 쉘 스크립트 파일을 만든다. vi hangul.sh 아래와 같이 입력 후 저장하고 닫기 #!/bin/bash setkeycodes 72 122 setkeycodes 71 123 스크립트 파일 실행하기 chmod +x hangul.sh ./hangul.sh 한영키가 잘 먹히는것을 확인할 수 있다. 이제 systemctl 을 통해 부팅시마다 변경한 설정이 적용될 수 있도록 설정한다 아래 경로로 가서 서비스 새로 등록 cd /etc/systemd/system vi hangul.service 아래와 같이 입력 후 저장하고 닫기 [Unit] Description=Change Hangul keycode [Service] ExecStart=/[스크립트 파일이 있는 경로]/hangul.sh [.. 2022. 8. 14.
Linux Ubuntu ] Waiting for cache lock : Could not get lock /var/lib/dpkg/lock-fro 오류 해결 apt update 또는 apt install 시 아래 문구가 무한 반복되는 오류 잠긴 캐시 파일을 다음 명령어로 삭제 sudo rm /var/lib/dpkg/lock* 2022. 8. 14.
Linux ] Vim 에디터 단축키 및 설정 커서 이동gg : 맨 위로 커서 이동G : 맨 아래로 커서 이동[Home] : 현재 줄의 맨 앞으로 커서 이동[End] : 현재 줄의 맨 뒤로 커서 이동shift + h : 현재 보이는 페이지 기준으로 맨 위로 커서 이동shift + m : 현재 보이는 페이지 기준으로 중간 위치로 커서 이동shift + l : 현재 보이는 페이지 기준으로 맨 아래로 커서 이동d : 현재 단어의 맨 앞으로 커서 이동 원하는 줄번호로 커서 이동:줄번호  스크롤Page Up : 한 페이지 위로 스크롤Page Down : 한 페이지 아래로 스크롤Ctrl + u : 반 페이지 위로 스크롤Ctrl + d : 반 페이지 아래로 스크롤Ctrl + y : 한 줄 위로 스크롤Ctrl + e : 한 줄 아래로 스크롤  복사/붙여넣기/잘라내.. 2022. 8. 14.
VMware 에 Linux Ubuntu 설치하기 VMware 다운로드 경로 : https://www.vmware.com/kr/products/workstation-player/workstation-player-evaluation.html 설치 우분투 iso 이미지 다운받기 최신 버전은 공식 홈페이지에서 다운받고 예전 버전은 아래 사이트에서 다운 받는다. http://old-releases.ubuntu.com/releases/ Ubuntu 20.04.3 LTS 데스크탑버전으로 다운받았다. 여유 공간이 있는 드라이브에 원하는 이름으로 폴더 생성 나중에 설치 선택 아까 만들어둔 폴더 경로 선택 디스크 용량을 지정하고 가상 머신의 내용을 하나의 파일에 저장할 것인지, 여러 파일에 나눠 저장할 것인지를 선택 생성후 edit 가상 머신에 설치된 리눅스의 동작에 .. 2022. 8. 13.
C ] 가변인자 함수 만들기, 가변인자 출력함수 만들기 printf() 함수의 경우 내가 원하는 만큼 인자를 넘길 수있다. 예를 들면 printf("%d", a);// 인자 2개 printf("%d %d", a, b);// 인자 3개 이게 가능한 이유는 printf()가 매개변수의 개수가 정해지지 않은 가변인자 함수이기 때문이다. 가변인자 함수로 인자의 개수와 상관없이 정수형 인자를 여러개 받아서 인자 모두를 더한 값을 반환하는 함수를 만들어보도록 하겠다. #include // stdarg.h 포함. va_list, va_start, va_arg, va_end가 정의된 헤더 파일 #include int sum(int num_args, ...) { // 가변 인자의 개수를 받음, ...로 가변 인자 설정 va_list ap;// 가변 인자 목록 포인터 va_s.. 2022. 8. 12.
STM32 ] Dynamixel AX-12 사용 - 델타로봇 제어하기 (2) 내가 프로젝트에서 사용하는 델타 로봇은 산업에서 많이쓰이는 병렬 로봇이며 3축 DOF (Degree of Freedom) 를 갖는다. 참고. 직렬로봇 : 1개의 직렬체인(다리)으로 구성되고, 모든 조인트에 구동기가 장착된다. 병렬로봇 : 엔드이펙터가 적어도 2개 이상의 다리에 의하여 지지되고, 각 다리당 1~2개의 구동기가 고정부 근처에 장착되며 나머지 조인트는 수동조인트로 구성된다. 일단 FreeRTOS를 사용했는데 현재는 하나의 Task만 쓰고 있다. Motor Init() 시점에서 속도를 미리 설정해서 지난번보다 부드럽게 움직이게끔 했고, UART Receive 인터럽트에서 세마포어 시그널을 보내서 시리얼 터미널로 PC에서 제어가 가능하게 끔 해놨다. 구현해놓은 커맨드는 우선 End Effector.. 2022. 8. 11.
STM32 ] Dynamixel AX-12A 모터 제어하기 (1) 다음 진행할 개인 프로젝트인 델타로봇의 제어를 위해 먼저 AX-12A 모터에 대해 파봤다. 다이나믹셀은 모터, 제어기, 드라이버, 센서, 감속기 밑 네트워크 기능을 하나의 모듈로 만든 로봇 전용 액추에이터로, 이전에 STM32보드로 모터를 다뤄본 적이 있지만 PWM 제어하던 그것과는 제어방식이 아주 많이 다르다. 스펙 핀맵 특이점은 여러 다이나믹셀 모터를 Daisy Chain 방식으로 연결해 하나의 버스에 패킷을 전송하면, 고유의 ID를 가지고 있는 각각의 모터들을 제어할 수 있다. 브로드캐스트 ID를 사용해 버스에 연결된 모터를 한번에 제어할 수도 있다. 그리고 위의 스펙을 보면 모터의 통신방식이 TTL레벨 Half Duplex 시리얼 통신인데 MCU의 RX, TX선과 연결하려면 아래와 같은 통신회로가.. 2022. 8. 11.
OpenCV ] Image Watch 사용하기 Image Watch : Mat 객체를 영상의 형태로 보여주는 디버깅 툴 Visual Studio 에서 확장 - 확장 관리 - image watch 검색 후 install - Visual Studio 재시작 breakpoint 걸고 디버그 모드 시작 보기 - 다른 창 - Image Watch 확대하여 좌표위치의 픽셀값 확인 가능. 실시간 디버깅 가능. 2022. 8. 9.
OpenCV ] 에서 사용하는 주요 클래스들 (C++) 예제 코드 출처 : OpenCV 4로 배우는 컴퓨터 비전과 머신러닝 유용하게 사용되는 기본 자료형 클래스 Point_ : 2차원 정수 좌표계에서 점의 좌표를 표현하는 클래스는 Point2i 에서 다시 Point로 재정의 됨 Size_ : 사각형 영역의 가로 세로 크기를 나타내는 width와 height 멤버변수를 가지고 있음 Rect_ : 정수형 사각형 정보를 표현하는 Rect2i 는 다시 Rect 로 재정의됨. 정수형 멤버변수 x, y, width, height를 가지고 있으며 Rect rc(10,10,60,40); // (10,10) 좌표부터 그려지는 크기가 60x40인 사각형 RotatedRect : 회전된 사각형을 표현하는 클래스. 회전된 사각형의 중심점 좌표를 나타내는 center(Point2f.. 2022. 8. 9.
STM32 ] FreeRTOS + Semaphore ISR 사용 예제 추가설명 되지 않은 기타 설정은 이전 글과 동일하다. 2022.08.08 - [MCU/STM32 (ARM Cortex-M)] - STM32 ] FreeRTOS 사용해보기 STM32 ] FreeRTOS 사용해보기 정의 RTOS는 실시간 시스템을 위해 개발된 운영체제로, 멀티태스킹 환경에서 Task 처리시간을 일관되게 유지하기 위한 용도로 사용한다. RTOS는 시분할 시스템 하에서 우선순위 기반 스케줄링을 통 eteo.tistory.com 예제 코드 출처 : https://m.blog.naver.com/eziya76/220951244572 Mutex는 ISR(Interrupt Service Routine)에서 신호를 보내는게 불가능한데 세마포어는 ISR에서 신호를 보낼 수 있다. Task 중 세마포어를 대기.. 2022. 8. 8.
STM32 ] FreeRTOS 사용해보기 정의 RTOS는 실시간 시스템을 위해 개발된 운영체제로, 멀티태스킹 환경에서 Task 처리시간을 일관되게 유지하기 위한 용도로 사용한다. RTOS는 시분할 시스템 하에서 우선순위 기반 스케줄링을 통해 우선순위가 높은 task가 먼저 작업을 처리할 수 있게 함으로써 구현한다. 참고. 스케줄링 : 프로세스들에게 CPU 등 자원을 배정하는 것을 말함. 설정 Interface는 CMSIS_V2로 선택한다. CMSIS는 Cortex Microcontroller Software Interface Standard의 약자로 ARM Cortex 시리즈끼리의 호환성 및 이식성 증대를 위해 ARM사에서 정한 소프트웨어를 말한다. 그리고 CMSIS_RTOS 는 ARM사에서 RTOS의 API를 추상화해서 RTOS의 종류가 달라.. 2022. 8. 8.
OpenCV ] 환경설정 및 프로젝트 만들기 + 재사용을 위한 템플릿 내보내기 (C++) 1. 홈페이지 접속 후 다운로드 https://opencv.org/ 2. 압축 풀기 설치 후 폴더 구조 opencv-build-x64-vc15 폴더 내에 Visual Studio 2017/2019 용 OpenCV DLL파일, 유틸리티와 OpenCV LIB 파일이 있다. 3. 환경설정 내PC 오른쪽 클릭-속성-고급시스템 설정-고급 탭에서 환경변수 클릭 사용자 변수 새로 만들기 변수 이름 : OPENCV_DIR 값 : C:\opencv\build 사용자 변수 - PATH 환경변수 더블클릭 - 새로만들기 %OPENCV_DIR%\x64\vc15\bin 추가 cmd 창을 열어 확인 잘 추가 되었는지 확인 4. Visual Studio 에서 새 프로젝트 만들기 프로젝트 생성 OpenCV 라이브러리는 64비트로 빌드.. 2022. 8. 6.
STM32 ] Timer Input Capture 사용하여 PWM 신호 캡쳐하기 먼저 클락 설정 PWM 파형을 만들어 내기 위한 TIM1 설정 TIM1은 APB2에서 클락소스를 공급받는다. PSC와 ARR의 값을 위와 같이 설정해서 Frequency 를 50Hz로 맞춰줬다. 펄스폭은 소스코드 상에서 수정할거라 안건드렸다. 인풋캡처를 위한 TIM2 설정 TIM2은 APB1에서 클락소스를 공급받는다. PSC를 90-1로 해서 1us 업카운터로 설정한다. 인풋캡처 채널은 하나는 Rising Edge 하나는 Falling Edge로 설정한다. TIM2의 인터럽트 켜기 소스코드 /* USER CODE BEGIN PV */ int __io_putchar(int ch){ HAL_UART_Transmit(&huart3, &ch, 1, 1000); return ch; } /* USER CODE EN.. 2022. 7. 25.
STM32 ] 자율주행 코드 짜기 - 프로젝트 준비과정 (6) 먼저 GPS모듈을 통해 자동차의 위도, 경도를 확인하였고, 어플과의 블루투스 통신을 통해 사용자가 찍은 Waypoint(목적지)의 위도, 경도까지 확인할 수 있었다. 그리고 Waypoint의 위치에서 자동차의 위치를 빼주면 두 포인트 사이의 위도차, 경도차를 알 수 있고 직선거리로의 차이 c는 피타고라스의 정리에 의해 구할 수 있다. 다만 이건 평면 위에서의 거리이고 구 위에서의 거리는 하버사인공식(Haversine Formular)로 구할 수 있는데 어차피 우리는 블루투스 모듈의 통신거리 한계로 테스트 환경이 좁은 지역 안에서 해야하기 때문에 그냥 피타고라스의 정리를 사용하기로 하였다. 다음은 방위각. 지자기센서를 통해 자동차의 방위각은 알아낼 수 있다. Waypoint의 방위각이 문제인데 문과생으로서.. 2022. 7. 25.
STM32 ] SPI 통신 사용하기 SPI : Serial Peripheral Interface 동기식, 전이중 통신이며 마스터와 슬레이브 모드로 동작한다. 최대 클럭이 제한되어 있지 않아 속도 제한이 없어 I2C보다 훨씬 빠르다. 기본은 SCLK, MOSI, MISO, CS 4개의 선이 필요한데 많은 베리에이션이 있다. 1:1 통신시 SCLK (Serial Clock) : 마스터가 출력하는 동기용 Clock 라인 MOSI (Master Output Slave Input) : 마스터 출력, 슬레이브 입력. SDI 로도 표기 된다. MISO (Master Input Slave Output) : 슬레이브 출력, 마스터 입력. SDO 로도 표기 된다. CS (Chip Select) : 마스터가 어떤 슬레이브와 통신할 지 선택할 때 사용하는 선... 2022. 7. 24.
STM32 ] TIMER OC (Output Compare 단자 출력) 사용 예제 OC : 출력비교 모드는 카운터(CNT)의 값이 캡쳐/비교기에 설정된 (CCRx)값과 일치할 때 인터럽트 또는 해당 핀에 출력을 발생시키는 모드이다. 이전에 이어서 타이머 OC 모드에서 핀의 출력을 사용하는 버전이다. 핀 출력을 쓰는 모드로 설정했기 때문에 핀이 잡힌다. PSC를 9000-1로 해서 10KHz로 분주하고 ARR은 16비트 카운터 타이머의 최대값인 0xffff-1로 한다. 이렇게 하면 업데이트 인터럽트가 6.5535초 마다 발생할 거다 하지만 업데이트 인터럽트는 안쓴다. 모든채널을 OC 인터럽트 발생시 출력이 토글되게끔 설정하고 CCR값은 위와 같이 설정한다. 소스코드 /* USER CODE BEGIN 2 */ HAL_TIM_OC_Start_IT(&htim3, TIM_CHANNEL_1); .. 2022. 7. 21.
STM32 ] TIMER OC (Output Compare No Output) 사용 예제 OC : 출력비교 모드는 카운터(CNT)의 값이 캡쳐/비교기에 설정된 (CCRx)값과 일치할 때 인터럽트 또는 해당 핀에 출력을 발생시키는 모드이다. TIM4 의 업 카운터와 OC(출력비교) 모드를 이용하여 LED On/Off 하는 예제 1. 타이머의 Frequency를 1Hz로 맞춰서 업데이트 인터럽트를 발생 시 HAL_TIM_PeriodElapsedCallback 에서 LED를 On 시킴 2. OC 모드에서 CCR값과 CNT의 값이 일치할 때 출력비교 인터럽트(CCxI)가 발생하고 HAL_TIM_OC_DelayElapsedCallback 함수에서 LED를 Off 시킴 3. 스위치 1~4 의 EXTI 인터럽트 발생시 HAL_GPIO_EXTI_Callback 함수에서 CCR값을 변경시킴 호환보드에 대한 .. 2022. 7. 21.
STM32 ] 어플과 STM32간 블루투스 통신을 통한 데이터 송수신 - 프로젝트 준비과정 (5) 어플 화면 SCAN 버튼을 눌러 블루투스 페어링 합니다. Control을 누르면 아래 버튼을 사용해 수동제어를 할 수 있고, Waypoint 버튼을 누른 뒤 어플 지도상의 파란색 마커(Waypoint)를 찍으면 해당 위치로 자율주행을 시작합니다. bluetooth.c 중 일부 void BT_Init() { HAL_UART_Receive_IT(&huart7, &rx7_data, sizeof(rx7_data)); } void transmit_To_Phone(){ char buf[GPSBUFSIZE] = {0,}; sprintf(buf, "A,%.13f\n\r", GPS.dec_latitude); //HAL_UART_Transmit(&huart3, (unsigned char *)buf, strlen(buf),.. 2022. 7. 19.
STM32 ] BLDC 모터 제어 - 프로젝트 준비과정 (4) BLDC 모터 제어와 앱인벤터를 통한 앱개발은 팀 동료가 담당한 분야이긴 하나 프로젝트 전체 이해도 향상을 위해 개인적으로 정리한 내용과 동료의 자료를 첨부합니다. DC모터 Brushed DC 모터는 2개의 전선으로만 구성되어 있으며 전동기를 구동시키기 위한 드라이버의 설계 및 제어가 용이하다는 장점이 있지만, Brush의 접촉을 통해서 회전에 따라 전기자 전류의 극성이 바뀌게 되므로, 기계적 소음과 전기적 잡음이 심하며 내구성이 떨어진다. 반면, BLDC 모터는 Brush가 제거된 형태로, 3상 모터의 6단계 정류(모터 위상의 전류를 전환하여 동작을 생성하는 공정) 패턴을 생성하기 위해 3개의 전선이 필요하며, 모터 컨트롤러가 사용된다. 이러한 6단계 정류 위상이 전자기장을 움직이면 영구 자석(회전자).. 2022. 7. 19.
STM32 ] 초음파 센서로 거리재기 Timer Input Capture 사용 + 노이즈 (튀는 값) 제거 참고 사이트 : https://controllerstech.com/hcsr04-ultrasonic-sensor-and-stm32/ 참고 유튜브 : https://www.youtube.com/watch?v=ti_1ZwRolU4 배선 HC-SR04 VCC 5V GND GND Trig PA5 (GPIO Output) Echo PA6 (TIM3 CH1 Input Capture) Cube MX 설정 TIM3은 APB1 클락소스(90MHz)를 공급받는다. 그리고 Prescaler 값을 90-1 로 해주면 1us(마이크로초) 마다 CNT가 오른다. 그리고 TIM3은 16비트 카운터라서 ARR은 최대값인 0xffff-1로 해준다. + UART3 설정도 켠다 소스코드 /* USER CODE BEGIN PD */ #def.. 2022. 7. 18.
STM32 ] DAC 제어 (오실로스코프로 파형 확인) DAC : Digital to Analog Converter 디지털 신호를 아날로그 전압 신호로 변환하여 출력하는 장치를 말한다. STM32F429 보드는 2채널의 12비트 DAC 컨버터가 있고 DAC CHANNEL_1의 출력핀은 PA4 (DAC_OUT1) DAC CHANNEL_2의 출력핀은 PA5 (DAC_OUT2) 으로 정해져있다. 1.8v ~Vdda(3.3V) 사이의 별도의 Vref+ 기준전압을 따로 사용할 수도 있고 타이머의 TRGO (트리거 아웃풋)을 사용하는 것도 가능하다. DHR에 로드된 데이터는 ABP1 1클럭 사이클 후 DOR 레지스터로 전송되고 데이터가 DOR 레지스터에 로드되면 DAC변환이 시작되어, t(SETTING) 시간 후 DAC_OUT pin을 통해 아날로그 값이 출력된다. D.. 2022. 7. 18.
STM32 ] ADC + MFC + MySQL, 시리얼 통신 및 DB연동, 검색기능, 실시간 그래프 구현 (쓰레드 사용) 깃허브 주소 : https://github.com/joeteo/MfcDbAdc GitHub - joeteo/MfcDbAdc Contribute to joeteo/MfcDbAdc development by creating an account on GitHub. github.com https://github.com/joeteo/AdcMfcDb.git GitHub - joeteo/AdcMfcDb Contribute to joeteo/AdcMfcDb development by creating an account on GitHub. github.com 핀설정 가변저항의 VCC, GND는 보드의 +3.3v, GND 에 연결 OUT핀은 아래 ADC 핀에 연결 ADC 설정. DMA 모드를 사용하였다. STM32 whi.. 2022. 7. 17.
MFC ] 시리얼 통신으로 LED 제어하기 (3) + MySQL (IoT) STM32 → UART 수신 인터럽트로 '1'이 들어오면 LED를 켜고 '0'이 들어오면 LED를 끈다. MFC → 외부 DB에 접속해 '1' 또는 '0'이 들어있는 1행1열의 테이블을 타이머를 사용해서 0.5초 간격으로 읽어오고 해당 값을 STM32에 시리얼 통신으로 송신한다. STM32 수신 인터럽트 부분 /* USER CODE BEGIN 4 */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART3){ if(rx=='1'){ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, 1); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, 1); HAL_GPIO_WritePi.. 2022. 7. 17.
MFC ] 실시간 그래프 그리는 법 Real-Time-Chart sin, cos, tan 그래프를 10ms 마다 그리는 예제파일 다이얼로그의 Picture Control을 아이디 IDC_STATIC_RT_GRAPH 로 추가하고 위치와 크기를 맞춘다. 다이얼로그의 -Dlg.h 파일에서 OScopeCtrl.h 파일을 include 하고 COScopeCtrl 컨트롤의 객체 포인터 _rtGraph를 선언해 둔다. // COScopeCtrl의 헤더 파일 인클루드 #include "OScopeCtrl.h" ... class *Dlg : public CDialog { ... // COScopeCtrl 컨트롤의 객체 포인터를 선언 COScopeCtrl *_rtGraph; ... }; onInitDialog() 함수에서는 IDC_STATIC_RT_GRAPH 컨트롤의 위치와 크기를 얻.. 2022. 7. 17.