본문 바로가기

STM32CubeIDE22

STM32CubeIDE 등 Eclipse 기반 IDE 에서 Ctrl + / 등 단축키 안먹힐 때 혹시 한컴 입력기로 바뀌었다 확인해본다. 아예 삭제하는 방법 위의 사진에서 '언어 기본 설정'을 누른다. 한국어 - 옵션 클릭 한컴입력기 클릭하고 제거 2023. 4. 16.
Eclipse 기반 IDE에서 Code Formatter 설정하기 STM32CubeIDE 자동생성 코드의 tabsize는 2칸인데 디폴트 Formatter의 tabsize는 4칸이라 안맞아서 수정해 줄 필요가 있다. Window > Preferences > C/C++ > Code Style > Formatter New를 클릭해 built-in profile을 base로 해서 커스텀 profile을 생성할 수 있다. 가장 많이 사용하는게 K&R 아니면 BSD인 것 같은데 둘의 대표적 차이는 K&R은 중괄호를 same line에서 시작하고 BSD는 next line에서 시작한다는 점이다. // K&R if (isRunning) { // do something } // BSD if (isRunning) { // do something } 지금은 BSD에서 tab size를 .. 2023. 4. 14.
STM32 ] PWM Edge-aligned mode(UP/DOWN), Center-aligned mode PWM mode 1 or PWM mode 2 일 때 파형 오실로스코프로 확인 Clock configuration TIM3, Channel 3, PB0핀 사용 100Hz 설정 테스트용 소스코드 UP 카운터 PWM mode 1 UP 카운터 PWM mode 2 DOWN 카운터 PWM mode 1 DOWN 카운터 PWM mode 2 지금 파라미터 세팅이 100Hz에 ARR값은 100-1인데 Center-aligned Mode일 땐 0부터 99까지 카운트하고 다시 1까지 돌아오는게 한 주기 니까 주기는 업 또는 다운 카운터일때에 비해 2배인 20ms이고 주파수는 절반인 50Hz가 오실로스코프에 찍인다. UP/DOWN 카운터 PWM mode 1 UP/DOWN 카운터 PWM mode 2 2022. 6. 29.
STM32 ] 블루투스 모듈 MLT-BT05 사용하기 / 메시지 주고받기 , AT 커맨드 USART3 핀 설정 USART2 핀, 블루투스 모듈에 연결 보드-PC간 보드레이트 115200bps 블루투스-보드간 보드레이트 9600bps MLT-BT05 4.0 모듈의 공장출고 시 default 보드레이트가 9600bps이다. 둘다 NVIC Settings에서 인터럽트를 켜준다. 일단 전역변수 선언 구간에 따로 uart 데이터를 받을 변수를 선언해준다. /* USER CODE BEGIN PV */ uint8_t rx3_data; uint8_t rx2_data; /* USER CODE END PV */ USER CODE BEGIN 2 에서 인터럽트를 enable 한다. /* USER CODE BEGIN 2 */ HAL_UART_Receive_IT(&huart3, &rx3_data, sizeof(rx3.. 2022. 6. 19.
STM32 ] RTC 와 LCD 모듈을 사용한 알람시계 구현 (2) - 더블클릭 기능 추가 일단 한번 클릭한 것과 2초 이상 클릭한 것과 구별되어 더블클릭이 아주 잘 인식된다. 더블클릭한 경우 벨소리 선택모드로 넘어가게 끔 하고 벨소리 선택모드에서 한번 클릭하면 다시 노멀모드로 돌아오게끔 했다. 핵심코드 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_13){ if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)){ user_pulled_flag=0; user_pressed_flag=1; old_tick=HAL_GetTick(); current_tick=HAL_GetTick(); if(mode==NORMAL){ interval_chk[0]= HAL_GetTick(); interval=interv.. 2022. 6. 19.
STM32 , UART 통신으로 4 digit 7 segment FND 실시간 제어하기 2편 커맨드 조건 [0x02] [CMD] [DATANUM] [DATA] [CHECKSUM] [0x03] 1. CMD - ‘LED’ - ‘FND’ 2. DATANUM : 2바이트 [DATA] 길이 3. DATA : 가변 - ‘LED’ : DATANUM = 2 [LEDNUM][STATE] 예) ‘01’ - 1번 LED ON ‘10’ - 2번 LED OFF - ‘FND’ : DATANUM = 4 [DISPCOUNT] 예) ‘1234’ ‘4567’ 4.CHECKSUM : 1바이트 - CHECKSUM = CMD + DATANUM + DATA 5. Example - [0x02] [‘LED’] [‘02’] [‘01’] [CHECKSUM] [0x03] - [0x02] [‘FND’] [‘04’] [‘1234’] [CHECKS.. 2022. 6. 18.
STM32 ] Timer 인터럽트를 사용하여 ADC 값 받기 + 그래프 보면서 디버깅하는 팁 ADC : Analogue to Digital Converter, 아날로그 신호를 디지털 신호로 변환하는 것으로 샘플링(Sampling), 양자화(Quantizing), 부호화(Coding) 과정을 거친다. 샘플링 : 아날로그 파형을 디지털 형태로 변환하기 위해 표본을 취하는 것 양자화 : 표본화된 각 점을 어느 정도 resolution 으로 표현할지 정해 변환하는 것. 예를들어 8비트면 256단계로 세분화 부호화 : 앞의 단계를 거친 디지털 정보를 2진수로 표현하는 것 ADC를 인터럽트방식으로 사용하면 끊임없이 인터럽트가 트리거되어 다른 부분에 문제를 일으킨다. Timer 인터럽트와 ADC 폴링방식을 사용하여 ADC의 샘플링 주기를 조절하는 방법을 소개한다. 먼저 테스트를 위해 사용할 것은 아두이노에 .. 2022. 6. 17.
STM32 ] RTC 와 LCD 모듈을 사용한 알람시계 구현 (1) 처음 실행시 타임세팅 모드. 업/다운/라이트/레프트 버튼으로 시간 설정. 00분에서 다운버튼 누르면 59분, 59분에서 업버튼 누르면 00분으로 변함. 해당부분 할 드라이버 매크로함수 사용하였음 시간설정 후 유저버튼 한번 누르면 노멀모드 진입하고 시계 돌아감. 노멀 모드에서 유저버튼을 2초이상 누르고 있으면 바로 알람세팅 모드 진입 현재시간에서 커서가 깜빡거리고 버튼으로 알람시간을 설정한 후 유저버튼을 한번 누르면 다시 노멀모드로 돌아온다. 영상은 10초 뒤로 알람맞춘것. 알람설정 시간인 PM 02:25:26 가 되면 "삐삐삐삐" 하면서 알람이 울리는데 소리가 작아서 키워야 들린다. 알람울리는 중간에 mute interval을 주는 건 HAL_Delay를 사용하지 않았기 때문에 알람이 울리는 중간에도 시.. 2022. 6. 11.
STM32 ] RTC , GetTime / GetDate 함수로 시간 값 확인 시 주의사항 HAL_RTC_GetTime 함수를 따라 들어가보면 다음과 같은 주의사항이 나온다. 반드시 HAL_RTC_GetTime() 함수를 사용한 뒤에 HAL_RTC_GetDate() 를 호출해주어야 한다. 예를 들면, HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN); HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN); 이렇게 해야지. 반대순서로 호출하면 오류가 난다. 그리고 시계를 만들기 위해 시간만 필요하다고 해서 RTC_DateTypeDef 변수를 안만들고 HAL_RTC_GetDate()을 안해줘도 오류가 난다. 둘은 항상 세트로 호출해야 된다고 생각하자. 2022. 6. 11.
STM32 , printf 디버깅에 사용 & 변수 값 그래프로 출력하기 2편 ( SWV / ITM ) 이번엔 SWV (Serial Wire Viewer) / ITM (Instrumentation Trace Macrocell 를 통한 printf 사용방법에 대해 소개한다. 이전글 참고 : 2022.06.06 - [MCU/STM32 (ARM Cortex-M)] - STM32 , printf 디버깅에 사용하기 1편 ( UART 통신 ) 1. CubeMX에서 클락설정 먼저 해준다. 2. 표준입출력 헤더파일을 포함한다. /* USER CODE BEGIN Includes */ #include /* USER CODE END Includes */ 3. _write 함수를 ITM에 리다이렉션하는 것으로 재정의 해준다. /* USER CODE BEGIN PFP */ int _write(int file, char* p, i.. 2022. 6. 6.
STM32 , printf 디버깅에 사용하기 1편 ( UART 통신 ) STM32CubeIDE에서는 표준출력함수인 printf 를 사용하기 위해서는 표준 출력 대상인 콘솔창이 없으니 리다이렉션하여 써야하는데 이번엔 그 중 UART를 통해 printf 함수를 쓰는 방법을 소개한다. SWV / ITM 통해 printf 사용하는 버전 링크 : 2022.06.06 - [MCU/STM32 (ARM Cortex-M)] - STM32 , printf 디버깅에 사용 & 변수 값 그래프로 출력하기 2편 ( SWV / ITM ) 1. 먼저 CubeMX에서 UART 설정을 해준다. 2. 코드에 표준입출력 헤더파일을 포함한다. /* USER CODE BEGIN Includes */ #include /* USER CODE END Includes */ 3. main함수 들어가기전에 _write 함수.. 2022. 6. 6.
STM32 , I2C 통신 오실로스코프로 확인하기 I2C Inter-Integrated Circuit의 약자, 아이투씨 또는 아이스퀘어씨라고 읽음 Data선(SDA)과 Clock선(SCL) 2개로만 통신이 가능 통신속도는 표준모드에서 100KHz, Fast모드에서 400KHz로 비교적 저속이라 GPIO로도 구현가능하다. (내가 사용하는 보드에는 3개의 I2C컨트롤러가 내장되어 있다. 하지만 GPIO로 굳이 구현한다면 마스터는 GPIO output, 슬레이브는 GPIO input으로 설정하면 된다.) 아래 사진과 같이 SDA, SCL 라인에 여러 디바이스가 연결될 수 있다. SDA, SCL 라인은 각각 풀업저항으로 연결되어있어 통신을 하지 않을 때는 HIGH 상태를 유지하고 하나의 마스터가 통신을 시작하면 LOW레벨로 떨어진다. 버스에 물려있는 누구나 마.. 2022. 6. 6.
STM32CubeIDE , 프로젝트 복사 붙여넣기 하는법 / clone or duplicate a project for reuse STM32CubeIDE 에서는 프로젝트를 복붙해 재사용하는 방법 그냥 아무렇게나 복붙했다가는 오류가 나서 컴파일이 안되거나 혹은 복사한 프로젝트를 수정했는데 원본까지 같이 수정되는 경우가 생긴다. copy 라는 프로젝트를 복사해 paste 라는 프로젝트명으로 재사용 해본다. 카피할 프로젝트 우클릭 - Copy Project Explorer 빈 곳 우클릭 - Paste 프로젝트명을 써주고 Location 위치도 직접 써준다. 프로젝트를 저장하는 곳은 아래 STM32CubeIDE의 기본 workspace 외 다른곳을 사용하는 것이 좋다. C:\Users\[user_name]\STM32CubeIDE\workspace_1.10.1 .ioc 파일을 프로젝트명과 동일하게 수정해준다. Debug 폴더와 -Debug... 2022. 6. 4.
STM32 , UART 통신으로 4 digit 7 segment FND 실시간 제어하기 1편 ( 2가지 방법 ) UART 수신 인터럽트를 통한 4자리의 FND 실시간 제어 명령어 예시 FND38 : 3번째 FND에 숫자 8을 켠다. FNDA4 : 모든 FND를 4로 켠다. FND4X : 0-9 값이 아닌 다른 값을 입력하면 4번째 FND가 꺼진다. 이 글에 나오는 다른 함수는 이전글과 동일하다. 이전글 : 2022.06.02 - [MCU/STM32 (ARM Cortex-M)] - STM32 , 74HC595 시프트 레지스터로 FND 제어하기 , 카운터 / 시계 ( SysTick 타이머 사용) 테라텀 설정 New connection으로 포트를 제대로 잡은 후 보드레이트 115200으로 잡아주고 Setup - Terminal 설정에서 new-line 시 라인피드(\n)가 전송될 수 있도록 하고 내가 터미널에 친 글자가.. 2022. 6. 3.
STM32 , 74HC595 시프트 레지스터로 FND 제어하기 , 카운터 / 시계 ( SysTick 타이머 사용) 시프트 레지스터 두개로 4개의 FND를 제어할 수 있는 아두이노 호환보드를 사용하여 카운터 및 시계를 만들어 보겠습니다. 0부터 9999 까지 세는 카운터 시계, 왼쪽 두자리가 분이고 오른쪽 두자리가 초 확장보드의 회로도 직렬입력-병렬출력 시프트레지스터인 74595칩이 두 개가 달렸다. 왼쪽 칩의 SDI가 아두이노 8번핀과 연결되어 있고 Shift Clock 과 Latch Clock은 각각 7번핀 4번핀에서 두 칩에 동시에 들어간다. FND에 표시할 숫자를 결정하는 부분은 오른쪽 74595 칩이고 그 숫자를 4개중에 어디에 표시할 지는 왼쪽 74595 칩에 의해 결정된다. 예를 들어 왼쪽 74595칩의 QA, QB, QC, QD가 모두 HIGH라면 같은 숫자가 들어간다. 그리고 delay 없이 1번, 2.. 2022. 6. 2.
STM32 프로젝트 , 팩맨 게임 ( ADC in DMA mode 로 조이스틱 이용한 방향제어 , I2C LCD , Timer 인터럽트 및 PWM 사용 ) 개인 프로젝트제작기간 : 3일보드 : STM32F429ZITool : STM32CubeIDE I2C LCD 모듈, 조이스틱, 수동부저 사용  https://github.com/joeteo/Pacman GitHub - joeteo/Pacman: STM32 Pacman game with LCD and JoystickSTM32 Pacman game with LCD and Joystick. Contribute to joeteo/Pacman development by creating an account on GitHub.github.com        회로도핀 연결과 설정은 아래표를 참고해주세요. I2C interface 16x2 LCDGNDGNDVCC5VSCLSCL (PB8)SDASDA (PB9)     Dua.. 2022. 5. 31.
WinMerge 텍스트 및 파일 비교 프로그램 (무료) 무료 텍스트 및 파일 비교툴 WinMerge 다운로드 링크 : https://winmerge.org/downloads/?lang=en Download WinMerge - WinMerge Download WinMerge The easiest way to install WinMerge is to download and run the Installer. Read the online manual for help using it. WinMerge 2.16.20 The current WinMerge version is 2.16.20 and was released at 2022-04-27. For detailed info on what is new, winmerge.org 설치 후 폴더 단위로 두 폴더를 선택 후 오.. 2022. 5. 27.
STM32 , UART 통신 ( 수신 ) 을 이용한 PWM 서보모터 ( SG90 ) 제어 + 펄스폭 찾아내는 팁 UART 설정 USART3을 비동기식으로 켜준다. Parameter는 디폴트로 놔두고 폴링방식을 사용할거면 NVIC 세팅을 켜주지 않아도 된다. 만약 MCU/MPU Selector로 시작했다면 보드매뉴얼을 보고 핀도 제대로 잡아주어야 한다. Timer 설정 클락설정은 아래와 같다. Timer 의 클락이 어떤 버스에서 제공되는지는 datasheet 20페이지의 블록 다이어그램을 보면 알 수 있다. 내가 사용할 TIM2가 쓰는 클락은 APB1이다. Internal Clock 소스로 설정해주고 PWM Generation CH1을 선택해준다. TIM2, PWM CH1에 어떤핀이 연결되어 있는지는 보드매뉴얼을 보고 알 수 있다. Board Selector 를 선택했다면 MX툴에서 그냥 채널 활성화 시키면 해당핀이.. 2022. 5. 26.
STM32 , Timer Interrupt 타이머 인터럽트 사용하기 (TIM2) 이전의 동기식 / 비동기식 카운터 프로그래밍으로 구현하기 글에서 이어진다. 2022.05.23 - [MCU/STM32 (ARM Cortex-M)] - STM32 , 동기식 / 비동기식 카운터 프로그래밍으로 구현하기 ( + Timer 사용 방법 ) STM32 , 동기식 / 비동기식 카운터 프로그래밍으로 구현하기 ( + Timer 사용 방법 ) 4비트 상향 카운터 4비트 하향 카운터 main.h 먼저 main.h 에 플립플롭에 필요한 변수들을 묶어 구조체로 정의해주었다. 함수에 매개변수를 여러개 둘 필요없이 보다 간략하게 짤 수 있다. /* USER CODE eteo.tistory.com 프로젝트 파일은 위 글 똑같고 while문 내에서 지역변수를 토글시키며 HAL_Delay(500) 한 이전버전과 달리 T.. 2022. 5. 25.
STM32 , 디지털 금고 프로그래밍으로 구현 ( 시프트 레지스터 응용 ) 시프트 레지스터를 응용한 디지털 금고를 프로그래밍으로 구현하였습니다. 올바른 비밀번호인 3190을 순서대로 입력하면 LED가 오른쪽 왼쪽으로 번갈아 이동하면서 켜지고, 틀린 번호를 입력하면 LED가 깜빡이면서 초기화 되서 다시 입력해야 합니다. 버튼 3, 1, 9, 0 은 PG0-3 과 연결해두었고 버튼 2, 4, 5, 6, 7, 8 은 PC7-12 와 연결해두었다. LED는 PD0-5 이다. D 플립플롭은 입력과 출력이 버퍼와 마찬가지이다. 시프트 레지스터라서 처음 입력이 1으로 고정이고 각 플립플롭의 출력 Qa, Qb, Qc, Qd의 값은 0으로 초기화된 상태에서 시작하기 때문에 올바른 순서대로 클락펄스를 주어야 비트 1이 이동한다. 소스코드 /* USER CODE BEGIN PFP */ void J.. 2022. 5. 24.
STM32 , 동기식 / 비동기식 상향/ 하향 카운터 프로그래밍으로 구현하기 ( JK 플립플롭 , IC 7490 / 7492 ) 4비트 상향 카운터 4비트 하향 카운터 main.h 먼저 main.h 에 플립플롭에 필요한 변수들을 묶어 구조체로 정의해주었다. 함수에 매개변수를 여러개 둘 필요없이 보다 간략하게 짤 수 있다. /* USER CODE BEGIN Private defines */ typedef struct { uint8_t clockbefore; uint8_t Q; uint8_t Qbar; }JKFF; /* USER CODE END Private defines */ 사실 하드웨어의 동작과 달리 여기서 Qbar의 역할은 없는데 그냥 넣었다. main.c 뒤에 나오는 memset 함수 사용을 위해 string.h 를 포함해주었다. /* USER CODE BEGIN Includes */ #include /* USER CODE .. 2022. 5. 23.
STM32 , 외부 인터럽트 ( EXTI ) 사용하기 EXTI는 External Interrupt의 약자로 인터럽트 Interrupt란 CPU(프로세스)가 프로그램을 실행하고 있을 때 입출력 하드웨어 등의 장치 등에서 예외상항이 발생하여 처리가 필요한 경우 프로세서에게 알려 처리할 수 있도록 하는 기능이다. 결과물 첫번째 스위치를 누르면 오른쪽으로 점멸하며 이동 두번째 스위치를 누르면 왼쪽으로 점멸하며 이동 세번째 스위치를 누르면 전체 점등 네번째 스위치를 누르면 전체 꺼짐 STM32F42시리즈는 다음과 같은 EXTI 구조를 가지고 있다. 각각의 PA0~PH0 핀이 EXTI0 에 연결되고 PA1~PH1이 EXTI1에 연결되는 식이다. 따라서 PD0번과 PC0번을 동시에 EXTI 용도로 설정할 수 없다. 위 사진에 보이듯이 EXTI0 - EXIT4 는 개별 .. 2022. 5. 22.